diff --git a/Cargo.lock b/Cargo.lock index 6f228d2de..9cac9d852 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -43,18 +43,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android_log-sys" @@ -70,47 +70,48 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -118,30 +119,35 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" + +[[package]] +name = "as-any" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5b8a30a44e99a1c83ccb2a6298c563c888952a1c9134953db26876528f84c93a" [[package]] name = "async-channel" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +checksum = "9f2776ead772134d55b62dd45e59a79e21612d85d0af729b8b7d3967d601a62a" dependencies = [ "concurrent-queue", - "event-listener 5.0.0", - "event-listener-strategy 0.5.0", + "event-listener", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" dependencies = [ - "async-lock", "async-task", "concurrent-queue", "fastrand", @@ -149,54 +155,43 @@ dependencies = [ "slab", ] -[[package]] -name = "async-lock" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" -dependencies = [ - "event-listener 4.0.2", - "event-listener-strategy 0.4.0", - "pin-project-lite", -] - [[package]] name = "async-recursion" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "azalea" -version = "0.9.0" +version = "0.10.1" dependencies = [ "anyhow", "async-trait", @@ -236,7 +231,7 @@ dependencies = [ [[package]] name = "azalea-auth" -version = "0.9.0" +version = "0.10.1" dependencies = [ "azalea-buf", "azalea-crypto", @@ -258,7 +253,7 @@ dependencies = [ [[package]] name = "azalea-block" -version = "0.9.0" +version = "0.10.0" dependencies = [ "azalea-block-macros", "azalea-buf", @@ -267,25 +262,27 @@ dependencies = [ [[package]] name = "azalea-block-macros" -version = "0.9.0" +version = "0.10.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "azalea-brigadier" -version = "0.9.0" +version = "0.10.0" dependencies = [ "azalea-buf", "azalea-chat", + "bevy_app", + "bevy_ecs", "parking_lot", ] [[package]] name = "azalea-buf" -version = "0.9.0" +version = "0.10.1" dependencies = [ "azalea-buf-macros", "byteorder", @@ -298,16 +295,16 @@ dependencies = [ [[package]] name = "azalea-buf-macros" -version = "0.9.0" +version = "0.10.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "azalea-chat" -version = "0.9.0" +version = "0.10.1" dependencies = [ "azalea-buf", "azalea-language", @@ -321,7 +318,7 @@ dependencies = [ [[package]] name = "azalea-client" -version = "0.9.0" +version = "0.10.1" dependencies = [ "anyhow", "async-trait", @@ -361,10 +358,9 @@ dependencies = [ [[package]] name = "azalea-core" -version = "0.9.0" +version = "0.10.0" dependencies = [ "azalea-buf", - "azalea-inventory", "azalea-registry", "bevy_ecs", "nohash-hasher", @@ -378,7 +374,7 @@ dependencies = [ [[package]] name = "azalea-crypto" -version = "0.9.0" +version = "0.10.0" dependencies = [ "aes", "azalea-buf", @@ -395,7 +391,7 @@ dependencies = [ [[package]] name = "azalea-entity" -version = "0.9.0" +version = "0.10.1" dependencies = [ "azalea-block", "azalea-buf", @@ -418,26 +414,29 @@ dependencies = [ [[package]] name = "azalea-inventory" -version = "0.9.0" +version = "0.10.1" dependencies = [ "azalea-buf", + "azalea-chat", + "azalea-core", "azalea-inventory-macros", "azalea-registry", "simdnbt", + "uuid", ] [[package]] name = "azalea-inventory-macros" -version = "0.9.0" +version = "0.10.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "azalea-language" -version = "0.9.0" +version = "0.10.0" dependencies = [ "once_cell", "serde", @@ -446,7 +445,7 @@ dependencies = [ [[package]] name = "azalea-physics" -version = "0.9.0" +version = "0.10.0" dependencies = [ "azalea-block", "azalea-core", @@ -467,7 +466,7 @@ dependencies = [ [[package]] name = "azalea-protocol" -version = "0.9.0" +version = "0.10.1" dependencies = [ "anyhow", "async-recursion", @@ -495,6 +494,7 @@ dependencies = [ "serde", "serde_json", "simdnbt", + "socks5-impl", "thiserror", "tokio", "tokio-util", @@ -506,16 +506,16 @@ dependencies = [ [[package]] name = "azalea-protocol-macros" -version = "0.9.0" +version = "0.10.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "azalea-registry" -version = "0.9.0" +version = "0.10.0" dependencies = [ "azalea-buf", "azalea-registry-macros", @@ -525,22 +525,21 @@ dependencies = [ [[package]] name = "azalea-registry-macros" -version = "0.9.0" +version = "0.10.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "azalea-world" -version = "0.9.0" +version = "0.10.1" dependencies = [ "azalea-block", "azalea-buf", "azalea-client", "azalea-core", - "azalea-inventory", "azalea-registry", "bevy_ecs", "criterion", @@ -559,9 +558,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -574,9 +573,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -586,9 +585,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bevy_app" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bce3544afc010ffed39c136f6d5a9322d20d38df1394d468ba9106caa0434cb" +checksum = "ab348a32e46d21c5d61794294a92d415a770d26c7ba8951830b127b40b53ccc4" dependencies = [ "bevy_derive", "bevy_ecs", @@ -602,20 +601,20 @@ dependencies = [ [[package]] name = "bevy_derive" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028ae2a34678055185d7f1beebb1ebe6a8dcf3733e139e4ee1383a7f29ae8ba6" +checksum = "f0e01f8343f391e2d6a63b368b82fb5b252ed43c8713fc87f9a8f2d59407dd00" dependencies = [ "bevy_macro_utils", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "bevy_ecs" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b85406d5febbbdbcac4444ef61cd9a816f2f025ed692a3fc5439a32153070304" +checksum = "98e612a8e7962ead849e370f3a7e972b88df879ced05cd9dad6a0286d14650cf" dependencies = [ "async-channel", "bevy_ecs_macros", @@ -633,21 +632,21 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3ce4b65d7c5f1990e729df75cec2ea6e2241b4a0c37b31c281a04c59c11b7b" +checksum = "807b5106c3410e58f4f523b55ea3c071e2a09e31e9510f3c22021c6a04732b5b" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "bevy_log" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd5bcc3531f8008897fb03cc8751b86d0d29ef94f8fd38b422f9603b7ae80d0" +checksum = "a5eea6c527fd828b7fef8d0f518167f27f405b904a16f227b644687d3f46a809" dependencies = [ "android_log-sys", "bevy_app", @@ -661,22 +660,22 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac4401c25b197e7c1455a4875a90b61bba047a9e8d290ce029082c818ab1a21c" +checksum = "eb270c98a96243b29465139ed10bda2f675d00a11904f6588a5f7fc4774119c7" dependencies = [ "proc-macro2", "quote", "rustc-hash", - "syn 2.0.49", + "syn 2.0.63", "toml_edit", ] [[package]] name = "bevy_math" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f312b1b8aa6d3965b65040b08e33efac030db3071f20b44f9da9c4c3dfcaf76" +checksum = "f06daa26ffb82d90ba772256c0ba286f6c305c392f6976c9822717974805837c" dependencies = [ "glam", "serde", @@ -684,15 +683,15 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86afa4a88ee06b10fe1e6f28a796ba2eedd16804717cbbb911df0cbb0cd6677b" +checksum = "8050e2869fe341db6874203b5a01ff12673807a2c7c80cb829f6c7bea6997268" [[package]] name = "bevy_reflect" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133dfab8d403d0575eeed9084e85780bbb449dcf75dd687448439117789b40a2" +checksum = "ccbd7de21d586457a340a0962ad0747dc5098ff925eb6b27a918c4bdd8252f7b" dependencies = [ "bevy_math", "bevy_ptr", @@ -708,22 +707,22 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1679a4dfdb2c9ff24ca590914c3cec119d7c9e1b56fa637776913acc030386" +checksum = "3ce33051bd49036d4a5a62aa3f2068672ec55f3ebe92aa0d003a341f15cc37ac" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", "uuid", ] [[package]] name = "bevy_tasks" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b20f243f6fc4c4ba10c2dbff891e947ddae947bb20b263f43e023558b35294bd" +checksum = "f07fcc4969b357de143509925b39c9a2c56eaa8750828d97f319ca9ed41897cb" dependencies = [ "async-channel", "async-executor", @@ -735,9 +734,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9738901b6b251d2c9250542af7002d6f671401fc3b74504682697c5ec822f210" +checksum = "38ea5ae9fe7f56f555dbb05a88d34931907873e3f0c7dc426591839eef72fe3e" dependencies = [ "bevy_app", "bevy_ecs", @@ -749,14 +748,14 @@ dependencies = [ [[package]] name = "bevy_utils" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a06aca1c1863606416b892f4c79e300dbc6211b6690953269051a431c2cca0" +checksum = "5a9f845a985c00e0ee8dc2d8af3f417be925fb52aad4bda5b96e2e58a2b4d2eb" dependencies = [ "ahash", "bevy_utils_proc_macros", "getrandom", - "hashbrown 0.14.3", + "hashbrown", "nonmax", "petgraph", "smallvec", @@ -768,26 +767,20 @@ dependencies = [ [[package]] name = "bevy_utils_proc_macros" -version = "0.13.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ae98e9c0c08b0f5c90e22cd713201f759b98d4fd570b99867a695f8641859a" +checksum = "bef158627f30503d5c18c20c60b444829f698d343516eeaf6eeee078c9a45163" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -800,15 +793,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" [[package]] name = "byteorder" @@ -818,9 +811,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cast" @@ -830,12 +823,15 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfb8" @@ -854,9 +850,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "num-traits", "serde", @@ -864,9 +860,9 @@ dependencies = [ [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -875,15 +871,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", @@ -901,18 +897,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.12" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.4.12" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstyle", "clap_lex", @@ -920,21 +916,21 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -961,22 +957,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - [[package]] name = "cpufeatures" version = "0.2.12" @@ -988,9 +968,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -1033,32 +1013,29 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] @@ -1068,6 +1045,12 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1080,15 +1063,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -1121,24 +1104,15 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "enum-as-inner" @@ -1149,7 +1123,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] @@ -1164,9 +1138,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" dependencies = [ "anstream", "anstyle", @@ -1183,39 +1157,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.2" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d05712b2d8d88102bc9868020c9e5c7a1f5527c452b9b97450a1d006140ba7" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" dependencies = [ "serde", -] - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", + "typeid", ] [[package]] name = "event-listener" -version = "4.0.2" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "218a870470cce1469024e9fb66b901aa983929d81304a1cdb299f28118e550d5" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" dependencies = [ "concurrent-queue", "parking", @@ -1224,29 +1178,19 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.2", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.0.0", + "event-listener", "pin-project-lite", ] [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fixedbitset" @@ -1256,9 +1200,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1329,9 +1273,9 @@ checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "fastrand", "futures-core", @@ -1348,7 +1292,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] @@ -1393,9 +1337,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1421,41 +1365,20 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.24" +name = "half" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.3", - "slab", - "tokio", - "tokio-util", - "tracing", + "cfg-if", + "crunchy", ] -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -1470,15 +1393,15 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "http" -version = "0.2.11" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -1487,12 +1410,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", "pin-project-lite", ] @@ -1502,12 +1437,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "humantime" version = "2.1.0" @@ -1516,40 +1445,58 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", "http", "hyper", + "hyper-util", "rustls", + "rustls-pki-types", "tokio", "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1574,22 +1521,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -1609,15 +1546,21 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", - "rustix", + "libc", "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -1629,15 +1572,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1653,9 +1596,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "libm" @@ -1669,17 +1612,11 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "linux-raw-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" - [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1687,9 +1624,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru-cache" @@ -1721,9 +1658,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" @@ -1739,18 +1676,18 @@ checksum = "d60a6352e005f1f86008644a9fe336a66f74c94428182162cc69eb8c6fff458d" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -1781,9 +1718,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -1795,11 +1732,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -1823,28 +1759,27 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -1853,11 +1788,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -1865,9 +1799,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -1918,9 +1852,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -1928,9 +1862,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "backtrace", "cfg-if", @@ -1939,7 +1873,7 @@ dependencies = [ "redox_syscall", "smallvec", "thread-id", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -1959,19 +1893,39 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.2.3", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2036,28 +1990,29 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "priority-queue" -version = "1.4.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bda9164fe05bc9225752d54aae413343c36f684380005398a6a8fde95fe785" +checksum = "509354d8a769e8d0b567d6821b84495c60213162761a732d68ce87c964bd347f" dependencies = [ "autocfg", - "indexmap 1.9.3", + "equivalent", + "indexmap", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -2094,9 +2049,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2104,9 +2059,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2114,23 +2069,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -2144,13 +2099,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -2161,26 +2116,26 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ "base64", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", + "http-body-util", "hyper", "hyper-rustls", + "hyper-util", "ipnet", "js-sys", "log", @@ -2190,11 +2145,11 @@ dependencies = [ "pin-project-lite", "rustls", "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-rustls", "tower-service", @@ -2223,16 +2178,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin 0.9.8", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2269,9 +2225,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -2288,55 +2244,52 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" -dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - [[package]] name = "rustls" -version = "0.21.10" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", + "rustls-pki-types", "rustls-webpki", - "sct", + "subtle", + "zeroize", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ "base64", + "rustls-pki-types", ] +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -2353,47 +2306,37 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "semver" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.201" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.201" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -2445,9 +2388,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -2464,24 +2407,25 @@ dependencies = [ [[package]] name = "simdnbt" -version = "0.4.0" -source = "git+https://github.com/azalea-rs/simdnbt#4594562ef0146431fd8c4405c753b32d1bb89c6a" +version = "0.5.2" +source = "git+https://github.com/azalea-rs/simdnbt#07bb1e703664eb19328eb58e9a423585b1128687" dependencies = [ "byteorder", "flate2", "residua-mutf8", "simdnbt-derive", "thiserror", + "valence_nbt", ] [[package]] name = "simdnbt-derive" -version = "0.4.0" -source = "git+https://github.com/azalea-rs/simdnbt#4594562ef0146431fd8c4405c753b32d1bb89c6a" +version = "0.5.2" +source = "git+https://github.com/azalea-rs/simdnbt#07bb1e703664eb19328eb58e9a423585b1128687" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] @@ -2507,30 +2451,46 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" dependencies = [ "serde", ] [[package]] name = "smol_str" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "socks5-impl" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3b7cb60ae94f81007e9c4e165b0999415a0b34249805309f31d38767e863329" +dependencies = [ + "as-any", + "async-trait", + "byteorder", + "bytes", + "percent-encoding", + "serde", + "thiserror", + "tokio", ] [[package]] @@ -2574,9 +2534,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" dependencies = [ "proc-macro2", "quote", @@ -2589,45 +2549,24 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] @@ -2642,9 +2581,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -2677,9 +2616,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -2702,31 +2641,31 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ "rustls", + "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -2741,11 +2680,33 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.3", + "indexmap", "toml_datetime", "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -2758,6 +2719,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2771,7 +2733,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] @@ -2885,6 +2847,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typeid" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" + [[package]] name = "typenum" version = "1.17.0" @@ -2905,9 +2873,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -2937,15 +2905,25 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom", "md-5", "serde", ] +[[package]] +name = "valence_nbt" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3cddc3222ed5ead4fa446881b3deeeee0dba60b0088b2bf12fedbac7eda2312" +dependencies = [ + "byteorder", + "cesu8", +] + [[package]] name = "valuable" version = "0.1.0" @@ -2960,9 +2938,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -2985,9 +2963,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2995,24 +2973,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.40" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -3022,9 +3000,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3032,28 +3010,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -3071,9 +3049,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "winapi" @@ -3093,11 +3074,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -3121,7 +3102,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -3141,17 +3122,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "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", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -3162,9 +3144,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -3174,9 +3156,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -3186,9 +3168,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -3198,9 +3186,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -3210,9 +3198,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -3222,9 +3210,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -3234,24 +3222,24 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", @@ -3259,22 +3247,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.63", ] [[package]] diff --git a/README.md b/README.md index 70fa2b18c..71b3e719f 100755 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A collection of Rust crates for making Minecraft bots, clients, and tools. -_Currently supported Minecraft version: `1.20.4`._ +_Currently supported Minecraft version: `1.20.6`._ > [!WARNING] > Azalea is still very unfinished, though most crates are in a somewhat useable state @@ -53,6 +53,7 @@ If you'd like to chat about Azalea, you can join the Matrix space at [#azalea:ma There are several branches in the Azalea repository that target older Minecraft versions. It is not guaranteed that they will be up-to-date with the latest version of Azalea. If you'd like to update them or add more, please open a PR. +- [1.20.4](https://github.com/azalea-rs/azalea/tree/1.20.4) - [1.20.2](https://github.com/azalea-rs/azalea/tree/1.20.2) - [1.20-1.20.1](https://github.com/azalea-rs/azalea/tree/1.20.1) - [1.19.4](https://github.com/azalea-rs/azalea/tree/1.19.4) diff --git a/azalea-auth/Cargo.toml b/azalea-auth/Cargo.toml index 72612454f..979b59a6d 100644 --- a/azalea-auth/Cargo.toml +++ b/azalea-auth/Cargo.toml @@ -4,30 +4,30 @@ edition = "2021" license = "MIT" name = "azalea-auth" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-auth" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-crypto = { path = "../azalea-crypto", version = "0.9.0" } -base64 = "0.21.7" -chrono = { version = "0.4.34", default-features = false, features = ["serde"] } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-crypto = { path = "../azalea-crypto", version = "0.10.0" } +base64 = "0.22.0" +chrono = { version = "0.4.38", default-features = false, features = ["serde"] } tracing = "0.1.40" num-bigint = "0.4.4" once_cell = "1.19.0" -reqwest = { version = "0.11.24", default-features = false, features = [ +reqwest = { version = "0.12.4", default-features = false, features = [ "json", "rustls-tls", ] } rsa = "0.9.6" -serde = { version = "1.0.196", features = ["derive"] } -serde_json = "1.0.113" -thiserror = "1.0.57" -tokio = { version = "1.36.0", features = ["fs"] } -uuid = { version = "1.7.0", features = ["serde", "v3"] } +serde = { version = "1.0.198", features = ["derive"] } +serde_json = "1.0.116" +thiserror = "1.0.59" +tokio = { version = "1.37.0", features = ["fs"] } +uuid = { version = "1.8.0", features = ["serde", "v3"] } md-5 = "0.10.6" [dev-dependencies] -env_logger = "0.11.2" -tokio = { version = "1.36.0", features = ["full"] } +env_logger = "0.11.3" +tokio = { version = "1.37.0", features = ["full"] } diff --git a/azalea-block/Cargo.toml b/azalea-block/Cargo.toml index 1f3a829f4..0c5ec681b 100644 --- a/azalea-block/Cargo.toml +++ b/azalea-block/Cargo.toml @@ -4,13 +4,13 @@ edition = "2021" license = "MIT" name = "azalea-block" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-block" -version = "0.9.0" +version = "0.10.0" [lib] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -azalea-block-macros = { path = "./azalea-block-macros", version = "0.9.0" } -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-registry = { version = "0.9.0", path = "../azalea-registry" } +azalea-block-macros = { path = "./azalea-block-macros", version = "0.10.0" } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-registry = { version = "0.10.0", path = "../azalea-registry" } diff --git a/azalea-block/azalea-block-macros/Cargo.toml b/azalea-block/azalea-block-macros/Cargo.toml index 7489a93ea..74720ef3f 100644 --- a/azalea-block/azalea-block-macros/Cargo.toml +++ b/azalea-block/azalea-block-macros/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "MIT" name = "azalea-block-macros" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-block/azalea-block-macros" -version = "0.9.0" +version = "0.10.0" [lib] proc-macro = true @@ -12,6 +12,6 @@ proc-macro = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -proc-macro2 = "1.0.78" -quote = "1.0.35" -syn = "2.0.49" +proc-macro2 = "1.0.81" +quote = "1.0.36" +syn = "2.0.60" diff --git a/azalea-block/azalea-block-macros/src/lib.rs b/azalea-block/azalea-block-macros/src/lib.rs index 427da03b4..2cce630e6 100755 --- a/azalea-block/azalea-block-macros/src/lib.rs +++ b/azalea-block/azalea-block-macros/src/lib.rs @@ -39,11 +39,11 @@ struct PropertyDefinitions { properties: Vec, } -/// `snowy: Snowy(false)` or `axis: properties::Axis::Y` +/// `"snowy": Snowy(false)` or `"axis": properties::Axis::Y` #[derive(Debug)] struct PropertyWithNameAndDefault { // "snowy" / "axis" - name: Ident, + name: String, // Snowy / Axis property_type: Ident, property_value_type: Ident, @@ -54,7 +54,7 @@ struct PropertyWithNameAndDefault { /// ```ignore /// grass_block => BlockBehavior::default(), { -/// snowy: false, +/// "snowy": false, /// }, /// ``` struct BlockDefinition { @@ -64,8 +64,8 @@ struct BlockDefinition { } impl Parse for PropertyWithNameAndDefault { fn parse(input: ParseStream) -> Result { - // `snowy: Snowy(false)` or `axis: properties::Axis::Y` - let property_name = input.parse()?; + // `"snowy": Snowy(false)` or `"axis": properties::Axis::Y` + let property_name = input.parse::()?.value(); input.parse::()?; let first_ident = input.call(Ident::parse_any)?; @@ -196,11 +196,11 @@ impl Parse for PropertyDefinitions { impl Parse for BlockDefinition { fn parse(input: ParseStream) -> Result { - // acacia_button => BlockBehavior::default(), { - // Facing=North, - // Powered=False, - // Face=Wall, - // } + // acacia_button => BlockBehavior::new().strength(0.5, 0.5), { + // "face": Face::Wall, + // "facing": FacingCardinal::North, + // "powered": Powered(false), + // }, let name = input.parse()?; input.parse::]>()?; let behavior = input.parse()?; @@ -416,29 +416,24 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { Some( previous_names .iter() - .filter(|&p| p == &property.name.to_string()) + .filter(|&p| p == &property.name) .count(), ) } else { None }; - // ```ignore - // let mut property_name = property_struct_names_to_names - // .get(&property.property_type.to_string()) - // .unwrap_or_else(|| panic!("Property '{}' is bad", property.property_type)) - // .clone(); - // ``` + let mut property_name = property_struct_names_to_names - .get(&property.name.to_string()) + .get(&property.name) .cloned() - .unwrap_or_else(|| property.name.to_string()); + .unwrap_or_else(|| property.name.clone()); previous_names.push(property_name.clone()); if let Some(index) = index { // property_name.push_str(&format!("_{}", &index.to_string())); write!(property_name, "_{index}").unwrap(); } properties_with_name.push(PropertyWithNameAndDefault { - name: Ident::new(&property_name, proc_macro2::Span::call_site()), + name: property_name, property_type: property.property_type.clone(), property_value_type: property.property_value_type.clone(), is_enum: property.is_enum, @@ -462,12 +457,11 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { .. } in &properties_with_name { - // let property_name_snake = - // Ident::new(&property.to_string(), proc_macro2::Span::call_site()); + let name_ident = Ident::new_raw(name, proc_macro2::Span::call_site()); block_struct_fields.extend(if *is_enum { - quote! { pub #name: properties::#property_value_type, } + quote! { pub #name_ident: properties::#property_value_type, } } else { - quote! { pub #name: #property_value_type, } + quote! { pub #name_ident: #property_value_type, } }); } @@ -525,8 +519,10 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { quote! {#variant} }; + let property_name_ident = + Ident::new_raw(property_name, proc_macro2::Span::call_site()); from_block_to_state_combination_match_inner.extend(quote! { - #property_name: #property_variant, + #property_name_ident: #property_variant, }); // add to properties_to_state_ids @@ -602,8 +598,9 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { quote! {properties::#property_struct_name_ident::from((b / #division) % #property_variants_count)} } }; + let property_name_ident = Ident::new_raw(property_name, proc_macro2::Span::call_site()); from_state_to_block_inner.extend(quote! { - #property_name: #conversion_code, + #property_name_ident: #conversion_code, }); division *= property_variants_count; @@ -635,7 +632,8 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { .. } in properties_with_name { - block_default_fields.extend(quote! { #name: #property_default, }); + let name_ident = Ident::new_raw(&name, proc_macro2::Span::call_site()); + block_default_fields.extend(quote! { #name_ident: #property_default, }); } let block_behavior = &block.behavior; diff --git a/azalea-block/src/generated.rs b/azalea-block/src/generated.rs index 5267c9a18..76dfb2dc6 100755 --- a/azalea-block/src/generated.rs +++ b/azalea-block/src/generated.rs @@ -276,7 +276,7 @@ make_block_states! { Upper, Lower, }, - "kind" => PistonType { + "type" => PistonType { Normal, Sticky, }, @@ -317,7 +317,7 @@ make_block_states! { OuterLeft, OuterRight, }, - "kind" => ChestType { + "type" => ChestType { Single, Left, Right, @@ -859,9 +859,9 @@ make_block_states! { _2, _3, }, - "has_bottle" => HasBottle0(bool), - "has_bottle" => HasBottle1(bool), - "has_bottle" => HasBottle2(bool), + "has_bottle_0" => HasBottle0(bool), + "has_bottle_1" => HasBottle1(bool), + "has_bottle_2" => HasBottle2(bool), "level" => WaterCauldronLevel { _1, _2, @@ -1131,7 +1131,7 @@ make_block_states! { _14, _15, }, - "kind" => Type { + "type" => Type { Top, Bottom, Double, @@ -1917,7 +1917,8 @@ make_block_states! { }, "cracked" => Cracked(bool), "crafting" => Crafting(bool), - "trial_spawner_state" => State { + "ominous" => Ominous(bool), + "trial_spawner_state" => TrialSpawnerState { Inactive, WaitingForPlayers, Active, @@ -1925,6 +1926,12 @@ make_block_states! { EjectingReward, Cooldown, }, + "vault_state" => VaultState { + Inactive, + Active, + Unlocking, + Ejecting, + }, }, Blocks => { air => BlockBehavior::new(), {}, @@ -1936,12 +1943,12 @@ make_block_states! { andesite => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, polished_andesite => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, grass_block => BlockBehavior::new().strength(0.6, 0.6), { - snowy: Snowy(false), + "snowy": Snowy(false), }, dirt => BlockBehavior::new().strength(0.5, 0.5), {}, coarse_dirt => BlockBehavior::new().strength(0.5, 0.5), {}, podzol => BlockBehavior::new().strength(0.5, 0.5), { - snowy: Snowy(false), + "snowy": Snowy(false), }, cobblestone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, oak_planks => BlockBehavior::new().strength(2.0, 3.0), {}, @@ -1955,47 +1962,47 @@ make_block_states! { bamboo_planks => BlockBehavior::new().strength(2.0, 3.0), {}, bamboo_mosaic => BlockBehavior::new().strength(2.0, 3.0), {}, oak_sapling => BlockBehavior::new(), { - stage: OakSaplingStage::_0, + "stage": OakSaplingStage::_0, }, spruce_sapling => BlockBehavior::new(), { - stage: SpruceSaplingStage::_0, + "stage": SpruceSaplingStage::_0, }, birch_sapling => BlockBehavior::new(), { - stage: BirchSaplingStage::_0, + "stage": BirchSaplingStage::_0, }, jungle_sapling => BlockBehavior::new(), { - stage: JungleSaplingStage::_0, + "stage": JungleSaplingStage::_0, }, acacia_sapling => BlockBehavior::new(), { - stage: AcaciaSaplingStage::_0, + "stage": AcaciaSaplingStage::_0, }, cherry_sapling => BlockBehavior::new(), { - stage: CherrySaplingStage::_0, + "stage": CherrySaplingStage::_0, }, dark_oak_sapling => BlockBehavior::new(), { - stage: DarkOakSaplingStage::_0, + "stage": DarkOakSaplingStage::_0, }, mangrove_propagule => BlockBehavior::new(), { - age: MangrovePropaguleAge::_0, - hanging: Hanging(false), - stage: MangrovePropaguleStage::_0, - waterlogged: Waterlogged(false), + "age": MangrovePropaguleAge::_0, + "hanging": Hanging(false), + "stage": MangrovePropaguleStage::_0, + "waterlogged": Waterlogged(false), }, bedrock => BlockBehavior::new().strength(-1.0, 3600000.0), {}, water => BlockBehavior::new().strength(100.0, 100.0), { - level: WaterLevel::_0, + "level": WaterLevel::_0, }, lava => BlockBehavior::new().strength(100.0, 100.0), { - level: LavaLevel::_0, + "level": LavaLevel::_0, }, sand => BlockBehavior::new().strength(0.5, 0.5), {}, suspicious_sand => BlockBehavior::new().strength(0.25, 0.25), { - dusted: SuspiciousSandDusted::_0, + "dusted": SuspiciousSandDusted::_0, }, red_sand => BlockBehavior::new().strength(0.5, 0.5), {}, gravel => BlockBehavior::new().strength(0.6, 0.6), {}, suspicious_gravel => BlockBehavior::new().strength(0.25, 0.25), { - dusted: SuspiciousGravelDusted::_0, + "dusted": SuspiciousGravelDusted::_0, }, gold_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), {}, deepslate_gold_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.5, 3.0), {}, @@ -2005,162 +2012,162 @@ make_block_states! { deepslate_coal_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.5, 3.0), {}, nether_gold_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), {}, oak_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, spruce_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, birch_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, jungle_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, acacia_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, cherry_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, dark_oak_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, mangrove_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, mangrove_roots => BlockBehavior::new().strength(0.7, 0.7), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, muddy_mangrove_roots => BlockBehavior::new().strength(0.7, 0.7), { - axis: Axis::Y, + "axis": Axis::Y, }, bamboo_block => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_spruce_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_birch_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_jungle_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_acacia_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_cherry_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_dark_oak_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_oak_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_mangrove_log => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_bamboo_block => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, oak_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, spruce_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, birch_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, jungle_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, acacia_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, cherry_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, dark_oak_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, mangrove_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_oak_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_spruce_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_birch_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_jungle_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_acacia_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_cherry_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_dark_oak_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_mangrove_wood => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, oak_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: OakLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": OakLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, spruce_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: SpruceLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": SpruceLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, birch_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: BirchLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": BirchLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, jungle_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: JungleLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": JungleLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, acacia_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: AcaciaLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": AcaciaLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, cherry_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: CherryLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": CherryLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, dark_oak_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: DarkOakLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": DarkOakLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, mangrove_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: MangroveLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": MangroveLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, azalea_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: AzaleaLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": AzaleaLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, flowering_azalea_leaves => BlockBehavior::new().strength(0.2, 0.2), { - distance: FloweringAzaleaLeavesDistance::_7, - persistent: Persistent(false), - waterlogged: Waterlogged(false), + "distance": FloweringAzaleaLeavesDistance::_7, + "persistent": Persistent(false), + "waterlogged": Waterlogged(false), }, sponge => BlockBehavior::new().strength(0.6, 0.6), {}, wet_sponge => BlockBehavior::new().strength(0.6, 0.6), {}, @@ -2169,110 +2176,110 @@ make_block_states! { deepslate_lapis_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.5, 3.0), {}, lapis_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), {}, dispenser => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - facing: FacingCubic::North, - triggered: Triggered(false), + "facing": FacingCubic::North, + "triggered": Triggered(false), }, sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, chiseled_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, cut_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, note_block => BlockBehavior::new().strength(0.8, 0.8), { - instrument: Sound::Harp, - note: NoteBlockNote::_0, - powered: Powered(false), + "instrument": Sound::Harp, + "note": NoteBlockNote::_0, + "powered": Powered(false), }, white_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, orange_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, magenta_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, light_blue_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, yellow_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, lime_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, pink_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, gray_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, light_gray_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, cyan_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, purple_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, blue_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, brown_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, green_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, red_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, black_bed => BlockBehavior::new().strength(0.2, 0.2), { - facing: FacingCardinal::North, - occupied: Occupied(false), - part: Part::Foot, + "facing": FacingCardinal::North, + "occupied": Occupied(false), + "part": Part::Foot, }, powered_rail => BlockBehavior::new().strength(0.7, 0.7), { - powered: Powered(false), - shape: RailShape::NorthSouth, - waterlogged: Waterlogged(false), + "powered": Powered(false), + "shape": RailShape::NorthSouth, + "waterlogged": Waterlogged(false), }, detector_rail => BlockBehavior::new().strength(0.7, 0.7), { - powered: Powered(false), - shape: RailShape::NorthSouth, - waterlogged: Waterlogged(false), + "powered": Powered(false), + "shape": RailShape::NorthSouth, + "waterlogged": Waterlogged(false), }, sticky_piston => BlockBehavior::new().strength(1.5, 1.5), { - extended: Extended(false), - facing: FacingCubic::North, + "extended": Extended(false), + "facing": FacingCubic::North, }, cobweb => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.0, 4.0), {}, short_grass => BlockBehavior::new(), {}, @@ -2280,16 +2287,16 @@ make_block_states! { dead_bush => BlockBehavior::new(), {}, seagrass => BlockBehavior::new(), {}, tall_seagrass => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, piston => BlockBehavior::new().strength(1.5, 1.5), { - extended: Extended(false), - facing: FacingCubic::North, + "extended": Extended(false), + "facing": FacingCubic::North, }, piston_head => BlockBehavior::new().strength(1.5, 1.5), { - kind: PistonType::Normal, - facing: FacingCubic::North, - short: Short(false), + "type": PistonType::Normal, + "facing": FacingCubic::North, + "short": Short(false), }, white_wool => BlockBehavior::new().strength(0.8, 0.8), {}, orange_wool => BlockBehavior::new().strength(0.8, 0.8), {}, @@ -2308,8 +2315,8 @@ make_block_states! { red_wool => BlockBehavior::new().strength(0.8, 0.8), {}, black_wool => BlockBehavior::new().strength(0.8, 0.8), {}, moving_piston => BlockBehavior::new().destroy_time(-1.0), { - kind: PistonType::Normal, - facing: FacingCubic::North, + "type": PistonType::Normal, + "facing": FacingCubic::North, }, dandelion => BlockBehavior::new(), {}, torchflower => BlockBehavior::new(), {}, @@ -2331,371 +2338,371 @@ make_block_states! { iron_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {}, bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, tnt => BlockBehavior::new(), { - unstable: Unstable(false), + "unstable": Unstable(false), }, bookshelf => BlockBehavior::new().strength(1.5, 1.5), {}, chiseled_bookshelf => BlockBehavior::new().strength(1.5, 1.5), { - facing: FacingCardinal::North, - slot_0_occupied: TrueFalse(false), - slot_1_occupied: TrueFalse(false), - slot_2_occupied: TrueFalse(false), - slot_3_occupied: TrueFalse(false), - slot_4_occupied: TrueFalse(false), - slot_5_occupied: TrueFalse(false), + "facing": FacingCardinal::North, + "slot_0_occupied": TrueFalse(false), + "slot_1_occupied": TrueFalse(false), + "slot_2_occupied": TrueFalse(false), + "slot_3_occupied": TrueFalse(false), + "slot_4_occupied": TrueFalse(false), + "slot_5_occupied": TrueFalse(false), }, mossy_cobblestone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, obsidian => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 1200.0), {}, torch => BlockBehavior::new(), {}, wall_torch => BlockBehavior::new(), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, fire => BlockBehavior::new(), { - age: FireAge::_0, - east: East(false), - north: North(false), - south: South(false), - up: Up(false), - west: West(false), + "age": FireAge::_0, + "east": East(false), + "north": North(false), + "south": South(false), + "up": Up(false), + "west": West(false), }, soul_fire => BlockBehavior::new(), {}, spawner => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 5.0), {}, oak_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, chest => BlockBehavior::new().strength(2.5, 2.5), { - kind: ChestType::Single, - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "type": ChestType::Single, + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, redstone_wire => BlockBehavior::new(), { - east: WireEast::None, - north: WireNorth::None, - power: RedstoneWirePower::_0, - south: WireSouth::None, - west: WireWest::None, + "east": WireEast::None, + "north": WireNorth::None, + "power": RedstoneWirePower::_0, + "south": WireSouth::None, + "west": WireWest::None, }, diamond_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), {}, deepslate_diamond_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.5, 3.0), {}, diamond_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {}, crafting_table => BlockBehavior::new().strength(2.5, 2.5), {}, wheat => BlockBehavior::new(), { - age: WheatAge::_0, + "age": WheatAge::_0, }, farmland => BlockBehavior::new().strength(0.6, 0.6), { - moisture: FarmlandMoisture::_0, + "moisture": FarmlandMoisture::_0, }, furnace => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - facing: FacingCardinal::North, - lit: Lit(false), + "facing": FacingCardinal::North, + "lit": Lit(false), }, oak_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: OakSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": OakSignRotation::_0, + "waterlogged": Waterlogged(false), }, spruce_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: SpruceSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": SpruceSignRotation::_0, + "waterlogged": Waterlogged(false), }, birch_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: BirchSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": BirchSignRotation::_0, + "waterlogged": Waterlogged(false), }, acacia_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: AcaciaSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": AcaciaSignRotation::_0, + "waterlogged": Waterlogged(false), }, cherry_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: CherrySignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": CherrySignRotation::_0, + "waterlogged": Waterlogged(false), }, jungle_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: JungleSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": JungleSignRotation::_0, + "waterlogged": Waterlogged(false), }, dark_oak_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: DarkOakSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": DarkOakSignRotation::_0, + "waterlogged": Waterlogged(false), }, mangrove_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: MangroveSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": MangroveSignRotation::_0, + "waterlogged": Waterlogged(false), }, bamboo_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: BambooSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": BambooSignRotation::_0, + "waterlogged": Waterlogged(false), }, oak_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, ladder => BlockBehavior::new().strength(0.4, 0.4), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, rail => BlockBehavior::new().strength(0.7, 0.7), { - shape: Shape::NorthSouth, - waterlogged: Waterlogged(false), + "shape": Shape::NorthSouth, + "waterlogged": Waterlogged(false), }, cobblestone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, oak_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, spruce_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, birch_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, acacia_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, cherry_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, jungle_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, dark_oak_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, mangrove_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, bamboo_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, oak_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: OakHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": OakHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, spruce_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: SpruceHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": SpruceHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, birch_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: BirchHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": BirchHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, acacia_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: AcaciaHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": AcaciaHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, cherry_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: CherryHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": CherryHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, jungle_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: JungleHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": JungleHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, dark_oak_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: DarkOakHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": DarkOakHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, crimson_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: CrimsonHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": CrimsonHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, warped_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: WarpedHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": WarpedHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, mangrove_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: MangroveHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": MangroveHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, bamboo_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - attached: Attached(false), - rotation: BambooHangingSignRotation::_0, - waterlogged: Waterlogged(false), + "attached": Attached(false), + "rotation": BambooHangingSignRotation::_0, + "waterlogged": Waterlogged(false), }, oak_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, spruce_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, birch_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, acacia_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, cherry_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, jungle_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, dark_oak_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, mangrove_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, crimson_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, warped_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, bamboo_wall_hanging_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, lever => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, stone_pressure_plate => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, iron_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 5.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, oak_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, spruce_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, birch_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, jungle_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, acacia_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, cherry_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, dark_oak_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, mangrove_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, bamboo_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, redstone_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), { - lit: Lit(false), + "lit": Lit(false), }, deepslate_redstone_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.5, 3.0), { - lit: Lit(false), + "lit": Lit(false), }, redstone_torch => BlockBehavior::new(), { - lit: Lit(true), + "lit": Lit(true), }, redstone_wall_torch => BlockBehavior::new(), { - facing: FacingCardinal::North, - lit: Lit(true), + "facing": FacingCardinal::North, + "lit": Lit(true), }, stone_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, snow => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.1, 0.1), { - layers: SnowLayers::_1, + "layers": SnowLayers::_1, }, ice => BlockBehavior::new().strength(0.5, 0.5).friction(0.98), {}, snow_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.2, 0.2), {}, cactus => BlockBehavior::new().strength(0.4, 0.4), { - age: CactusAge::_0, + "age": CactusAge::_0, }, clay => BlockBehavior::new().strength(0.6, 0.6), {}, sugar_cane => BlockBehavior::new(), { - age: SugarCaneAge::_0, + "age": SugarCaneAge::_0, }, jukebox => BlockBehavior::new().strength(2.0, 6.0), { - has_record: HasRecord(false), + "has_record": HasRecord(false), }, oak_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, netherrack => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.4, 0.4), {}, soul_sand => BlockBehavior::new().strength(0.5, 0.5), {}, soul_soil => BlockBehavior::new().strength(0.5, 0.5), {}, basalt => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), { - axis: Axis::Y, + "axis": Axis::Y, }, polished_basalt => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), { - axis: Axis::Y, + "axis": Axis::Y, }, soul_torch => BlockBehavior::new(), {}, soul_wall_torch => BlockBehavior::new(), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, glowstone => BlockBehavior::new().strength(0.3, 0.3), {}, nether_portal => BlockBehavior::new().destroy_time(-1.0), { - axis: AxisXZ::X, + "axis": AxisXZ::X, }, carved_pumpkin => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, jack_o_lantern => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, cake => BlockBehavior::new().strength(0.5, 0.5), { - bites: CakeBites::_0, + "bites": CakeBites::_0, }, repeater => BlockBehavior::new(), { - delay: RepeaterDelay::_1, - facing: FacingCardinal::North, - locked: Locked(false), - powered: Powered(false), + "delay": RepeaterDelay::_1, + "facing": FacingCardinal::North, + "locked": Locked(false), + "powered": Powered(false), }, white_stained_glass => BlockBehavior::new().strength(0.3, 0.3), {}, orange_stained_glass => BlockBehavior::new().strength(0.3, 0.3), {}, @@ -2714,67 +2721,67 @@ make_block_states! { red_stained_glass => BlockBehavior::new().strength(0.3, 0.3), {}, black_stained_glass => BlockBehavior::new().strength(0.3, 0.3), {}, oak_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, spruce_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, birch_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, jungle_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, acacia_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, cherry_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, dark_oak_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, mangrove_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, bamboo_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, stone_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, mossy_stone_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, @@ -2789,215 +2796,215 @@ make_block_states! { infested_cracked_stone_bricks => BlockBehavior::new().strength(0.75, 0.75), {}, infested_chiseled_stone_bricks => BlockBehavior::new().strength(0.75, 0.75), {}, brown_mushroom_block => BlockBehavior::new().strength(0.2, 0.2), { - down: Down(true), - east: East(true), - north: North(true), - south: South(true), - up: Up(true), - west: West(true), + "down": Down(true), + "east": East(true), + "north": North(true), + "south": South(true), + "up": Up(true), + "west": West(true), }, red_mushroom_block => BlockBehavior::new().strength(0.2, 0.2), { - down: Down(true), - east: East(true), - north: North(true), - south: South(true), - up: Up(true), - west: West(true), + "down": Down(true), + "east": East(true), + "north": North(true), + "south": South(true), + "up": Up(true), + "west": West(true), }, mushroom_stem => BlockBehavior::new().strength(0.2, 0.2), { - down: Down(true), - east: East(true), - north: North(true), - south: South(true), - up: Up(true), - west: West(true), + "down": Down(true), + "east": East(true), + "north": North(true), + "south": South(true), + "up": Up(true), + "west": West(true), }, iron_bars => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, chain => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), { - axis: Axis::Y, - waterlogged: Waterlogged(false), + "axis": Axis::Y, + "waterlogged": Waterlogged(false), }, glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, pumpkin => BlockBehavior::new().strength(1.0, 1.0), {}, melon => BlockBehavior::new().strength(1.0, 1.0), {}, attached_pumpkin_stem => BlockBehavior::new(), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, attached_melon_stem => BlockBehavior::new(), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, pumpkin_stem => BlockBehavior::new(), { - age: PumpkinStemAge::_0, + "age": PumpkinStemAge::_0, }, melon_stem => BlockBehavior::new(), { - age: MelonStemAge::_0, + "age": MelonStemAge::_0, }, vine => BlockBehavior::new().strength(0.2, 0.2), { - east: East(false), - north: North(false), - south: South(false), - up: Up(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "up": Up(false), + "west": West(false), }, glow_lichen => BlockBehavior::new().strength(0.2, 0.2), { - down: Down(false), - east: East(false), - north: North(false), - south: South(false), - up: Up(false), - waterlogged: Waterlogged(false), - west: West(false), + "down": Down(false), + "east": East(false), + "north": North(false), + "south": South(false), + "up": Up(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, oak_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, stone_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, mud_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, mycelium => BlockBehavior::new().strength(0.6, 0.6), { - snowy: Snowy(false), + "snowy": Snowy(false), }, lily_pad => BlockBehavior::new(), {}, nether_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, nether_brick_fence => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, nether_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, nether_wart => BlockBehavior::new(), { - age: NetherWartAge::_0, + "age": NetherWartAge::_0, }, enchanting_table => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 1200.0), {}, brewing_stand => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.5, 0.5), { - has_bottle: HasBottle0(false), - has_bottle: HasBottle1(false), - has_bottle: HasBottle2(false), + "has_bottle_0": HasBottle0(false), + "has_bottle_1": HasBottle1(false), + "has_bottle_2": HasBottle2(false), }, cauldron => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 2.0), {}, water_cauldron => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 2.0), { - level: WaterCauldronLevel::_1, + "level": WaterCauldronLevel::_1, }, lava_cauldron => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 2.0), {}, powder_snow_cauldron => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 2.0), { - level: PowderSnowCauldronLevel::_1, + "level": PowderSnowCauldronLevel::_1, }, end_portal => BlockBehavior::new().strength(-1.0, 3600000.0), {}, end_portal_frame => BlockBehavior::new().strength(-1.0, 3600000.0), { - eye: Eye(false), - facing: FacingCardinal::North, + "eye": Eye(false), + "facing": FacingCardinal::North, }, end_stone => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 9.0), {}, dragon_egg => BlockBehavior::new().strength(3.0, 9.0), {}, redstone_lamp => BlockBehavior::new().strength(0.3, 0.3), { - lit: Lit(false), + "lit": Lit(false), }, cocoa => BlockBehavior::new().strength(0.2, 3.0), { - age: CocoaAge::_0, - facing: FacingCardinal::North, + "age": CocoaAge::_0, + "facing": FacingCardinal::North, }, sandstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, emerald_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), {}, deepslate_emerald_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(4.5, 3.0), {}, ender_chest => BlockBehavior::new().requires_correct_tool_for_drops().strength(22.5, 600.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, tripwire_hook => BlockBehavior::new(), { - attached: Attached(false), - facing: FacingCardinal::North, - powered: Powered(false), + "attached": Attached(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, tripwire => BlockBehavior::new(), { - attached: Attached(false), - disarmed: Disarmed(false), - east: East(false), - north: North(false), - powered: Powered(false), - south: South(false), - west: West(false), + "attached": Attached(false), + "disarmed": Disarmed(false), + "east": East(false), + "north": North(false), + "powered": Powered(false), + "south": South(false), + "west": West(false), }, emerald_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {}, spruce_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, birch_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, jungle_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, command_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(-1.0, 3600000.0), { - conditional: Conditional(false), - facing: FacingCubic::North, + "conditional": Conditional(false), + "facing": FacingCubic::North, }, beacon => BlockBehavior::new().strength(3.0, 3.0), {}, cobblestone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, mossy_cobblestone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, flower_pot => BlockBehavior::new(), {}, potted_torchflower => BlockBehavior::new(), {}, @@ -3028,166 +3035,166 @@ make_block_states! { potted_dead_bush => BlockBehavior::new(), {}, potted_cactus => BlockBehavior::new(), {}, carrots => BlockBehavior::new(), { - age: CarrotsAge::_0, + "age": CarrotsAge::_0, }, potatoes => BlockBehavior::new(), { - age: PotatoesAge::_0, + "age": PotatoesAge::_0, }, oak_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, spruce_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, birch_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, jungle_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, acacia_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, cherry_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, dark_oak_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, mangrove_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, bamboo_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, skeleton_skull => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: SkeletonSkullRotation::_0, + "powered": Powered(false), + "rotation": SkeletonSkullRotation::_0, }, skeleton_wall_skull => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, wither_skeleton_skull => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: WitherSkeletonSkullRotation::_0, + "powered": Powered(false), + "rotation": WitherSkeletonSkullRotation::_0, }, wither_skeleton_wall_skull => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, zombie_head => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: ZombieHeadRotation::_0, + "powered": Powered(false), + "rotation": ZombieHeadRotation::_0, }, zombie_wall_head => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, player_head => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: PlayerHeadRotation::_0, + "powered": Powered(false), + "rotation": PlayerHeadRotation::_0, }, player_wall_head => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, creeper_head => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: CreeperHeadRotation::_0, + "powered": Powered(false), + "rotation": CreeperHeadRotation::_0, }, creeper_wall_head => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, dragon_head => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: DragonHeadRotation::_0, + "powered": Powered(false), + "rotation": DragonHeadRotation::_0, }, dragon_wall_head => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, piglin_head => BlockBehavior::new().strength(1.0, 1.0), { - powered: Powered(false), - rotation: PiglinHeadRotation::_0, + "powered": Powered(false), + "rotation": PiglinHeadRotation::_0, }, piglin_wall_head => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - powered: Powered(false), + "facing": FacingCardinal::North, + "powered": Powered(false), }, anvil => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 1200.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, chipped_anvil => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 1200.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, damaged_anvil => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 1200.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, trapped_chest => BlockBehavior::new().strength(2.5, 2.5), { - kind: ChestType::Single, - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "type": ChestType::Single, + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, light_weighted_pressure_plate => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.5, 0.5), { - power: LightWeightedPressurePlatePower::_0, + "power": LightWeightedPressurePlatePower::_0, }, heavy_weighted_pressure_plate => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.5, 0.5), { - power: HeavyWeightedPressurePlatePower::_0, + "power": HeavyWeightedPressurePlatePower::_0, }, comparator => BlockBehavior::new(), { - facing: FacingCardinal::North, - mode: ComparatorType::Compare, - powered: Powered(false), + "facing": FacingCardinal::North, + "mode": ComparatorType::Compare, + "powered": Powered(false), }, daylight_detector => BlockBehavior::new().strength(0.2, 0.2), { - inverted: Inverted(false), - power: DaylightDetectorPower::_0, + "inverted": Inverted(false), + "power": DaylightDetectorPower::_0, }, redstone_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {}, nether_quartz_ore => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), {}, hopper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 4.8), { - enabled: Enabled(true), - facing: Facing::Down, + "enabled": Enabled(true), + "facing": Facing::Down, }, quartz_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, chiseled_quartz_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, quartz_pillar => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), { - axis: Axis::Y, + "axis": Axis::Y, }, quartz_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, activator_rail => BlockBehavior::new().strength(0.7, 0.7), { - powered: Powered(false), - shape: RailShape::NorthSouth, - waterlogged: Waterlogged(false), + "powered": Powered(false), + "shape": RailShape::NorthSouth, + "waterlogged": Waterlogged(false), }, dropper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - facing: FacingCubic::North, - triggered: Triggered(false), + "facing": FacingCubic::North, + "triggered": Triggered(false), }, white_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), {}, orange_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), {}, @@ -3206,204 +3213,204 @@ make_block_states! { red_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), {}, black_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), {}, white_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, orange_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, magenta_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, light_blue_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, yellow_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, lime_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, pink_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, gray_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, light_gray_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, cyan_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, purple_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, blue_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, brown_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, green_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, red_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, black_stained_glass_pane => BlockBehavior::new().strength(0.3, 0.3), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, acacia_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, cherry_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, dark_oak_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, mangrove_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, bamboo_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, bamboo_mosaic_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, slime_block => BlockBehavior::new().friction(0.8), {}, barrier => BlockBehavior::new().strength(-1.0, 3600000.8), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, light => BlockBehavior::new().strength(-1.0, 3600000.8), { - level: LightLevel::_15, - waterlogged: Waterlogged(false), + "level": LightLevel::_15, + "waterlogged": Waterlogged(false), }, iron_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 5.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, prismarine => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, prismarine_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, dark_prismarine => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, prismarine_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, prismarine_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, dark_prismarine_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, prismarine_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, prismarine_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, dark_prismarine_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, sea_lantern => BlockBehavior::new().strength(0.3, 0.3), {}, hay_block => BlockBehavior::new().strength(0.5, 0.5), { - axis: Axis::Y, + "axis": Axis::Y, }, white_carpet => BlockBehavior::new().strength(0.1, 0.1), {}, orange_carpet => BlockBehavior::new().strength(0.1, 0.1), {}, @@ -3425,548 +3432,548 @@ make_block_states! { coal_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {}, packed_ice => BlockBehavior::new().strength(0.5, 0.5).friction(0.98), {}, sunflower => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, lilac => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, rose_bush => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, peony => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, tall_grass => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, large_fern => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, white_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: WhiteBannerRotation::_0, + "rotation": WhiteBannerRotation::_0, }, orange_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: OrangeBannerRotation::_0, + "rotation": OrangeBannerRotation::_0, }, magenta_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: MagentaBannerRotation::_0, + "rotation": MagentaBannerRotation::_0, }, light_blue_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: LightBlueBannerRotation::_0, + "rotation": LightBlueBannerRotation::_0, }, yellow_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: YellowBannerRotation::_0, + "rotation": YellowBannerRotation::_0, }, lime_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: LimeBannerRotation::_0, + "rotation": LimeBannerRotation::_0, }, pink_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: PinkBannerRotation::_0, + "rotation": PinkBannerRotation::_0, }, gray_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: GrayBannerRotation::_0, + "rotation": GrayBannerRotation::_0, }, light_gray_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: LightGrayBannerRotation::_0, + "rotation": LightGrayBannerRotation::_0, }, cyan_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: CyanBannerRotation::_0, + "rotation": CyanBannerRotation::_0, }, purple_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: PurpleBannerRotation::_0, + "rotation": PurpleBannerRotation::_0, }, blue_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: BlueBannerRotation::_0, + "rotation": BlueBannerRotation::_0, }, brown_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: BrownBannerRotation::_0, + "rotation": BrownBannerRotation::_0, }, green_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: GreenBannerRotation::_0, + "rotation": GreenBannerRotation::_0, }, red_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: RedBannerRotation::_0, + "rotation": RedBannerRotation::_0, }, black_banner => BlockBehavior::new().strength(1.0, 1.0), { - rotation: BlackBannerRotation::_0, + "rotation": BlackBannerRotation::_0, }, white_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, orange_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, magenta_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, light_blue_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, yellow_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, lime_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, pink_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, gray_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, light_gray_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, cyan_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, purple_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, blue_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, brown_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, green_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, red_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, black_wall_banner => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, red_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, chiseled_red_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, cut_red_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, red_sandstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, oak_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, spruce_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, birch_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, jungle_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, acacia_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, cherry_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, dark_oak_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, mangrove_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, bamboo_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, bamboo_mosaic_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, stone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, smooth_stone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, sandstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, cut_sandstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, petrified_oak_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, cobblestone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, stone_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, mud_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, nether_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, quartz_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, red_sandstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, cut_red_sandstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, purpur_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, smooth_stone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, smooth_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, smooth_quartz => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, smooth_red_sandstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, spruce_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, birch_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, jungle_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, acacia_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, cherry_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, dark_oak_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, mangrove_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, bamboo_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, spruce_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, birch_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, jungle_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, acacia_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, cherry_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, dark_oak_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, mangrove_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, bamboo_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, spruce_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, birch_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, jungle_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, acacia_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, cherry_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, dark_oak_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, mangrove_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, bamboo_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, end_rod => BlockBehavior::new(), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, chorus_plant => BlockBehavior::new().strength(0.4, 0.4), { - down: Down(false), - east: East(false), - north: North(false), - south: South(false), - up: Up(false), - west: West(false), + "down": Down(false), + "east": East(false), + "north": North(false), + "south": South(false), + "up": Up(false), + "west": West(false), }, chorus_flower => BlockBehavior::new().strength(0.4, 0.4), { - age: ChorusFlowerAge::_0, + "age": ChorusFlowerAge::_0, }, purpur_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, purpur_pillar => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - axis: Axis::Y, + "axis": Axis::Y, }, purpur_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, end_stone_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 9.0), {}, torchflower_crop => BlockBehavior::new(), { - age: TorchflowerCropAge::_0, + "age": TorchflowerCropAge::_0, }, pitcher_crop => BlockBehavior::new(), { - age: _0_1_2_3_4::_0, - half: UpperLower::Lower, + "age": _0_1_2_3_4::_0, + "half": UpperLower::Lower, }, pitcher_plant => BlockBehavior::new(), { - half: Half::Lower, + "half": Half::Lower, }, beetroots => BlockBehavior::new(), { - age: BeetrootsAge::_0, + "age": BeetrootsAge::_0, }, dirt_path => BlockBehavior::new().strength(0.65, 0.65), {}, end_gateway => BlockBehavior::new().strength(-1.0, 3600000.0), {}, repeating_command_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(-1.0, 3600000.0), { - conditional: Conditional(false), - facing: FacingCubic::North, + "conditional": Conditional(false), + "facing": FacingCubic::North, }, chain_command_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(-1.0, 3600000.0), { - conditional: Conditional(false), - facing: FacingCubic::North, + "conditional": Conditional(false), + "facing": FacingCubic::North, }, frosted_ice => BlockBehavior::new().strength(0.5, 0.5).friction(0.98), { - age: FrostedIceAge::_0, + "age": FrostedIceAge::_0, }, magma_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.5, 0.5), {}, nether_wart_block => BlockBehavior::new().strength(1.0, 1.0), {}, red_nether_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, bone_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, structure_void => BlockBehavior::new(), {}, observer => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 3.0), { - facing: FacingCubic::South, - powered: Powered(false), + "facing": FacingCubic::South, + "powered": Powered(false), }, shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, white_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, orange_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, magenta_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, light_blue_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, yellow_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, lime_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, pink_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, gray_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, light_gray_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, cyan_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, purple_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, blue_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, brown_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, green_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, red_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, black_shulker_box => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCubic::Up, + "facing": FacingCubic::Up, }, white_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, orange_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, magenta_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, light_blue_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, yellow_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, lime_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, pink_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, gray_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, light_gray_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, cyan_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, purple_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, blue_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, brown_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, green_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, red_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, black_glazed_terracotta => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.4, 1.4), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, white_concrete => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.8, 1.8), {}, orange_concrete => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.8, 1.8), {}, @@ -4001,16 +4008,16 @@ make_block_states! { red_concrete_powder => BlockBehavior::new().strength(0.5, 0.5), {}, black_concrete_powder => BlockBehavior::new().strength(0.5, 0.5), {}, kelp => BlockBehavior::new(), { - age: KelpAge::_0, + "age": KelpAge::_0, }, kelp_plant => BlockBehavior::new(), {}, dried_kelp_block => BlockBehavior::new().strength(0.5, 2.5), {}, turtle_egg => BlockBehavior::new().strength(0.5, 0.5), { - eggs: TurtleEggEggs::_1, - hatch: TurtleEggHatch::_0, + "eggs": TurtleEggEggs::_1, + "hatch": TurtleEggHatch::_0, }, sniffer_egg => BlockBehavior::new().strength(0.5, 0.5), { - hatch: SnifferEggHatch::_0, + "hatch": SnifferEggHatch::_0, }, dead_tube_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, dead_brain_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, @@ -4023,439 +4030,439 @@ make_block_states! { fire_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, horn_coral_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, dead_tube_coral => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_brain_coral => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_bubble_coral => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_fire_coral => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_horn_coral => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, tube_coral => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, brain_coral => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, bubble_coral => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, fire_coral => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, horn_coral => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_tube_coral_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_brain_coral_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_bubble_coral_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_fire_coral_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_horn_coral_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, tube_coral_fan => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, brain_coral_fan => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, bubble_coral_fan => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, fire_coral_fan => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, horn_coral_fan => BlockBehavior::new(), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, dead_tube_coral_wall_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, dead_brain_coral_wall_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, dead_bubble_coral_wall_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, dead_fire_coral_wall_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, dead_horn_coral_wall_fan => BlockBehavior::new().requires_correct_tool_for_drops(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, tube_coral_wall_fan => BlockBehavior::new(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, brain_coral_wall_fan => BlockBehavior::new(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, bubble_coral_wall_fan => BlockBehavior::new(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, fire_coral_wall_fan => BlockBehavior::new(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, horn_coral_wall_fan => BlockBehavior::new(), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(true), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(true), }, sea_pickle => BlockBehavior::new(), { - pickles: SeaPicklePickles::_1, - waterlogged: Waterlogged(true), + "pickles": SeaPicklePickles::_1, + "waterlogged": Waterlogged(true), }, blue_ice => BlockBehavior::new().strength(2.8, 2.8).friction(0.989), {}, conduit => BlockBehavior::new().strength(3.0, 3.0), { - waterlogged: Waterlogged(true), + "waterlogged": Waterlogged(true), }, bamboo_sapling => BlockBehavior::new().strength(1.0, 1.0), {}, bamboo => BlockBehavior::new().strength(1.0, 1.0), { - age: BambooAge::_0, - leaves: Leaves::None, - stage: BambooStage::_0, + "age": BambooAge::_0, + "leaves": Leaves::None, + "stage": BambooStage::_0, }, potted_bamboo => BlockBehavior::new(), {}, void_air => BlockBehavior::new(), {}, cave_air => BlockBehavior::new(), {}, bubble_column => BlockBehavior::new(), { - drag: Drag(true), + "drag": Drag(true), }, polished_granite_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, smooth_red_sandstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, mossy_stone_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_diorite_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, mossy_cobblestone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, end_stone_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 9.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, stone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, smooth_sandstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, smooth_quartz_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, granite_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, andesite_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, red_nether_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_andesite_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, diorite_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_granite_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, smooth_red_sandstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, mossy_stone_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_diorite_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, mossy_cobblestone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, end_stone_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 9.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, smooth_sandstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, smooth_quartz_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, granite_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, andesite_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, red_nether_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_andesite_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, diorite_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, prismarine_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, red_sandstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, mossy_stone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, granite_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, stone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, mud_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 3.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, nether_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, andesite_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, red_nether_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, sandstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, end_stone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 9.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, diorite_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, scaffolding => BlockBehavior::new(), { - bottom: Bottom(false), - distance: ScaffoldingDistance::_7, - waterlogged: Waterlogged(false), + "bottom": Bottom(false), + "distance": ScaffoldingDistance::_7, + "waterlogged": Waterlogged(false), }, loom => BlockBehavior::new().strength(2.5, 2.5), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, barrel => BlockBehavior::new().strength(2.5, 2.5), { - facing: FacingCubic::North, - open: Open(false), + "facing": FacingCubic::North, + "open": Open(false), }, smoker => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - facing: FacingCardinal::North, - lit: Lit(false), + "facing": FacingCardinal::North, + "lit": Lit(false), }, blast_furnace => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - facing: FacingCardinal::North, - lit: Lit(false), + "facing": FacingCardinal::North, + "lit": Lit(false), }, cartography_table => BlockBehavior::new().strength(2.5, 2.5), {}, fletching_table => BlockBehavior::new().strength(2.5, 2.5), {}, grindstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - face: Face::Wall, - facing: FacingCardinal::North, + "face": Face::Wall, + "facing": FacingCardinal::North, }, lectern => BlockBehavior::new().strength(2.5, 2.5), { - facing: FacingCardinal::North, - has_book: HasBook(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "has_book": HasBook(false), + "powered": Powered(false), }, smithing_table => BlockBehavior::new().strength(2.5, 2.5), {}, stonecutter => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - facing: FacingCardinal::North, + "facing": FacingCardinal::North, }, bell => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 5.0), { - attachment: Attachment::Floor, - facing: FacingCardinal::North, - powered: Powered(false), + "attachment": Attachment::Floor, + "facing": FacingCardinal::North, + "powered": Powered(false), }, lantern => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - hanging: Hanging(false), - waterlogged: Waterlogged(false), + "hanging": Hanging(false), + "waterlogged": Waterlogged(false), }, soul_lantern => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), { - hanging: Hanging(false), - waterlogged: Waterlogged(false), + "hanging": Hanging(false), + "waterlogged": Waterlogged(false), }, campfire => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCardinal::North, - lit: Lit(true), - signal_fire: SignalFire(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "lit": Lit(true), + "signal_fire": SignalFire(false), + "waterlogged": Waterlogged(false), }, soul_campfire => BlockBehavior::new().strength(2.0, 2.0), { - facing: FacingCardinal::North, - lit: Lit(true), - signal_fire: SignalFire(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "lit": Lit(true), + "signal_fire": SignalFire(false), + "waterlogged": Waterlogged(false), }, sweet_berry_bush => BlockBehavior::new(), { - age: SweetBerryBushAge::_0, + "age": SweetBerryBushAge::_0, }, warped_stem => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_warped_stem => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, warped_hyphae => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_warped_hyphae => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, warped_nylium => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.4, 0.4), {}, warped_fungus => BlockBehavior::new(), {}, @@ -4463,156 +4470,156 @@ make_block_states! { warped_roots => BlockBehavior::new(), {}, nether_sprouts => BlockBehavior::new(), {}, crimson_stem => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_crimson_stem => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, crimson_hyphae => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, stripped_crimson_hyphae => BlockBehavior::new().strength(2.0, 2.0), { - axis: Axis::Y, + "axis": Axis::Y, }, crimson_nylium => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.4, 0.4), {}, crimson_fungus => BlockBehavior::new(), {}, shroomlight => BlockBehavior::new().strength(1.0, 1.0), {}, weeping_vines => BlockBehavior::new(), { - age: WeepingVinesAge::_0, + "age": WeepingVinesAge::_0, }, weeping_vines_plant => BlockBehavior::new(), {}, twisting_vines => BlockBehavior::new(), { - age: TwistingVinesAge::_0, + "age": TwistingVinesAge::_0, }, twisting_vines_plant => BlockBehavior::new(), {}, crimson_roots => BlockBehavior::new(), {}, crimson_planks => BlockBehavior::new().strength(2.0, 3.0), {}, warped_planks => BlockBehavior::new().strength(2.0, 3.0), {}, crimson_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, warped_slab => BlockBehavior::new().strength(2.0, 3.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, crimson_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, warped_pressure_plate => BlockBehavior::new().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, crimson_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, warped_fence => BlockBehavior::new().strength(2.0, 3.0), { - east: East(false), - north: North(false), - south: South(false), - waterlogged: Waterlogged(false), - west: West(false), + "east": East(false), + "north": North(false), + "south": South(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, crimson_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, warped_trapdoor => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, crimson_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, warped_fence_gate => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - in_wall: InWall(false), - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "in_wall": InWall(false), + "open": Open(false), + "powered": Powered(false), }, crimson_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, warped_stairs => BlockBehavior::new().strength(2.0, 3.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, crimson_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, warped_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, crimson_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, warped_door => BlockBehavior::new().strength(3.0, 3.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, crimson_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: CrimsonSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": CrimsonSignRotation::_0, + "waterlogged": Waterlogged(false), }, warped_sign => BlockBehavior::new().strength(1.0, 1.0), { - rotation: WarpedSignRotation::_0, - waterlogged: Waterlogged(false), + "rotation": WarpedSignRotation::_0, + "waterlogged": Waterlogged(false), }, crimson_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, warped_wall_sign => BlockBehavior::new().strength(1.0, 1.0), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, structure_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(-1.0, 3600000.0), { - mode: Mode::Load, + "mode": Mode::Load, }, jigsaw => BlockBehavior::new().requires_correct_tool_for_drops().strength(-1.0, 3600000.0), { - orientation: Orientation::NorthUp, + "orientation": Orientation::NorthUp, }, composter => BlockBehavior::new().strength(0.6, 0.6), { - level: ComposterLevel::_0, + "level": ComposterLevel::_0, }, target => BlockBehavior::new().strength(0.5, 0.5), { - power: TargetOutputPower::_0, + "power": TargetOutputPower::_0, }, bee_nest => BlockBehavior::new().strength(0.3, 0.3), { - facing: FacingCardinal::North, - honey_level: BeeNestHoneyLevel::_0, + "facing": FacingCardinal::North, + "honey_level": BeeNestHoneyLevel::_0, }, beehive => BlockBehavior::new().strength(0.6, 0.6), { - facing: FacingCardinal::North, - honey_level: BeehiveHoneyLevel::_0, + "facing": FacingCardinal::North, + "honey_level": BeehiveHoneyLevel::_0, }, honey_block => BlockBehavior::new(), {}, honeycomb_block => BlockBehavior::new().strength(0.6, 0.6), {}, @@ -4620,7 +4627,7 @@ make_block_states! { ancient_debris => BlockBehavior::new().requires_correct_tool_for_drops().strength(30.0, 1200.0), {}, crying_obsidian => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 1200.0), {}, respawn_anchor => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 1200.0), { - charges: RespawnAnchorCharge::_0, + "charges": RespawnAnchorCharge::_0, }, potted_crimson_fungus => BlockBehavior::new(), {}, potted_warped_fungus => BlockBehavior::new(), {}, @@ -4629,319 +4636,319 @@ make_block_states! { lodestone => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 3.5), {}, blackstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, blackstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, blackstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, blackstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_blackstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, polished_blackstone_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, cracked_polished_blackstone_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, chiseled_polished_blackstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, polished_blackstone_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_blackstone_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_blackstone_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, gilded_blackstone => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, polished_blackstone_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_blackstone_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_blackstone_pressure_plate => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.5, 0.5), { - powered: Powered(false), + "powered": Powered(false), }, polished_blackstone_button => BlockBehavior::new().strength(0.5, 0.5), { - face: Face::Wall, - facing: FacingCardinal::North, - powered: Powered(false), + "face": Face::Wall, + "facing": FacingCardinal::North, + "powered": Powered(false), }, polished_blackstone_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, chiseled_nether_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, cracked_nether_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(2.0, 6.0), {}, quartz_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.8, 0.8), {}, candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: CandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": CandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, white_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: WhiteCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": WhiteCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, orange_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: OrangeCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": OrangeCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, magenta_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: MagentaCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": MagentaCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, light_blue_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: LightBlueCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": LightBlueCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, yellow_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: YellowCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": YellowCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, lime_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: LimeCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": LimeCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, pink_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: PinkCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": PinkCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, gray_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: GrayCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": GrayCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, light_gray_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: LightGrayCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": LightGrayCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, cyan_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: CyanCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": CyanCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, purple_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: PurpleCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": PurpleCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, blue_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: BlueCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": BlueCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, brown_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: BrownCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": BrownCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, green_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: GreenCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": GreenCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, red_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: RedCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": RedCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, black_candle => BlockBehavior::new().strength(0.1, 0.1), { - candles: BlackCandleCandles::_1, - lit: Lit(false), - waterlogged: Waterlogged(false), + "candles": BlackCandleCandles::_1, + "lit": Lit(false), + "waterlogged": Waterlogged(false), }, candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, white_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, orange_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, magenta_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, light_blue_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, yellow_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, lime_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, pink_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, gray_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, light_gray_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, cyan_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, purple_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, blue_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, brown_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, green_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, red_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, black_candle_cake => BlockBehavior::new().strength(0.5, 0.5), { - lit: Lit(false), + "lit": Lit(false), }, amethyst_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 1.5), {}, budding_amethyst => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 1.5), {}, amethyst_cluster => BlockBehavior::new().strength(1.5, 1.5), { - facing: FacingCubic::Up, - waterlogged: Waterlogged(false), + "facing": FacingCubic::Up, + "waterlogged": Waterlogged(false), }, large_amethyst_bud => BlockBehavior::new().strength(1.5, 1.5), { - facing: FacingCubic::Up, - waterlogged: Waterlogged(false), + "facing": FacingCubic::Up, + "waterlogged": Waterlogged(false), }, medium_amethyst_bud => BlockBehavior::new().strength(1.5, 1.5), { - facing: FacingCubic::Up, - waterlogged: Waterlogged(false), + "facing": FacingCubic::Up, + "waterlogged": Waterlogged(false), }, small_amethyst_bud => BlockBehavior::new().strength(1.5, 1.5), { - facing: FacingCubic::Up, - waterlogged: Waterlogged(false), + "facing": FacingCubic::Up, + "waterlogged": Waterlogged(false), }, tuff => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, tuff_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, tuff_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, tuff_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, polished_tuff => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, polished_tuff_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_tuff_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_tuff_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, chiseled_tuff => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, tuff_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, tuff_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, tuff_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, tuff_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, chiseled_tuff_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 6.0), {}, calcite => BlockBehavior::new().requires_correct_tool_for_drops().strength(0.75, 0.75), {}, tinted_glass => BlockBehavior::new().strength(0.3, 0.3), {}, powder_snow => BlockBehavior::new().strength(0.25, 0.25), {}, sculk_sensor => BlockBehavior::new().strength(1.5, 1.5), { - power: SculkSensorPower::_0, - sculk_sensor_phase: Phase::Inactive, - waterlogged: Waterlogged(false), + "power": SculkSensorPower::_0, + "sculk_sensor_phase": Phase::Inactive, + "waterlogged": Waterlogged(false), }, calibrated_sculk_sensor => BlockBehavior::new().strength(1.5, 1.5), { - facing: FacingCardinal::North, - power: CalibratedSculkSensorPower::_0, - sculk_sensor_phase: Phase::Inactive, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "power": CalibratedSculkSensorPower::_0, + "sculk_sensor_phase": Phase::Inactive, + "waterlogged": Waterlogged(false), }, sculk => BlockBehavior::new().strength(0.2, 0.2), {}, sculk_vein => BlockBehavior::new().strength(0.2, 0.2), { - down: Down(false), - east: East(false), - north: North(false), - south: South(false), - up: Up(false), - waterlogged: Waterlogged(false), - west: West(false), + "down": Down(false), + "east": East(false), + "north": North(false), + "south": South(false), + "up": Up(false), + "waterlogged": Waterlogged(false), + "west": West(false), }, sculk_catalyst => BlockBehavior::new().strength(3.0, 3.0), { - bloom: Bloom(false), + "bloom": Bloom(false), }, sculk_shrieker => BlockBehavior::new().strength(3.0, 3.0), { - can_summon: CanSummon(false), - shrieking: Shrieking(false), - waterlogged: Waterlogged(false), + "can_summon": CanSummon(false), + "shrieking": Shrieking(false), + "waterlogged": Waterlogged(false), }, copper_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, exposed_copper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, @@ -4962,44 +4969,44 @@ make_block_states! { waxed_exposed_chiseled_copper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, waxed_chiseled_copper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, oxidized_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, weathered_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, exposed_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, oxidized_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, weathered_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, exposed_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, waxed_copper_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, waxed_weathered_copper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, @@ -5010,343 +5017,343 @@ make_block_states! { waxed_exposed_cut_copper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, waxed_cut_copper => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), {}, waxed_oxidized_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, waxed_weathered_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, waxed_exposed_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, waxed_cut_copper_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, waxed_oxidized_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, waxed_weathered_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, waxed_exposed_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, waxed_cut_copper_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, exposed_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, oxidized_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, weathered_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, waxed_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, waxed_exposed_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, waxed_oxidized_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, waxed_weathered_copper_door => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: Half::Lower, - hinge: Hinge::Left, - open: Open(false), - powered: Powered(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "hinge": Hinge::Left, + "open": Open(false), + "powered": Powered(false), }, copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, exposed_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, oxidized_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, weathered_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, waxed_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, waxed_exposed_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, waxed_oxidized_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, waxed_weathered_copper_trapdoor => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - open: Open(false), - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "open": Open(false), + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, exposed_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, weathered_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, oxidized_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, waxed_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, waxed_exposed_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, waxed_weathered_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, waxed_oxidized_copper_grate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, exposed_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, weathered_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, oxidized_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, waxed_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, waxed_exposed_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, waxed_weathered_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, waxed_oxidized_copper_bulb => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - lit: Lit(false), - powered: Powered(false), + "lit": Lit(false), + "powered": Powered(false), }, lightning_rod => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - facing: FacingCubic::Up, - powered: Powered(false), - waterlogged: Waterlogged(false), + "facing": FacingCubic::Up, + "powered": Powered(false), + "waterlogged": Waterlogged(false), }, pointed_dripstone => BlockBehavior::new().strength(1.5, 3.0), { - thickness: Thickness::Tip, - vertical_direction: TipDirection::Up, - waterlogged: Waterlogged(false), + "thickness": Thickness::Tip, + "vertical_direction": TipDirection::Up, + "waterlogged": Waterlogged(false), }, dripstone_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.5, 1.0), {}, cave_vines => BlockBehavior::new(), { - age: CaveVinesAge::_0, - berries: Berries(false), + "age": CaveVinesAge::_0, + "berries": Berries(false), }, cave_vines_plant => BlockBehavior::new(), { - berries: Berries(false), + "berries": Berries(false), }, spore_blossom => BlockBehavior::new(), {}, azalea => BlockBehavior::new(), {}, flowering_azalea => BlockBehavior::new(), {}, moss_carpet => BlockBehavior::new().strength(0.1, 0.1), {}, pink_petals => BlockBehavior::new(), { - facing: FacingCardinal::North, - flower_amount: PinkPetalsAmount::_1, + "facing": FacingCardinal::North, + "flower_amount": PinkPetalsAmount::_1, }, moss_block => BlockBehavior::new().strength(0.1, 0.1), {}, big_dripleaf => BlockBehavior::new().strength(0.1, 0.1), { - facing: FacingCardinal::North, - tilt: Tilt::None, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "tilt": Tilt::None, + "waterlogged": Waterlogged(false), }, big_dripleaf_stem => BlockBehavior::new().strength(0.1, 0.1), { - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, small_dripleaf => BlockBehavior::new(), { - facing: FacingCardinal::North, - half: Half::Lower, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": Half::Lower, + "waterlogged": Waterlogged(false), }, hanging_roots => BlockBehavior::new(), { - waterlogged: Waterlogged(false), + "waterlogged": Waterlogged(false), }, rooted_dirt => BlockBehavior::new().strength(0.5, 0.5), {}, mud => BlockBehavior::new().strength(0.5, 0.5), {}, deepslate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.0, 6.0), { - axis: Axis::Y, + "axis": Axis::Y, }, cobbled_deepslate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, cobbled_deepslate_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, cobbled_deepslate_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, cobbled_deepslate_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, polished_deepslate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, polished_deepslate_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, polished_deepslate_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, polished_deepslate_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, deepslate_tiles => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, deepslate_tile_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, deepslate_tile_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, deepslate_tile_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, deepslate_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, deepslate_brick_stairs => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - facing: FacingCardinal::North, - half: TopBottom::Bottom, - shape: StairShape::Straight, - waterlogged: Waterlogged(false), + "facing": FacingCardinal::North, + "half": TopBottom::Bottom, + "shape": StairShape::Straight, + "waterlogged": Waterlogged(false), }, deepslate_brick_slab => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - kind: Type::Bottom, - waterlogged: Waterlogged(false), + "type": Type::Bottom, + "waterlogged": Waterlogged(false), }, deepslate_brick_wall => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), { - east: EastWall::None, - north: NorthWall::None, - south: SouthWall::None, - up: Up(true), - waterlogged: Waterlogged(false), - west: WestWall::None, + "east": EastWall::None, + "north": NorthWall::None, + "south": SouthWall::None, + "up": Up(true), + "waterlogged": Waterlogged(false), + "west": WestWall::None, }, chiseled_deepslate => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, cracked_deepslate_bricks => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, cracked_deepslate_tiles => BlockBehavior::new().requires_correct_tool_for_drops().strength(3.5, 6.0), {}, infested_deepslate => BlockBehavior::new().strength(1.5, 0.75), { - axis: Falling::Y, + "axis": Falling::Y, }, smooth_basalt => BlockBehavior::new().requires_correct_tool_for_drops().strength(1.25, 4.2), {}, raw_iron_block => BlockBehavior::new().requires_correct_tool_for_drops().strength(5.0, 6.0), {}, @@ -5355,28 +5362,37 @@ make_block_states! { potted_azalea_bush => BlockBehavior::new(), {}, potted_flowering_azalea_bush => BlockBehavior::new(), {}, ochre_froglight => BlockBehavior::new().strength(0.3, 0.3), { - axis: Axis::Y, + "axis": Axis::Y, }, verdant_froglight => BlockBehavior::new().strength(0.3, 0.3), { - axis: Axis::Y, + "axis": Axis::Y, }, pearlescent_froglight => BlockBehavior::new().strength(0.3, 0.3), { - axis: Axis::Y, + "axis": Axis::Y, }, frogspawn => BlockBehavior::new(), {}, reinforced_deepslate => BlockBehavior::new().strength(55.0, 1200.0), {}, decorated_pot => BlockBehavior::new(), { - cracked: Cracked(false), - facing: FacingCardinal::North, - waterlogged: Waterlogged(false), + "cracked": Cracked(false), + "facing": FacingCardinal::North, + "waterlogged": Waterlogged(false), }, crafter => BlockBehavior::new().strength(1.5, 3.5), { - crafting: Crafting(false), - orientation: Orientation::NorthUp, - triggered: Triggered(false), + "crafting": Crafting(false), + "orientation": Orientation::NorthUp, + "triggered": Triggered(false), }, trial_spawner => BlockBehavior::new().requires_correct_tool_for_drops().strength(50.0, 50.0), { - trial_spawner_state: State::Inactive, + "ominous": Ominous(false), + "trial_spawner_state": TrialSpawnerState::Inactive, + }, + vault => BlockBehavior::new(), { + "facing": FacingCardinal::North, + "ominous": Ominous(false), + "vault_state": VaultState::Inactive, + }, + heavy_core => BlockBehavior::new(), { + "waterlogged": Waterlogged(false), }, } } diff --git a/azalea-brigadier/Cargo.toml b/azalea-brigadier/Cargo.toml index d9bfa3637..a26369407 100644 --- a/azalea-brigadier/Cargo.toml +++ b/azalea-brigadier/Cargo.toml @@ -4,14 +4,18 @@ edition = "2021" license = "MIT" name = "azalea-brigadier" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-brigadier" -version = "0.9.0" +version = "0.10.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dev-dependencies] +bevy_app = "0.13.0" +bevy_ecs = "0.13.0" + [dependencies] -azalea-buf = { path = "../azalea-buf", version = "0.9.0", optional = true } -azalea-chat = { path = "../azalea-chat", version = "0.9.0", optional = true } +azalea-buf = { path = "../azalea-buf", version = "0.10.0", optional = true } +azalea-chat = { path = "../azalea-chat", version = "0.10.0", optional = true } parking_lot = "0.12.1" [features] -azalea-buf = ["dep:azalea-buf", "dep:azalea-chat"] +azalea-buf = ["dep:azalea-buf", "dep:azalea-chat", "azalea-chat/azalea-buf"] diff --git a/azalea-brigadier/src/command_dispatcher.rs b/azalea-brigadier/src/command_dispatcher.rs index 3b5987fca..2f4d6ebdd 100755 --- a/azalea-brigadier/src/command_dispatcher.rs +++ b/azalea-brigadier/src/command_dispatcher.rs @@ -65,6 +65,7 @@ impl CommandDispatcher { context_so_far: CommandContextBuilder<'a, S>, ) -> Result, CommandSyntaxException> { let source = context_so_far.source.clone(); + #[allow(clippy::mutable_key_type)] // this is fine because we don't mutate the key let mut errors = HashMap::>, CommandSyntaxException>::new(); let mut potentials: Vec> = vec![]; let cursor = original_reader.cursor(); diff --git a/azalea-brigadier/src/context/command_context_builder.rs b/azalea-brigadier/src/context/command_context_builder.rs index 752958251..95e1b5d8b 100755 --- a/azalea-brigadier/src/context/command_context_builder.rs +++ b/azalea-brigadier/src/context/command_context_builder.rs @@ -63,7 +63,7 @@ impl<'a, S> CommandContextBuilder<'a, S> { } pub fn with_command(&mut self, command: &Command) -> &Self { - self.command = command.clone(); + self.command.clone_from(command); self } pub fn with_child(&mut self, child: Rc>) -> &Self { @@ -80,7 +80,7 @@ impl<'a, S> CommandContextBuilder<'a, S> { range, }); self.range = StringRange::encompassing(&self.range, &range); - self.modifier = node.read().modifier.clone(); + self.modifier.clone_from(&node.read().modifier); self.forks = node.read().forks; self } diff --git a/azalea-brigadier/tests/bevy_app_usage.rs b/azalea-brigadier/tests/bevy_app_usage.rs new file mode 100644 index 000000000..1ed1fc99d --- /dev/null +++ b/azalea-brigadier/tests/bevy_app_usage.rs @@ -0,0 +1,192 @@ +use std::sync::Arc; + +use azalea_brigadier::{ + arguments::integer_argument_type::integer, + builder::{literal_argument_builder::literal, required_argument_builder::argument}, + command_dispatcher::CommandDispatcher, + context::CommandContext, +}; +use bevy_app::App; +use bevy_ecs::{ + component::Component, + query::With, + system::{Query, Resource, RunSystemOnce}, + world::{FromWorld, World}, +}; +use parking_lot::Mutex; + +#[test] +fn bevy_app() { + let mut app = App::new(); + + // Initialize the dispatcher using FromWorld + app.init_resource::(); + + // Process commands from bevy + app.world + .run_system_once(DispatchStorage::bevy_process_commands); + + // Verify spawned entities exist after processing commands + app.world + .run_system_once(DispatchStorage::verify_spawned_entities); +} + +#[derive(Resource)] +struct DispatchStorage { + /// The [`CommandDispatcher`]. + /// + /// Processes incoming commands. + dispatch: CommandDispatcher, + /// The world accessor. + /// + /// Allows the dispatcher to query the [`World`]. + world: WorldAccessor, +} + +/// Implement [`FromWorld`] to initialize the dispatcher. +/// +/// Allows the dispatcher to query the [`World`] +/// for generating commands on startup. +impl FromWorld for DispatchStorage { + fn from_world(_: &mut World) -> Self { + let mut dispatch = CommandDispatcher::new(); + + // Register dispatcher commands + { + // Register the "spawn_entity" command + dispatch + .register(literal("spawn_entity").executes(DispatchStorage::command_spawn_entity)); + + // Register the "spawn_entity_num" command + dispatch.register(literal("spawn_entity_num").then( + argument("entities", integer()).executes(DispatchStorage::command_spawn_entity_num), + )); + } + + Self { + dispatch, + world: WorldAccessor::empty(), + } + } +} + +impl DispatchStorage { + /// A bevy system called to process commands. + fn bevy_process_commands(world: &mut World) { + world.resource_scope::(|bevy_world, mut storage| { + // NOTE: Initial swap to own bevy's `World` + // + // This is important, otherwise the dispatcher + // will only be able to access it's own empty `World`. + storage.world.swap(bevy_world); + + let source = storage.world.clone(); + + // Test "spawn_entity" + { + println!("Testing 'spawn_entity' command"); + let result = storage.dispatch.execute("spawn_entity", source.clone()); + + // Ensure the command was successful + assert_eq!(result, Ok(0)); + + // Query the World for the spawned entity + let mut world = source.lock(); + let mut query = world.query_filtered::<(), With>(); + + // Ensure only one entity was spawned + let count = query.iter(&world).count(); + println!("Spawned entities: {count}"); + assert_eq!(count, 1); + } + + // Test "spawn_entity_num" + { + println!("Testing 'spawn_entity_num' command"); + let result = storage + .dispatch + .execute("spawn_entity_num 3", source.clone()); + + // Ensure the command was successful + assert_eq!(result, Ok(0)); + + // Query the World for spawned entities + let mut world = source.lock(); + let mut query = world.query_filtered::<(), With>(); + + // Ensure three additional entities were spawned + let count = query.iter(&world).count(); + println!("Spawned entities: {count}"); + assert_eq!(count, 4); + } + + // NOTE: Second swap to give bevy's `World` back + // + // It's even more important to give the `World` back + // after commands are executed, otherwise your app + // will be stuck with an empty `World`. + storage.world.swap(bevy_world); + }); + } + + /// A command called from the dispatcher. + /// + /// Spawns an entity with the [`SpawnedEntity`] component. + fn command_spawn_entity(context: &CommandContext) -> i32 { + context.source.lock().spawn(SpawnedEntity); + + 0 + } + + /// A command called from the dispatcher. + /// + /// Spawns a number of entities with the [`SpawnedEntity`] component. + fn command_spawn_entity_num(context: &CommandContext) -> i32 { + let num = context.argument("entities").unwrap(); + let num = *num.downcast_ref::().unwrap(); + + for _ in 0..num { + context.source.lock().spawn(SpawnedEntity); + } + + 0 + } + + /// A bevy system called to verify four total entities was spawned. + fn verify_spawned_entities(query: Query<(), With>) { + assert_eq!(query.iter().count(), 4); + } +} + +/// A wrapper around a [`World`] that allows for +/// access from inside a [`CommandDispatcher`]. +#[derive(Clone)] +struct WorldAccessor { + world: Arc>, +} + +impl WorldAccessor { + /// Create a new empty [`WorldAccessor`]. + fn empty() -> Self { + Self { + world: Arc::new(Mutex::new(World::new())), + } + } + + /// Swap the internal [`World`] with the given one. + fn swap(&mut self, world: &mut World) { + std::mem::swap(&mut *self.lock(), world); + } +} + +/// A marker [`Component`] used to test spawning entities from the dispatcher. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Component)] +struct SpawnedEntity; + +/// Implemented for convenience. +impl std::ops::Deref for WorldAccessor { + type Target = Arc>; + fn deref(&self) -> &Self::Target { + &self.world + } +} diff --git a/azalea-buf/Cargo.toml b/azalea-buf/Cargo.toml index eb4325802..f7909b299 100644 --- a/azalea-buf/Cargo.toml +++ b/azalea-buf/Cargo.toml @@ -4,18 +4,18 @@ edition = "2021" license = "MIT" name = "azalea-buf" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-buf" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -azalea-buf-macros = { path = "./azalea-buf-macros", version = "0.9.0" } +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +azalea-buf-macros = { path = "./azalea-buf-macros", version = "0.10.0" } byteorder = "^1.5.0" tracing = "0.1.40" serde_json = { version = "^1.0", optional = true } -thiserror = "1.0.57" -uuid = "^1.7.0" +thiserror = "1.0.59" +uuid = "^1.8.0" [features] serde_json = ["dep:serde_json"] diff --git a/azalea-buf/azalea-buf-macros/Cargo.toml b/azalea-buf/azalea-buf-macros/Cargo.toml index 0bef0aca2..61dd76ee9 100644 --- a/azalea-buf/azalea-buf-macros/Cargo.toml +++ b/azalea-buf/azalea-buf-macros/Cargo.toml @@ -4,13 +4,13 @@ edition = "2021" license = "MIT" name = "azalea-buf-macros" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-buf" -version = "0.9.0" +version = "0.10.0" [lib] proc-macro = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -proc-macro2 = "^1.0.78" -quote = "^1.0.35" -syn = { version = "^2.0.49", features = ["extra-traits"] } +proc-macro2 = "^1.0.81" +quote = "^1.0.36" +syn = { version = "^2.0.60", features = ["extra-traits"] } diff --git a/azalea-buf/azalea-buf-macros/src/read.rs b/azalea-buf/azalea-buf-macros/src/read.rs index c3e9595c7..c5c484e77 100644 --- a/azalea-buf/azalea-buf-macros/src/read.rs +++ b/azalea-buf/azalea-buf-macros/src/read.rs @@ -38,24 +38,34 @@ fn read_named_fields( pub fn create_impl_mcbufreadable(ident: &Ident, data: &Data) -> proc_macro2::TokenStream { match data { - syn::Data::Struct(syn::DataStruct { fields, .. }) => { - let syn::Fields::Named(FieldsNamed { named, .. }) = fields else { - panic!("#[derive(McBuf)] can only be used on structs with named fields") - }; - - let (read_fields, read_field_names) = read_named_fields(named); + syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { + syn::Fields::Named(FieldsNamed { named, .. }) => { + let (read_fields, read_field_names) = read_named_fields(named); - quote! { - impl azalea_buf::McBufReadable for #ident { - fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { - #(#read_fields)* - Ok(#ident { - #(#read_field_names: #read_field_names),* - }) + quote! { + impl azalea_buf::McBufReadable for #ident { + fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { + #(#read_fields)* + Ok(Self { + #(#read_field_names: #read_field_names),* + }) + } + } } } + syn::Fields::Unit => { + quote! { + impl azalea_buf::McBufReadable for #ident { + fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { + Ok(Self) + } + } + } } - } + _ => { + panic!("#[derive(McBuf)] can only be used on structs with named fields") + } + }, syn::Data::Enum(syn::DataEnum { variants, .. }) => { let mut match_contents = quote!(); let mut variant_discrim: u32 = 0; diff --git a/azalea-buf/azalea-buf-macros/src/write.rs b/azalea-buf/azalea-buf-macros/src/write.rs index 35c2d49a1..4d31f39e8 100644 --- a/azalea-buf/azalea-buf-macros/src/write.rs +++ b/azalea-buf/azalea-buf-macros/src/write.rs @@ -39,23 +39,33 @@ fn write_named_fields( pub fn create_impl_mcbufwritable(ident: &Ident, data: &Data) -> proc_macro2::TokenStream { match data { - syn::Data::Struct(syn::DataStruct { fields, .. }) => { - let syn::Fields::Named(FieldsNamed { named, .. }) = fields else { - panic!("#[derive(McBuf)] can only be used on structs with named fields") - }; - - let write_fields = - write_named_fields(named, Some(&Ident::new("self", Span::call_site()))); + syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields { + syn::Fields::Named(FieldsNamed { named, .. }) => { + let write_fields = + write_named_fields(named, Some(&Ident::new("self", Span::call_site()))); - quote! { - impl azalea_buf::McBufWritable for #ident { - fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - #write_fields - Ok(()) + quote! { + impl azalea_buf::McBufWritable for #ident { + fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { + #write_fields + Ok(()) + } } } } - } + syn::Fields::Unit => { + quote! { + impl azalea_buf::McBufWritable for #ident { + fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { + Ok(()) + } + } + } + } + _ => { + panic!("#[derive(McBuf)] can only be used on structs with named fields") + } + }, syn::Data::Enum(syn::DataEnum { variants, .. }) => { // remember whether it's a data variant so we can do an optimization later let mut is_data_enum = false; diff --git a/azalea-buf/src/read.rs b/azalea-buf/src/read.rs index d5c4d0a85..40889c644 100755 --- a/azalea-buf/src/read.rs +++ b/azalea-buf/src/read.rs @@ -103,17 +103,6 @@ fn read_utf_with_len(buf: &mut Cursor<&[u8]>, max_length: u32) -> Result Result { let mut buffer = [0]; let mut ans = 0; for i -// in 0..5 { reader.read_exact(&mut buffer).await?; ans |= ((buffer[0] & -// 0b0111_1111) as i32) << (7 * i); if buffer[0] & 0b1000_0000 == 0 { break; } -// } Ok(ans) -// } - pub trait McBufReadable where Self: Sized, @@ -370,6 +359,15 @@ impl McBufReadable for simdnbt::owned::NbtCompound { impl McBufReadable for simdnbt::owned::Nbt { fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - Ok(simdnbt::owned::Nbt::read_unnamed(buf)?) + Ok(simdnbt::owned::read_unnamed(buf)?) + } +} + +impl McBufReadable for Box +where + T: McBufReadable, +{ + fn read_from(buf: &mut Cursor<&[u8]>) -> Result { + Ok(Box::new(T::read_from(buf)?)) } } diff --git a/azalea-buf/src/write.rs b/azalea-buf/src/write.rs index c8d1f9907..61dedfd86 100755 --- a/azalea-buf/src/write.rs +++ b/azalea-buf/src/write.rs @@ -41,7 +41,7 @@ impl McBufVarWritable for i32 { } while value != 0 { buffer[0] = (value & 0b0111_1111) as u8; - value = (value >> 7) & (i32::max_value() >> 6); + value = (value >> 7) & (i32::MAX >> 6); if value != 0 { buffer[0] |= 0b1000_0000; } @@ -137,7 +137,7 @@ impl McBufVarWritable for i64 { } while value != 0 { buffer[0] = (value & 0b0111_1111) as u8; - value = (value >> 7) & (i64::max_value() >> 6); + value = (value >> 7) & (i64::MAX >> 6); if value != 0 { buffer[0] |= 0b1000_0000; } @@ -281,3 +281,12 @@ impl McBufWritable for simdnbt::owned::Nbt { buf.write_all(&data) } } + +impl McBufWritable for Box +where + T: McBufWritable, +{ + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + T::write_into(&**self, buf) + } +} diff --git a/azalea-chat/Cargo.toml b/azalea-chat/Cargo.toml index 2536bfaa7..e293aecad 100644 --- a/azalea-chat/Cargo.toml +++ b/azalea-chat/Cargo.toml @@ -4,24 +4,24 @@ edition = "2021" license = "MIT" name = "azalea-chat" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-chat" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] default = [] +simdnbt = ["dep:simdnbt"] azalea-buf = ["dep:azalea-buf", "simdnbt"] numbers = ["dep:azalea-registry", "dep:simdnbt"] -simdnbt = ["dep:simdnbt"] [dependencies] azalea-buf = { path = "../azalea-buf", features = [ "serde_json", -], version = "0.9.0", optional = true } -azalea-language = { path = "../azalea-language", version = "0.9.0" } -simdnbt = { version = "0.4", optional = true, git = "https://github.com/azalea-rs/simdnbt" } +], version = "0.10.0", optional = true } +azalea-language = { path = "../azalea-language", version = "0.10.0" } +simdnbt = { version = "0.5", optional = true, git = "https://github.com/azalea-rs/simdnbt" } tracing = "0.1.40" once_cell = "1.19.0" serde = { version = "^1.0", features = ["derive"] } -serde_json = "^1.0.113" -azalea-registry = { path = "../azalea-registry", version = "0.9.0", optional = true } +serde_json = "^1.0.116" +azalea-registry = { path = "../azalea-registry", version = "0.10.0", optional = true } diff --git a/azalea-chat/src/component.rs b/azalea-chat/src/component.rs index d301aba15..6916928ae 100755 --- a/azalea-chat/src/component.rs +++ b/azalea-chat/src/component.rs @@ -308,65 +308,89 @@ impl simdnbt::FromNbtTag for FormattedText { } else if let Some(translate) = compound.get("translate") { let translate = translate.string()?.into(); if let Some(with) = compound.get("with") { - let with = with.list()?.compounds()?; - let mut with_array = Vec::with_capacity(with.len()); - for item in with { - // if it's a string component with no styling and no siblings, just add - // a string to with_array otherwise add the - // component to the array - if let Some(primitive) = item.get("") { - // minecraft does this sometimes, for example - // for the /give system messages - match primitive { - simdnbt::borrow::NbtTag::Byte(b) => { - // interpreted as boolean - with_array.push(StringOrComponent::String( - if *b != 0 { "true" } else { "false" }.to_string(), + let mut with_array = Vec::new(); + match with.list()? { + simdnbt::borrow::NbtList::Empty => {} + simdnbt::borrow::NbtList::String(with) => { + for item in *with { + with_array.push(StringOrComponent::String(item.to_string())); + } + } + simdnbt::borrow::NbtList::Compound(with) => { + for item in *with { + // if it's a string component with no styling and no siblings, + // just add a string to + // with_array otherwise add the + // component to the array + if let Some(primitive) = item.get("") { + // minecraft does this sometimes, for example + // for the /give system messages + match primitive { + simdnbt::borrow::NbtTag::Byte(b) => { + // interpreted as boolean + with_array.push(StringOrComponent::String( + if *b != 0 { "true" } else { "false" } + .to_string(), + )); + } + simdnbt::borrow::NbtTag::Short(s) => { + with_array + .push(StringOrComponent::String(s.to_string())); + } + simdnbt::borrow::NbtTag::Int(i) => { + with_array + .push(StringOrComponent::String(i.to_string())); + } + simdnbt::borrow::NbtTag::Long(l) => { + with_array + .push(StringOrComponent::String(l.to_string())); + } + simdnbt::borrow::NbtTag::Float(f) => { + with_array + .push(StringOrComponent::String(f.to_string())); + } + simdnbt::borrow::NbtTag::Double(d) => { + with_array + .push(StringOrComponent::String(d.to_string())); + } + simdnbt::borrow::NbtTag::String(s) => { + with_array + .push(StringOrComponent::String(s.to_string())); + } + _ => { + warn!("couldn't parse {item:?} as FormattedText because it has a disallowed primitive"); + with_array.push(StringOrComponent::String( + "?".to_string(), + )); + } + } + } else if let Some(c) = FormattedText::from_nbt_tag( + &simdnbt::borrow::NbtTag::Compound(item.clone()), + ) { + if let FormattedText::Text(text_component) = c { + if text_component.base.siblings.is_empty() + && text_component.base.style.is_empty() + { + with_array.push(StringOrComponent::String( + text_component.text, + )); + continue; + } + } + with_array.push(StringOrComponent::FormattedText( + FormattedText::from_nbt_tag( + &simdnbt::borrow::NbtTag::Compound(item.clone()), + )?, )); - } - simdnbt::borrow::NbtTag::Short(s) => { - with_array.push(StringOrComponent::String(s.to_string())); - } - simdnbt::borrow::NbtTag::Int(i) => { - with_array.push(StringOrComponent::String(i.to_string())); - } - simdnbt::borrow::NbtTag::Long(l) => { - with_array.push(StringOrComponent::String(l.to_string())); - } - simdnbt::borrow::NbtTag::Float(f) => { - with_array.push(StringOrComponent::String(f.to_string())); - } - simdnbt::borrow::NbtTag::Double(d) => { - with_array.push(StringOrComponent::String(d.to_string())); - } - simdnbt::borrow::NbtTag::String(s) => { - with_array.push(StringOrComponent::String(s.to_string())); - } - _ => { - warn!("couldn't parse {item:?} as FormattedText because it has a disallowed primitive"); + } else { + warn!("couldn't parse {item:?} as FormattedText"); with_array.push(StringOrComponent::String("?".to_string())); } } - } else if let Some(c) = FormattedText::from_nbt_tag( - &simdnbt::borrow::NbtTag::Compound(item.clone()), - ) { - if let FormattedText::Text(text_component) = c { - if text_component.base.siblings.is_empty() - && text_component.base.style.is_empty() - { - with_array - .push(StringOrComponent::String(text_component.text)); - continue; - } - } - with_array.push(StringOrComponent::FormattedText( - FormattedText::from_nbt_tag( - &simdnbt::borrow::NbtTag::Compound(item.clone()), - )?, - )); - } else { - warn!("couldn't parse {item:?} as FormattedText"); - with_array.push(StringOrComponent::String("?".to_string())); + } + _ => { + warn!("couldn't parse {with:?} as FormattedText because it's not a list of compounds"); + return None; } } component = FormattedText::Translatable(TranslatableComponent::new( @@ -396,6 +420,8 @@ impl simdnbt::FromNbtTag for FormattedText { // keybind text components aren't yet supported trace!("keybind text components aren't yet supported"); return None; + } else if let Some(tag) = compound.get("") { + return FormattedText::from_nbt_tag(tag); } else { let _nbt = compound.get("nbt")?; let _separator = FormattedText::parse_separator_nbt(compound)?; @@ -444,12 +470,14 @@ impl simdnbt::FromNbtTag for FormattedText { } #[cfg(feature = "azalea-buf")] +#[cfg(feature = "simdnbt")] impl McBufReadable for FormattedText { fn read_from(buf: &mut std::io::Cursor<&[u8]>) -> Result { - let nbt = simdnbt::borrow::NbtTag::read_optional(buf)?; + let nbt = simdnbt::borrow::read_optional_tag(buf)?; if let Some(nbt) = nbt { - FormattedText::from_nbt_tag(&nbt) - .ok_or(BufReadError::Custom("couldn't read nbt".to_owned())) + FormattedText::from_nbt_tag(&nbt).ok_or(BufReadError::Custom( + "couldn't convert nbt to chat message".to_owned(), + )) } else { Ok(FormattedText::default()) } diff --git a/azalea-chat/src/numbers.rs b/azalea-chat/src/numbers.rs index 21c305911..a5a88c4f9 100644 --- a/azalea-chat/src/numbers.rs +++ b/azalea-chat/src/numbers.rs @@ -24,7 +24,7 @@ impl McBufReadable for NumberFormat { match kind { NumberFormatKind::Blank => Ok(NumberFormat::Blank), NumberFormatKind::Styled => Ok(NumberFormat::Styled { - style: Nbt::read(buf)?, + style: simdnbt::owned::read(buf)?, }), NumberFormatKind::Fixed => Ok(NumberFormat::Fixed { value: FormattedText::read_from(buf)?, diff --git a/azalea-client/Cargo.toml b/azalea-client/Cargo.toml index cbf2b1deb..85d61e6d9 100644 --- a/azalea-client/Cargo.toml +++ b/azalea-client/Cargo.toml @@ -4,45 +4,45 @@ edition = "2021" license = "MIT" name = "azalea-client" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-client" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -reqwest = { version = "0.11.24", default-features = false } -anyhow = "1.0.79" -async-trait = "0.1.77" -azalea-auth = { path = "../azalea-auth", version = "0.9.0" } -azalea-block = { path = "../azalea-block", version = "0.9.0" } -azalea-chat = { path = "../azalea-chat", version = "0.9.0" } -azalea-core = { path = "../azalea-core", version = "0.9.0" } -azalea-crypto = { path = "../azalea-crypto", version = "0.9.0" } -azalea-physics = { path = "../azalea-physics", version = "0.9.0" } -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-protocol = { path = "../azalea-protocol", version = "0.9.0" } -azalea-registry = { path = "../azalea-registry", version = "0.9.0" } -azalea-world = { path = "../azalea-world", version = "0.9.0" } -bevy_app = "0.13.0" -bevy_ecs = "0.13.0" -bevy_log = { version = "0.13.0", optional = true } -bevy_tasks = "0.13.0" -bevy_time = "0.13.0" -azalea-inventory = { path = "../azalea-inventory", version = "0.9.0" } +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +reqwest = { version = "0.12.4", default-features = false } +anyhow = "1.0.82" +async-trait = "0.1.80" +azalea-auth = { path = "../azalea-auth", version = "0.10.0" } +azalea-block = { path = "../azalea-block", version = "0.10.0" } +azalea-chat = { path = "../azalea-chat", version = "0.10.0" } +azalea-core = { path = "../azalea-core", version = "0.10.0" } +azalea-crypto = { path = "../azalea-crypto", version = "0.10.0" } +azalea-physics = { path = "../azalea-physics", version = "0.10.0" } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-protocol = { path = "../azalea-protocol", version = "0.10.0" } +azalea-registry = { path = "../azalea-registry", version = "0.10.0" } +azalea-world = { path = "../azalea-world", version = "0.10.0" } +bevy_app = "0.13.2" +bevy_ecs = "0.13.2" +bevy_log = { version = "0.13.2", optional = true } +bevy_tasks = "0.13.2" +bevy_time = "0.13.2" derive_more = { version = "0.99.17", features = ["deref", "deref_mut"] } futures = "0.3.30" tracing = "0.1.40" nohash-hasher = "0.2.0" once_cell = "1.19.0" parking_lot = { version = "^0.12.1", features = ["deadlock_detection"] } -regex = "1.10.3" -thiserror = "^1.0.57" -tokio = { version = "^1.36.0", features = ["sync"] } -uuid = "^1.7.0" -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } -serde_json = "1.0.113" -serde = "1.0.196" +regex = "1.10.4" +thiserror = "^1.0.59" +tokio = { version = "^1.37.0", features = ["sync"] } +uuid = "^1.8.0" +serde_json = "1.0.116" +serde = "1.0.198" minecraft_folder_path = "0.1.2" +azalea-entity = { version = "0.10.0", path = "../azalea-entity" } +azalea-inventory = { version = "0.10.0", path = "../azalea-inventory" } [features] default = ["log"] diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs index af5354159..02d400fda 100644 --- a/azalea-client/src/client.rs +++ b/azalea-client/src/client.rs @@ -34,7 +34,7 @@ use azalea_entity::{ }; use azalea_physics::PhysicsPlugin; use azalea_protocol::{ - connect::{Connection, ConnectionError}, + connect::{Connection, ConnectionError, Proxy}, packets::{ configuration::{ serverbound_client_information_packet::ClientInformation, @@ -51,7 +51,7 @@ use azalea_protocol::{ serverbound_login_acknowledged_packet::ServerboundLoginAcknowledgedPacket, ClientboundLoginPacket, }, - ConnectionProtocol, PROTOCOL_VERSION, + ClientIntention, ConnectionProtocol, PROTOCOL_VERSION, }, resolver, ServerAddress, }; @@ -138,6 +138,45 @@ pub enum JoinError { Disconnect { reason: FormattedText }, } +pub struct StartClientOpts<'a> { + pub ecs_lock: Arc>, + pub account: &'a Account, + pub address: &'a ServerAddress, + pub resolved_address: &'a SocketAddr, + pub proxy: Option, + pub run_schedule_sender: mpsc::UnboundedSender<()>, +} + +impl<'a> StartClientOpts<'a> { + pub fn new( + account: &'a Account, + address: &'a ServerAddress, + resolved_address: &'a SocketAddr, + ) -> StartClientOpts<'a> { + // An event that causes the schedule to run. This is only used internally. + let (run_schedule_sender, run_schedule_receiver) = mpsc::unbounded_channel(); + + let mut app = App::new(); + app.add_plugins(DefaultPlugins); + + let ecs_lock = start_ecs_runner(app, run_schedule_receiver, run_schedule_sender.clone()); + + Self { + ecs_lock, + account, + address, + resolved_address, + proxy: None, + run_schedule_sender, + } + } + + pub fn proxy(mut self, proxy: Proxy) -> Self { + self.proxy = Some(proxy); + self + } +} + impl Client { /// Create a new client from the given [`GameProfile`], ECS Entity, ECS /// World, and schedule runner function. @@ -187,32 +226,32 @@ impl Client { let address: ServerAddress = address.try_into().map_err(|_| JoinError::InvalidAddress)?; let resolved_address = resolver::resolve_address(&address).await?; - // An event that causes the schedule to run. This is only used internally. - let (run_schedule_sender, run_schedule_receiver) = mpsc::unbounded_channel(); - - let mut app = App::new(); - app.add_plugins(DefaultPlugins); + Self::start_client(StartClientOpts::new(account, &address, &resolved_address)).await + } - let ecs_lock = start_ecs_runner(app, run_schedule_receiver, run_schedule_sender.clone()); + pub async fn join_with_proxy( + account: &Account, + address: impl TryInto, + proxy: Proxy, + ) -> Result<(Self, mpsc::UnboundedReceiver), JoinError> { + let address: ServerAddress = address.try_into().map_err(|_| JoinError::InvalidAddress)?; + let resolved_address = resolver::resolve_address(&address).await?; - Self::start_client( - ecs_lock, - account, - &address, - &resolved_address, - run_schedule_sender, - ) - .await + Self::start_client(StartClientOpts::new(account, &address, &resolved_address).proxy(proxy)) + .await } /// Create a [`Client`] when you already have the ECS made with /// [`start_ecs_runner`]. You'd usually want to use [`Self::join`] instead. pub async fn start_client( - ecs_lock: Arc>, - account: &Account, - address: &ServerAddress, - resolved_address: &SocketAddr, - run_schedule_sender: mpsc::UnboundedSender<()>, + StartClientOpts { + ecs_lock, + account, + address, + resolved_address, + proxy, + run_schedule_sender, + }: StartClientOpts<'_>, ) -> Result<(Self, mpsc::UnboundedReceiver), JoinError> { // check if an entity with our uuid already exists in the ecs and if so then // just use that @@ -239,7 +278,11 @@ impl Client { entity }; - let conn = Connection::new(resolved_address).await?; + let conn = if let Some(proxy) = proxy { + Connection::new_with_proxy(resolved_address, proxy).await? + } else { + Connection::new(resolved_address).await? + }; let (conn, game_profile) = Self::handshake(ecs_lock.clone(), entity, conn, account, address).await?; @@ -263,6 +306,14 @@ impl Client { run_schedule_sender.clone(), ); + let instance = Instance::default(); + let instance_holder = crate::local_player::InstanceHolder::new( + entity, + // default to an empty world, it'll be set correctly later when we + // get the login packet + Arc::new(RwLock::new(instance)), + ); + ecs.entity_mut(entity).insert(( // these stay when we switch to the game state LocalPlayerBundle { @@ -275,6 +326,7 @@ impl Client { local_player_events: LocalPlayerEvents(tx), game_profile: GameProfileComponent(game_profile), client_information: crate::ClientInformation::default(), + instance_holder, }, InConfigurationState, )); @@ -306,7 +358,7 @@ impl Client { protocol_version: PROTOCOL_VERSION, hostname: address.host.clone(), port: address.port, - intention: ConnectionProtocol::Login, + intention: ClientIntention::Login, } .get(), ) @@ -351,7 +403,7 @@ impl Client { match packet { ClientboundLoginPacket::Hello(p) => { debug!("Got encryption request"); - let e = azalea_crypto::encrypt(&p.public_key, &p.nonce).unwrap(); + let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap(); if let Some(access_token) = &account.access_token { // keep track of the number of times we tried @@ -393,7 +445,7 @@ impl Client { conn.write( ServerboundKeyPacket { key_bytes: e.encrypted_public_key, - encrypted_challenge: e.encrypted_nonce, + encrypted_challenge: e.encrypted_challenge, } .get(), ) @@ -423,6 +475,9 @@ impl Client { // replying to custom query is done in // packet_handling::login::process_packet_events } + ClientboundLoginPacket::CookieRequest(p) => { + debug!("Got cookie request {:?}", p); + } } }; @@ -623,6 +678,7 @@ pub struct LocalPlayerBundle { pub local_player_events: LocalPlayerEvents, pub game_profile: GameProfileComponent, pub client_information: ClientInformation, + pub instance_holder: InstanceHolder, } /// A bundle for the components that are present on a local player that is diff --git a/azalea-client/src/interact.rs b/azalea-client/src/interact.rs index 8a3aa49b5..14fea4079 100644 --- a/azalea-client/src/interact.rs +++ b/azalea-client/src/interact.rs @@ -17,6 +17,7 @@ use azalea_protocol::packets::game::{ serverbound_swing_packet::ServerboundSwingPacket, serverbound_use_item_on_packet::{BlockHit, ServerboundUseItemOnPacket}, }; +use azalea_registry::DataComponentKind; use azalea_world::{Instance, InstanceContainer, InstanceName}; use bevy_app::{App, Plugin, Update}; use bevy_ecs::{ @@ -28,7 +29,6 @@ use bevy_ecs::{ system::{Commands, Query, Res}, }; use derive_more::{Deref, DerefMut}; -use simdnbt::owned::NbtList; use tracing::warn; use crate::{ @@ -269,20 +269,11 @@ pub fn check_block_can_be_broken_by_item_in_adventure_mode( // minecraft caches the last checked block but that's kind of an unnecessary // optimization and makes the code too complicated - let Some(can_destroy) = item - .nbt - .compound("tag") - .and_then(|nbt| nbt.list("CanDestroy")) - else { + let Some(_can_destroy) = item.components.get(DataComponentKind::CanBreak) else { // no CanDestroy tag return false; }; - let NbtList::String(_can_destroy) = can_destroy else { - // CanDestroy tag must be a list of strings - return false; - }; - false // for block_predicate in can_destroy { diff --git a/azalea-client/src/inventory.rs b/azalea-client/src/inventory.rs index 4bfed69f2..97eb98eaf 100644 --- a/azalea-client/src/inventory.rs +++ b/azalea-client/src/inventory.rs @@ -252,7 +252,7 @@ impl InventoryComponent { // && slot.may_place(item_stack) && ( self.quick_craft_kind == QuickCraftKind::Middle - || item_stack.count() as i32 >= self.quick_craft_slots.len() as i32 + || item_stack.count() >= self.quick_craft_slots.len() as i32 ) { break; @@ -273,9 +273,9 @@ impl InventoryComponent { &mut new_carried, slot_item_count, ); - let max_stack_size = i8::min( + let max_stack_size = i32::min( new_carried.kind.max_stack_size(), - i8::min( + i32::min( new_carried.kind.max_stack_size(), slot.kind.max_stack_size(), ), @@ -391,7 +391,7 @@ impl InventoryComponent { }; if self.menu().may_place(source_slot_index, target_item) { let source_max_stack = self.menu().max_stack_size(source_slot_index); - if target_slot.count() > source_max_stack as i8 { + if target_slot.count() > source_max_stack as i32 { // if there's more than the max stack size in the target slot let target_slot = self.menu_mut().slot_mut(target_slot_index).unwrap(); @@ -449,7 +449,7 @@ impl InventoryComponent { ThrowClick::All { .. } => slot_item.count, }; - let _dropping = slot_item.split(dropping_count as u8); + let _dropping = slot_item.split(dropping_count as u32); // player.drop(dropping, true); } ClickOperation::PickupAll(PickupAllClick { @@ -492,7 +492,7 @@ impl InventoryComponent { let checking_slot = self.menu_mut().slot_mut(i).unwrap(); let taken_item = - checking_slot.split(checking_slot.count() as u8); + checking_slot.split(checking_slot.count() as u32); // now extend the carried item let target_slot = &mut self.carried; @@ -537,7 +537,7 @@ fn can_item_quick_replace( return false; }; - if !item.is_same_item_and_nbt(target_slot) { + if !item.is_same_item_and_components(target_slot) { return false; } let count = target_slot.count as u16 @@ -553,10 +553,10 @@ fn get_quick_craft_slot_count( quick_craft_slots: &HashSet, quick_craft_kind: &QuickCraftKind, item: &mut ItemSlotData, - slot_item_count: i8, + slot_item_count: i32, ) { item.count = match quick_craft_kind { - QuickCraftKind::Left => item.count / quick_craft_slots.len() as i8, + QuickCraftKind::Left => item.count / quick_craft_slots.len() as i32, QuickCraftKind::Right => 1, QuickCraftKind::Middle => item.kind.max_stack_size(), }; diff --git a/azalea-client/src/lib.rs b/azalea-client/src/lib.rs index 41399ce97..ec19e3ace 100644 --- a/azalea-client/src/lib.rs +++ b/azalea-client/src/lib.rs @@ -32,7 +32,8 @@ pub mod task_pool; pub use account::{Account, AccountOpts}; pub use azalea_protocol::packets::configuration::serverbound_client_information_packet::ClientInformation; pub use client::{ - start_ecs_runner, Client, DefaultPlugins, JoinError, JoinedClientBundle, TickBroadcast, + start_ecs_runner, Client, DefaultPlugins, JoinError, JoinedClientBundle, StartClientOpts, + TickBroadcast, }; pub use events::Event; pub use local_player::{GameProfileComponent, InstanceHolder, TabList}; diff --git a/azalea-client/src/packet_handling/configuration.rs b/azalea-client/src/packet_handling/configuration.rs index da5ce57fe..1be34a129 100644 --- a/azalea-client/src/packet_handling/configuration.rs +++ b/azalea-client/src/packet_handling/configuration.rs @@ -1,20 +1,18 @@ use std::io::Cursor; -use std::sync::Arc; use azalea_entity::indexing::EntityIdIndex; use azalea_protocol::packets::configuration::serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket; use azalea_protocol::packets::configuration::serverbound_keep_alive_packet::ServerboundKeepAlivePacket; use azalea_protocol::packets::configuration::serverbound_pong_packet::ServerboundPongPacket; use azalea_protocol::packets::configuration::serverbound_resource_pack_packet::ServerboundResourcePackPacket; +use azalea_protocol::packets::configuration::serverbound_select_known_packs_packet::ServerboundSelectKnownPacksPacket; use azalea_protocol::packets::configuration::{ ClientboundConfigurationPacket, ServerboundConfigurationPacket, }; use azalea_protocol::packets::ConnectionProtocol; use azalea_protocol::read::deserialize_packet; -use azalea_world::Instance; use bevy_ecs::prelude::*; use bevy_ecs::system::SystemState; -use parking_lot::RwLock; use tracing::{debug, error, warn}; use crate::client::InConfigurationState; @@ -22,6 +20,7 @@ use crate::disconnect::DisconnectEvent; use crate::local_player::Hunger; use crate::packet_handling::game::KeepAliveEvent; use crate::raw_connection::RawConnection; +use crate::InstanceHolder; #[derive(Event, Debug, Clone)] pub struct ConfigurationPacketEvent { @@ -50,6 +49,7 @@ pub fn send_packet_events( Ok(packet) => packet, Err(err) => { error!("failed to read packet: {:?}", err); + debug!("packet bytes: {:?}", raw_packet); continue; } }; @@ -80,21 +80,14 @@ pub fn process_packet_events(ecs: &mut World) { for (player_entity, packet) in events_owned { match packet { ClientboundConfigurationPacket::RegistryData(p) => { - let mut instance = Instance::default(); - - // override the old registries with the new ones - // but if a registry wasn't sent, keep the old one - for (registry_name, registry) in p.registry_holder.map { - instance.registries.map.insert(registry_name, registry); - } + let mut system_state: SystemState> = + SystemState::new(ecs); + let mut query = system_state.get_mut(ecs); + let instance_holder = query.get_mut(player_entity).unwrap(); + let mut instance = instance_holder.instance.write(); - let instance_holder = crate::local_player::InstanceHolder::new( - player_entity, - // default to an empty world, it'll be set correctly later when we - // get the login packet - Arc::new(RwLock::new(instance)), - ); - ecs.entity_mut(player_entity).insert(instance_holder); + // add the new registry data + instance.registries.append(p.registry_id, p.entries); } ClientboundConfigurationPacket::CustomPayload(p) => { @@ -200,6 +193,35 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundConfigurationPacket::UpdateTags(_p) => { debug!("Got update tags packet"); } + ClientboundConfigurationPacket::CookieRequest(p) => { + debug!("Got cookie request packet {p:?}"); + } + ClientboundConfigurationPacket::ResetChat(p) => { + debug!("Got reset chat packet {p:?}"); + } + ClientboundConfigurationPacket::StoreCookie(p) => { + debug!("Got store cookie packet {p:?}"); + } + ClientboundConfigurationPacket::Transfer(p) => { + debug!("Got transfer packet {p:?}"); + } + ClientboundConfigurationPacket::SelectKnownPacks(p) => { + debug!("Got select known packs packet {p:?}"); + + let mut system_state: SystemState> = SystemState::new(ecs); + let mut query = system_state.get_mut(ecs); + let raw_connection = query.get_mut(player_entity).unwrap(); + + // resource pack management isn't implemented + raw_connection + .write_packet( + ServerboundSelectKnownPacksPacket { + known_packs: vec![], + } + .get(), + ) + .unwrap(); + } } } } diff --git a/azalea-client/src/packet_handling/game.rs b/azalea-client/src/packet_handling/game.rs index 30b736c08..daa420c3f 100644 --- a/azalea-client/src/packet_handling/game.rs +++ b/azalea-client/src/packet_handling/game.rs @@ -164,6 +164,7 @@ pub fn send_packet_events( Ok(packet) => packet, Err(err) => { error!("failed to read packet: {:?}", err); + debug!("packet bytes: {:?}", raw_packet); continue; } }; @@ -243,20 +244,20 @@ pub fn process_packet_events(ecs: &mut World) { .insert(InstanceName(new_instance_name.clone())); } - let Some(dimension_type) = + let Some(dimension_type_element) = instance_holder.instance.read().registries.dimension_type() else { error!("Server didn't send dimension type registry, can't log in"); continue; }; - let dimension = &dimension_type - .value - .iter() - .find(|t| t.name == p.common.dimension_type) - .unwrap_or_else(|| { - panic!("No dimension_type with name {}", p.common.dimension_type) - }) - .element; + + let dimension_type = + ResourceLocation::new(&p.common.dimension_type.to_string()); + + let dimension = dimension_type_element + .map + .get(&dimension_type) + .unwrap_or_else(|| panic!("No dimension_type with name {dimension_type}")); // add this world to the instance_container (or don't if it's already // there) @@ -557,7 +558,7 @@ pub fn process_packet_events(ecs: &mut World) { info.latency = updated_info.latency; } if p.actions.update_display_name { - info.display_name = updated_info.display_name.clone(); + info.display_name.clone_from(&updated_info.display_name); } update_player_events.send(UpdatePlayerEvent { entity: player_entity, @@ -1288,9 +1289,6 @@ pub fn process_packet_events(ecs: &mut World) { packet: ServerboundPongPacket { id: p.id }.get(), }); } - ClientboundGamePacket::PongResponse(p) => { - debug!("Got pong response packet {p:?}"); - } ClientboundGamePacket::PlaceGhostRecipe(_) => {} ClientboundGamePacket::PlayerCombatEnd(_) => {} ClientboundGamePacket::PlayerCombatEnter(_) => {} @@ -1359,21 +1357,20 @@ pub fn process_packet_events(ecs: &mut World) { { let new_instance_name = p.common.dimension.clone(); - let Some(dimension_type) = + let Some(dimension_type_element) = instance_holder.instance.read().registries.dimension_type() else { error!("Server didn't send dimension type registry, can't log in"); continue; }; - let dimension = &dimension_type - .value - .iter() - .find(|t| t.name == p.common.dimension_type) - .unwrap_or_else(|| { - panic!("No dimension_type with name {}", p.common.dimension_type) - }) - .element; + let dimension_type = + ResourceLocation::new(&p.common.dimension_type.to_string()); + + let dimension = dimension_type_element + .map + .get(&dimension_type) + .unwrap_or_else(|| panic!("No dimension_type with name {dimension_type}")); // add this world to the instance_container (or don't if it's already // there) @@ -1475,6 +1472,11 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundGamePacket::TickingStep(_) => {} ClientboundGamePacket::ResetScore(_) => {} + ClientboundGamePacket::CookieRequest(_) => {} + ClientboundGamePacket::DebugSample(_) => {} + ClientboundGamePacket::PongResponse(_) => {} + ClientboundGamePacket::StoreCookie(_) => {} + ClientboundGamePacket::Transfer(_) => {} } } } diff --git a/azalea-client/src/ping.rs b/azalea-client/src/ping.rs index 9064065c2..d06123923 100755 --- a/azalea-client/src/ping.rs +++ b/azalea-client/src/ping.rs @@ -1,15 +1,18 @@ //! Ping Minecraft servers. use azalea_protocol::{ - connect::{Connection, ConnectionError}, + connect::{Connection, ConnectionError, Proxy}, packets::{ - handshaking::client_intention_packet::ClientIntentionPacket, + handshaking::{ + client_intention_packet::ClientIntentionPacket, ClientboundHandshakePacket, + ServerboundHandshakePacket, + }, status::{ clientbound_status_response_packet::ClientboundStatusResponsePacket, serverbound_status_request_packet::ServerboundStatusRequestPacket, ClientboundStatusPacket, }, - ConnectionProtocol, PROTOCOL_VERSION, + ClientIntention, PROTOCOL_VERSION, }, resolver, ServerAddress, }; @@ -47,18 +50,36 @@ pub async fn ping_server( address: impl TryInto, ) -> Result { let address: ServerAddress = address.try_into().map_err(|_| PingError::InvalidAddress)?; - let resolved_address = resolver::resolve_address(&address).await?; + let conn = Connection::new(&resolved_address).await?; + ping_server_with_connection(address, conn).await +} - let mut conn = Connection::new(&resolved_address).await?; +/// Ping a Minecraft server through a Socks5 proxy. +pub async fn ping_server_with_proxy( + address: impl TryInto, + proxy: Proxy, +) -> Result { + let address: ServerAddress = address.try_into().map_err(|_| PingError::InvalidAddress)?; + let resolved_address = resolver::resolve_address(&address).await?; + let conn = Connection::new_with_proxy(&resolved_address, proxy).await?; + ping_server_with_connection(address, conn).await +} +/// Ping a Minecraft server after we've already created a [`Connection`]. The +/// `Connection` must still be in the handshake state (which is the state it's +/// in immediately after it's created). +pub async fn ping_server_with_connection( + address: ServerAddress, + mut conn: Connection, +) -> Result { // send the client intention packet and switch to the status state conn.write( ClientIntentionPacket { protocol_version: PROTOCOL_VERSION, hostname: address.host.clone(), port: address.port, - intention: ConnectionProtocol::Status, + intention: ClientIntention::Status, } .get(), ) diff --git a/azalea-client/src/task_pool.rs b/azalea-client/src/task_pool.rs index da1de6079..d4963cd57 100644 --- a/azalea-client/src/task_pool.rs +++ b/azalea-client/src/task_pool.rs @@ -58,7 +58,7 @@ impl Default for TaskPoolOptions { TaskPoolOptions { // By default, use however many cores are available on the system min_total_threads: 1, - max_total_threads: std::usize::MAX, + max_total_threads: usize::MAX, // Use 25% of cores for IO, at least 1, no more than 4 io: TaskPoolThreadAssignmentPolicy { @@ -77,7 +77,7 @@ impl Default for TaskPoolOptions { // Use all remaining cores for compute (at least 1) compute: TaskPoolThreadAssignmentPolicy { min_threads: 1, - max_threads: std::usize::MAX, + max_threads: usize::MAX, percent: 1.0, // This 1.0 here means "whatever is left over" }, } diff --git a/azalea-core/Cargo.toml b/azalea-core/Cargo.toml index d294b755b..8808bf8e8 100644 --- a/azalea-core/Cargo.toml +++ b/azalea-core/Cargo.toml @@ -4,23 +4,23 @@ edition = "2021" license = "MIT" name = "azalea-core" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-core" -version = "0.9.0" +version = "0.10.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } -azalea-registry = { path = "../azalea-registry", version = "0.9.0" } -bevy_ecs = { version = "0.13.0", default-features = false, optional = true } +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-registry = { path = "../azalea-registry", version = "0.10.0" } +bevy_ecs = { version = "0.13.2", default-features = false, optional = true } nohash-hasher = "0.2.0" num-traits = "0.2.18" serde = { version = "^1.0", optional = true } -uuid = "^1.7.0" -serde_json = "^1.0.113" +uuid = "^1.8.0" +serde_json = "^1.0.116" tracing = "0.1.40" [features] bevy_ecs = ["dep:bevy_ecs"] serde = ["dep:serde"] +strict_registry = [] diff --git a/azalea-core/src/lib.rs b/azalea-core/src/lib.rs index 5471120b5..83dd62458 100755 --- a/azalea-core/src/lib.rs +++ b/azalea-core/src/lib.rs @@ -1,5 +1,6 @@ #![doc = include_str!("../README.md")] #![feature(lazy_cell)] +#![feature(trait_upcasting)] #![allow(incomplete_features)] #![feature(generic_const_exprs)] @@ -13,7 +14,6 @@ pub mod direction; pub mod game_type; pub mod math; pub mod objectives; -pub mod particle; pub mod position; pub mod registry_holder; pub mod resource_location; diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs index e2a9c4cc2..31b2d008f 100755 --- a/azalea-core/src/position.rs +++ b/azalea-core/src/position.rs @@ -424,11 +424,11 @@ impl From for u16 { impl nohash_hasher::IsEnabled for ChunkSectionBlockPos {} /// A block pos with an attached world -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct GlobalPos { - pub pos: BlockPos, // this is actually a ResourceKey in Minecraft, but i don't think it matters? pub world: ResourceLocation, + pub pos: BlockPos, } impl From<&BlockPos> for ChunkPos { diff --git a/azalea-core/src/registry_holder.rs b/azalea-core/src/registry_holder.rs index 1c21c890c..68dfcf29f 100644 --- a/azalea-core/src/registry_holder.rs +++ b/azalea-core/src/registry_holder.rs @@ -5,7 +5,6 @@ //! the game, including the types of chat messages, dimensions, and //! biomes. -use azalea_buf::{BufReadError, McBufReadable, McBufWritable}; use simdnbt::{ owned::{NbtCompound, NbtTag}, Deserialize, FromNbtTag, Serialize, ToNbtTag, @@ -20,23 +19,51 @@ use crate::resource_location::ResourceLocation; /// This is the registry that is sent to the client upon login. #[derive(Default, Debug, Clone)] pub struct RegistryHolder { - pub map: HashMap, + pub map: HashMap>, } impl RegistryHolder { + pub fn append( + &mut self, + id: ResourceLocation, + entries: HashMap>, + ) { + let map = self.map.entry(id).or_default(); + for (key, value) in entries { + if let Some(value) = value { + map.insert(key, value); + } else { + map.remove(&key); + } + } + } + fn get( &self, name: &ResourceLocation, - ) -> Option> { + ) -> Option, simdnbt::DeserializeError>> { // this is suboptimal, ideally simdnbt should just have a way to get the // owned::NbtCompound as a borrow::NbtCompound - let nbt_owned_compound = self.map.get(name)?; - let mut nbt_bytes = Vec::new(); - nbt_owned_compound.write(&mut nbt_bytes); - let nbt_borrow_compound = - simdnbt::borrow::NbtCompound::read(&mut Cursor::new(&nbt_bytes)).ok()?; - Some(T::from_compound(&nbt_borrow_compound)) + let mut map = HashMap::new(); + + for (key, value) in self.map.get(name)? { + // convert the value to T + let mut nbt_bytes = Vec::new(); + value.write(&mut nbt_bytes); + let nbt_borrow_compound = + simdnbt::borrow::read_compound(&mut Cursor::new(&nbt_bytes)).ok()?; + let value = match T::from_compound(&nbt_borrow_compound) { + Ok(value) => value, + Err(err) => { + return Some(Err(err)); + } + }; + + map.insert(key.clone(), value); + } + + Some(Ok(RegistryType { map })) } /// Get the dimension type registry, or `None` if it doesn't exist. You @@ -57,48 +84,10 @@ impl RegistryHolder { } } -impl McBufReadable for RegistryHolder { - fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let nbt_tag = simdnbt::borrow::NbtTag::read(buf)?; - let nbt_compound = nbt_tag - .compound() - .ok_or_else(|| BufReadError::Custom("RegistryHolder must be a compound".to_string()))?; - Ok(RegistryHolder { - map: simdnbt::Deserialize::from_compound(nbt_compound)?, - }) - } -} - -impl McBufWritable for RegistryHolder { - fn write_into(&self, buf: &mut impl std::io::Write) -> Result<(), std::io::Error> { - let mut written = Vec::new(); - self.map.clone().to_compound().write_into(&mut written)?; - buf.write_all(&written) - } -} - /// A collection of values for a certain type of registry data. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[cfg_attr(feature = "strict_registry", simdnbt(deny_unknown_fields))] -pub struct RegistryType -where - T: Serialize + Deserialize, -{ - #[simdnbt(rename = "type")] - pub kind: ResourceLocation, - pub value: Vec>, -} - -/// A value for a certain type of registry data. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[cfg_attr(feature = "strict_registry", simdnbt(deny_unknown_fields))] -pub struct TypeValue -where - T: Serialize + Deserialize, -{ - pub id: u32, - pub name: ResourceLocation, - pub element: T, +#[derive(Debug, Clone)] +pub struct RegistryType { + pub map: HashMap, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -146,18 +135,12 @@ pub struct ChatTypeStyle { #[simdnbt(deny_unknown_fields)] pub struct DimensionTypeElement { pub ambient_light: f32, - #[serde(with = "Convert")] pub bed_works: bool, pub coordinate_scale: f32, pub effects: ResourceLocation, - #[serde(default)] - #[serde(skip_serializing_if = "Option::is_none")] pub fixed_time: Option, - #[serde(with = "Convert")] pub has_ceiling: bool, - #[serde(with = "Convert")] pub has_raids: bool, - #[serde(with = "Convert")] pub has_skylight: bool, pub height: u32, pub infiniburn: ResourceLocation, @@ -165,13 +148,9 @@ pub struct DimensionTypeElement { pub min_y: i32, pub monster_spawn_block_light_limit: u32, pub monster_spawn_light_level: MonsterSpawnLightLevel, - #[serde(with = "Convert")] pub natural: bool, - #[serde(with = "Convert")] pub piglin_safe: bool, - #[serde(with = "Convert")] pub respawn_anchor_works: bool, - #[serde(with = "Convert")] pub ultrawarm: bool, } @@ -191,7 +170,6 @@ pub struct DimensionTypeElement { /// max. #[derive(Debug, Clone)] // #[serde(untagged)] -#[cfg_attr(feature = "strict_registry", simdnbt(deny_unknown_fields))] pub enum MonsterSpawnLightLevel { /// A simple minimum value. Simple(u32), diff --git a/azalea-core/src/resource_location.rs b/azalea-core/src/resource_location.rs index f9f950041..a6dcc0be1 100755 --- a/azalea-core/src/resource_location.rs +++ b/azalea-core/src/resource_location.rs @@ -3,6 +3,7 @@ use azalea_buf::{BufReadError, McBufReadable, McBufWritable}; use simdnbt::{owned::NbtTag, FromNbtTag, ToNbtTag}; use std::{ + fmt, io::{Cursor, Write}, str::FromStr, }; @@ -41,13 +42,13 @@ impl ResourceLocation { } } -impl std::fmt::Display for ResourceLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Display for ResourceLocation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}:{}", self.namespace, self.path) } } -impl std::fmt::Debug for ResourceLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Debug for ResourceLocation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}:{}", self.namespace, self.path) } } diff --git a/azalea-crypto/Cargo.toml b/azalea-crypto/Cargo.toml index 04423f2a6..b57d40fd6 100644 --- a/azalea-crypto/Cargo.toml +++ b/azalea-crypto/Cargo.toml @@ -3,14 +3,14 @@ description = "Cryptography features used in Minecraft." edition = "2021" license = "MIT" name = "azalea-crypto" -version = "0.9.0" +version = "0.10.0" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-crypto" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] aes = "0.8.4" -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } cfb8 = "0.8.1" num-bigint = "^0.4.4" rand = { version = "^0.8.5", features = ["getrandom"] } @@ -18,7 +18,7 @@ rsa = { version = "0.9.6", features = ["sha2"] } rsa_public_encrypt_pkcs1 = "0.4.0" sha-1 = "^0.10.1" sha2 = "0.10.8" -uuid = "^1.7.0" +uuid = "^1.8.0" [dev-dependencies] criterion = { version = "^0.5.1", features = ["html_reports"] } diff --git a/azalea-crypto/src/lib.rs b/azalea-crypto/src/lib.rs index cefc9adca..90e248a27 100755 --- a/azalea-crypto/src/lib.rs +++ b/azalea-crypto/src/lib.rs @@ -39,10 +39,10 @@ pub fn hex_digest(digest: &[u8]) -> String { pub struct EncryptResult { pub secret_key: [u8; 16], pub encrypted_public_key: Vec, - pub encrypted_nonce: Vec, + pub encrypted_challenge: Vec, } -pub fn encrypt(public_key: &[u8], nonce: &[u8]) -> Result { +pub fn encrypt(public_key: &[u8], challenge: &[u8]) -> Result { // On receipt of a Encryption Request from the server, the client will // generate a random 16-byte shared secret, to be used with the AES/CFB8 // stream cipher. @@ -51,14 +51,14 @@ pub fn encrypt(public_key: &[u8], nonce: &[u8]) -> Result // &secret_key)); // this.keybytes = Crypt.encryptUsingKey(publicKey, secretKey.getEncoded()); - // this.nonce = Crypt.encryptUsingKey(publicKey, arrby); + // this.challenge = Crypt.encryptUsingKey(publicKey, arrby); let encrypted_public_key: Vec = rsa_public_encrypt_pkcs1::encrypt(public_key, &secret_key)?; - let encrypted_nonce: Vec = rsa_public_encrypt_pkcs1::encrypt(public_key, nonce)?; + let encrypted_challenge: Vec = rsa_public_encrypt_pkcs1::encrypt(public_key, challenge)?; Ok(EncryptResult { secret_key, encrypted_public_key, - encrypted_nonce, + encrypted_challenge, }) } diff --git a/azalea-entity/Cargo.toml b/azalea-entity/Cargo.toml index c35323bbf..f2b469083 100644 --- a/azalea-entity/Cargo.toml +++ b/azalea-entity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "azalea-entity" -version = "0.9.0" +version = "0.10.1" edition = "2021" description = "Things related to Minecraft entities used by Azalea" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-entity" @@ -9,22 +9,22 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -azalea-block = { version = "0.9.0", path = "../azalea-block" } -azalea-buf = { version = "0.9.0", path = "../azalea-buf" } -azalea-chat = { version = "0.9.0", path = "../azalea-chat", features = [ +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +azalea-block = { version = "0.10.0", path = "../azalea-block" } +azalea-buf = { version = "0.10.0", path = "../azalea-buf" } +azalea-chat = { version = "0.10.0", path = "../azalea-chat", features = [ "azalea-buf", ] } -azalea-core = { version = "0.9.0", path = "../azalea-core" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } -azalea-registry = { version = "0.9.0", path = "../azalea-registry" } -azalea-world = { version = "0.9.0", path = "../azalea-world" } -bevy_app = "0.13.0" -bevy_ecs = "0.13.0" +azalea-core = { version = "0.10.0", path = "../azalea-core" } +azalea-inventory = { version = "0.10.0", path = "../azalea-inventory" } +azalea-registry = { version = "0.10.0", path = "../azalea-registry" } +azalea-world = { version = "0.10.0", path = "../azalea-world" } +bevy_app = "0.13.2" +bevy_ecs = "0.13.2" derive_more = "0.99.17" enum-as-inner = "0.6.0" tracing = "0.1.40" nohash-hasher = "0.2.0" parking_lot = "0.12.1" -thiserror = "1.0.57" -uuid = "1.7.0" +thiserror = "1.0.59" +uuid = "1.8.0" diff --git a/azalea-entity/src/data.rs b/azalea-entity/src/data.rs index b0a05e74d..45c761e75 100755 --- a/azalea-entity/src/data.rs +++ b/azalea-entity/src/data.rs @@ -6,7 +6,6 @@ use azalea_buf::{ use azalea_chat::FormattedText; use azalea_core::{ direction::Direction, - particle::Particle, position::{BlockPos, GlobalPos, Vec3}, }; use azalea_inventory::ItemSlot; @@ -17,6 +16,8 @@ use nohash_hasher::IntSet; use std::io::{Cursor, Write}; use uuid::Uuid; +use crate::particle::Particle; + #[derive(Clone, Debug, Deref)] pub struct EntityMetadataItems(Vec); @@ -83,15 +84,18 @@ pub enum EntityDataValue { OptionalBlockState(azalea_block::BlockState), CompoundTag(simdnbt::owned::NbtCompound), Particle(Particle), + Particles(Vec), VillagerData(VillagerData), // 0 for absent; 1 + actual value otherwise. Used for entity IDs. OptionalUnsignedInt(OptionalUnsignedInt), Pose(Pose), CatVariant(azalea_registry::CatVariant), + WolfVariant(azalea_registry::WolfVariant), FrogVariant(azalea_registry::FrogVariant), OptionalGlobalPos(Option), PaintingVariant(azalea_registry::PaintingVariant), SnifferState(SnifferState), + ArmadilloState(ArmadilloStateKind), Vector3(Vec3), Quaternion(Quaternion), } @@ -107,6 +111,16 @@ pub struct Quaternion { pub w: f32, } +// mojang just calls this ArmadilloState but i added "Kind" since otherwise it +// collides with a name in metadata.rs +#[derive(Clone, Debug, Copy, Default, McBuf)] +pub enum ArmadilloStateKind { + #[default] + Idle, + Rolling, + Scared, +} + impl McBufReadable for OptionalUnsignedInt { fn read_from(buf: &mut Cursor<&[u8]>) -> Result { let val = u32::var_read_from(buf)?; diff --git a/azalea-entity/src/lib.rs b/azalea-entity/src/lib.rs index dd818c6dc..8761fa249 100644 --- a/azalea-entity/src/lib.rs +++ b/azalea-entity/src/lib.rs @@ -7,6 +7,7 @@ mod effects; mod enchantments; pub mod metadata; pub mod mining; +pub mod particle; mod plugin; use self::attributes::AttributeInstance; diff --git a/azalea-entity/src/metadata.rs b/azalea-entity/src/metadata.rs index c73136b3b..f2a886702 100644 --- a/azalea-entity/src/metadata.rs +++ b/azalea-entity/src/metadata.rs @@ -3,14 +3,15 @@ // This file is generated from codegen/lib/code/entity.py. // Don't change it manually! +use crate::particle::Particle; + use super::{ - EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, Rotations, - SnifferState, VillagerData, + ArmadilloStateKind, EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, + Rotations, SnifferState, VillagerData, }; use azalea_chat::FormattedText; use azalea_core::{ direction::Direction, - particle::Particle, position::{BlockPos, Vec3}, }; use azalea_inventory::ItemSlot; @@ -63,7 +64,7 @@ pub struct AbstractLivingUsingItem(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct Health(pub f32); #[derive(Component, Deref, DerefMut, Clone)] -pub struct AbstractLivingEffectColor(pub i32); +pub struct EffectParticles(pub Vec); #[derive(Component, Deref, DerefMut, Clone)] pub struct EffectAmbience(pub bool); #[derive(Component, Deref, DerefMut, Clone)] @@ -130,17 +131,17 @@ impl Default for AllayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -160,8 +161,6 @@ impl Default for AllayMetadataBundle { #[derive(Component, Deref, DerefMut, Clone)] pub struct Radius(pub f32); #[derive(Component, Deref, DerefMut, Clone)] -pub struct AreaEffectCloudColor(pub i32); -#[derive(Component, Deref, DerefMut, Clone)] pub struct Waiting(pub bool); #[derive(Component)] pub struct AreaEffectCloud; @@ -176,12 +175,9 @@ impl AreaEffectCloud { entity.insert(Radius(d.value.into_float()?)); } 9 => { - entity.insert(AreaEffectCloudColor(d.value.into_int()?)); - } - 10 => { entity.insert(Waiting(d.value.into_boolean()?)); } - 11 => { + 10 => { entity.insert(d.value.into_particle()?); } _ => {} @@ -195,7 +191,6 @@ pub struct AreaEffectCloudMetadataBundle { _marker: AreaEffectCloud, parent: AbstractEntityMetadataBundle, radius: Radius, - area_effect_cloud_color: AreaEffectCloudColor, waiting: Waiting, particle: Particle, } @@ -213,21 +208,101 @@ impl Default for AreaEffectCloudMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, radius: Radius(3.0), - area_effect_cloud_color: AreaEffectCloudColor(0), waiting: Waiting(false), particle: Particle::default(), } } } +#[derive(Component, Deref, DerefMut, Clone)] +pub struct AbstractAgeableBaby(pub bool); +#[derive(Component, Deref, DerefMut, Clone)] +pub struct ArmadilloState(pub ArmadilloStateKind); +#[derive(Component)] +pub struct Armadillo; +impl Armadillo { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=16 => AbstractAnimal::apply_metadata(entity, d)?, + 17 => { + entity.insert(ArmadilloState(d.value.into_armadillo_state()?)); + } + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct ArmadilloMetadataBundle { + _marker: Armadillo, + parent: AbstractAnimalMetadataBundle, + armadillo_state: ArmadilloState, +} +impl Default for ArmadilloMetadataBundle { + fn default() -> Self { + Self { + _marker: Armadillo, + parent: AbstractAnimalMetadataBundle { + _marker: AbstractAnimal, + parent: AbstractAgeableMetadataBundle { + _marker: AbstractAgeable, + parent: AbstractCreatureMetadataBundle { + _marker: AbstractCreature, + parent: AbstractInsentientMetadataBundle { + _marker: AbstractInsentient, + parent: AbstractLivingMetadataBundle { + _marker: AbstractLiving, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + auto_spin_attack: AutoSpinAttack(false), + abstract_living_using_item: AbstractLivingUsingItem(false), + health: Health(1.0), + effect_particles: EffectParticles(Default::default()), + effect_ambience: EffectAmbience(false), + arrow_count: ArrowCount(0), + stinger_count: StingerCount(0), + sleeping_pos: SleepingPos(None), + }, + no_ai: NoAi(false), + left_handed: LeftHanded(false), + aggressive: Aggressive(false), + }, + }, + abstract_ageable_baby: AbstractAgeableBaby(false), + }, + }, + armadillo_state: ArmadilloState(Default::default()), + } + } +} + #[derive(Component, Deref, DerefMut, Clone, Copy)] pub struct Small(pub bool); #[derive(Component, Deref, DerefMut, Clone, Copy)] @@ -319,17 +394,17 @@ impl Default for ArmorStandMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -358,7 +433,7 @@ pub struct ArrowNoPhysics(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct ArrowPierceLevel(pub u8); #[derive(Component, Deref, DerefMut, Clone)] -pub struct ArrowEffectColor(pub i32); +pub struct EffectColor(pub i32); #[derive(Component)] pub struct Arrow; impl Arrow { @@ -378,7 +453,7 @@ impl Arrow { entity.insert(ArrowPierceLevel(d.value.into_byte()?)); } 10 => { - entity.insert(ArrowEffectColor(d.value.into_int()?)); + entity.insert(EffectColor(d.value.into_int()?)); } _ => {} } @@ -394,7 +469,7 @@ pub struct ArrowMetadataBundle { arrow_shot_from_crossbow: ArrowShotFromCrossbow, arrow_no_physics: ArrowNoPhysics, arrow_pierce_level: ArrowPierceLevel, - arrow_effect_color: ArrowEffectColor, + effect_color: EffectColor, } impl Default for ArrowMetadataBundle { fn default() -> Self { @@ -410,24 +485,22 @@ impl Default for ArrowMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, arrow_crit_arrow: ArrowCritArrow(false), arrow_shot_from_crossbow: ArrowShotFromCrossbow(false), arrow_no_physics: ArrowNoPhysics(false), arrow_pierce_level: ArrowPierceLevel(0), - arrow_effect_color: ArrowEffectColor(-1), + effect_color: EffectColor(-1), } } } -#[derive(Component, Deref, DerefMut, Clone)] -pub struct AbstractAgeableBaby(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct AxolotlVariant(pub i32); #[derive(Component, Deref, DerefMut, Clone)] @@ -490,17 +563,17 @@ impl Default for AxolotlMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -566,17 +639,17 @@ impl Default for BatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -656,17 +729,17 @@ impl Default for BeeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -737,17 +810,17 @@ impl Default for BlazeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -900,12 +973,12 @@ impl Default for BlockDisplayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, block_display_transformation_interpolation_start_delta_ticks: BlockDisplayTransformationInterpolationStartDeltaTicks(0), @@ -1027,12 +1100,12 @@ impl Default for BoatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, boat_hurt: BoatHurt(0), boat_hurtdir: BoatHurtdir(1), @@ -1045,6 +1118,81 @@ impl Default for BoatMetadataBundle { } } +#[derive(Component, Deref, DerefMut, Clone)] +pub struct BoggedSheared(pub bool); +#[derive(Component)] +pub struct Bogged; +impl Bogged { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=15 => AbstractMonster::apply_metadata(entity, d)?, + 16 => { + entity.insert(BoggedSheared(d.value.into_boolean()?)); + } + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct BoggedMetadataBundle { + _marker: Bogged, + parent: AbstractMonsterMetadataBundle, + bogged_sheared: BoggedSheared, +} +impl Default for BoggedMetadataBundle { + fn default() -> Self { + Self { + _marker: Bogged, + parent: AbstractMonsterMetadataBundle { + _marker: AbstractMonster, + parent: AbstractCreatureMetadataBundle { + _marker: AbstractCreature, + parent: AbstractInsentientMetadataBundle { + _marker: AbstractInsentient, + parent: AbstractLivingMetadataBundle { + _marker: AbstractLiving, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + auto_spin_attack: AutoSpinAttack(false), + abstract_living_using_item: AbstractLivingUsingItem(false), + health: Health(1.0), + effect_particles: EffectParticles(Default::default()), + effect_ambience: EffectAmbience(false), + arrow_count: ArrowCount(0), + stinger_count: StingerCount(0), + sleeping_pos: SleepingPos(None), + }, + no_ai: NoAi(false), + left_handed: LeftHanded(false), + aggressive: Aggressive(false), + }, + }, + }, + bogged_sheared: BoggedSheared(false), + } + } +} + #[derive(Component)] pub struct Breeze; impl Breeze { @@ -1087,17 +1235,17 @@ impl Default for BreezeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1113,6 +1261,51 @@ impl Default for BreezeMetadataBundle { } } +#[derive(Component)] +pub struct BreezeWindCharge; +impl BreezeWindCharge { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=7 => AbstractEntity::apply_metadata(entity, d)?, + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct BreezeWindChargeMetadataBundle { + _marker: BreezeWindCharge, + parent: AbstractEntityMetadataBundle, +} +impl Default for BreezeWindChargeMetadataBundle { + fn default() -> Self { + Self { + _marker: BreezeWindCharge, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + } + } +} + #[derive(Component, Deref, DerefMut, Clone, Copy)] pub struct CamelTamed(pub bool); #[derive(Component, Deref, DerefMut, Clone, Copy)] @@ -1192,17 +1385,17 @@ impl Default for CamelMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1303,17 +1496,17 @@ impl Default for CatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1385,17 +1578,17 @@ impl Default for CaveSpiderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1449,12 +1642,12 @@ impl Default for ChestBoatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, boat_hurt: BoatHurt(0), boat_hurtdir: BoatHurtdir(1), @@ -1516,12 +1709,12 @@ impl Default for ChestMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -1578,17 +1771,17 @@ impl Default for ChickenMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1652,17 +1845,17 @@ impl Default for CodMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1726,12 +1919,12 @@ impl Default for CommandBlockMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -1790,17 +1983,17 @@ impl Default for CowMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1878,17 +2071,17 @@ impl Default for CreeperMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -1965,17 +2158,17 @@ impl Default for DolphinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2066,17 +2259,17 @@ impl Default for DonkeyMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2134,12 +2327,12 @@ impl Default for DragonFireballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -2195,17 +2388,17 @@ impl Default for DrownedMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2265,14 +2458,14 @@ impl Default for EggMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - egg_item_stack: EggItemStack(ItemSlot::Empty), + egg_item_stack: EggItemStack(Default::default()), } } } @@ -2325,17 +2518,17 @@ impl Default for ElderGuardianMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2400,12 +2593,12 @@ impl Default for EndCrystalMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, beam_target: BeamTarget(None), show_bottom: ShowBottom(true), @@ -2457,17 +2650,17 @@ impl Default for EnderDragonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2522,14 +2715,14 @@ impl Default for EnderPearlMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - ender_pearl_item_stack: EnderPearlItemStack(ItemSlot::Empty), + ender_pearl_item_stack: EnderPearlItemStack(Default::default()), } } } @@ -2594,17 +2787,17 @@ impl Default for EndermanMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2665,17 +2858,17 @@ impl Default for EndermiteMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2745,17 +2938,17 @@ impl Default for EvokerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -2807,12 +3000,12 @@ impl Default for EvokerFangsMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -2858,14 +3051,14 @@ impl Default for ExperienceBottleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - experience_bottle_item_stack: ExperienceBottleItemStack(ItemSlot::Empty), + experience_bottle_item_stack: ExperienceBottleItemStack(Default::default()), } } } @@ -2904,12 +3097,12 @@ impl Default for ExperienceOrbMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -2955,14 +3148,14 @@ impl Default for EyeOfEnderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - eye_of_ender_item_stack: EyeOfEnderItemStack(ItemSlot::Empty), + eye_of_ender_item_stack: EyeOfEnderItemStack(Default::default()), } } } @@ -3007,12 +3200,12 @@ impl Default for FallingBlockMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, start_pos: StartPos(Default::default()), } @@ -3059,14 +3252,14 @@ impl Default for FireballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - fireball_item_stack: FireballItemStack(ItemSlot::Empty), + fireball_item_stack: FireballItemStack(Default::default()), } } } @@ -3123,14 +3316,14 @@ impl Default for FireworkRocketMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - fireworks_item: FireworksItem(ItemSlot::Empty), + fireworks_item: FireworksItem(Default::default()), attached_to_target: AttachedToTarget(OptionalUnsignedInt(None)), shot_at_angle: ShotAtAngle(false), } @@ -3183,12 +3376,12 @@ impl Default for FishingBobberMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, hooked_entity: HookedEntity(0), biting: Biting(false), @@ -3285,17 +3478,17 @@ impl Default for FoxMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3378,17 +3571,17 @@ impl Default for FrogMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3450,12 +3643,12 @@ impl Default for FurnaceMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -3513,17 +3706,17 @@ impl Default for GhastMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3580,17 +3773,17 @@ impl Default for GiantMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3646,12 +3839,12 @@ impl Default for GlowItemFrameMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_frame_item: ItemFrameItem(ItemSlot::Empty), rotation: Rotation(0), @@ -3708,17 +3901,17 @@ impl Default for GlowSquidMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3797,17 +3990,17 @@ impl Default for GoatMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3878,17 +4071,17 @@ impl Default for GuardianMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -3956,17 +4149,17 @@ impl Default for HoglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4021,12 +4214,12 @@ impl Default for HopperMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -4112,17 +4305,17 @@ impl Default for HorseMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4190,17 +4383,17 @@ impl Default for HuskMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4274,17 +4467,17 @@ impl Default for IllusionerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4354,12 +4547,12 @@ impl Default for InteractionMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, interaction_width: InteractionWidth(1.0), interaction_height: InteractionHeight(1.0), @@ -4415,17 +4608,17 @@ impl Default for IronGolemMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4481,12 +4674,12 @@ impl Default for ItemMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_item: ItemItem(ItemSlot::Empty), } @@ -4635,12 +4828,12 @@ impl Default for ItemDisplayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_display_transformation_interpolation_start_delta_ticks: ItemDisplayTransformationInterpolationStartDeltaTicks(0), @@ -4727,12 +4920,12 @@ impl Default for ItemFrameMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, item_frame_item: ItemFrameItem(ItemSlot::Empty), rotation: Rotation(0), @@ -4774,12 +4967,12 @@ impl Default for LeashKnotMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -4819,12 +5012,12 @@ impl Default for LightningBoltMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -4845,8 +5038,6 @@ pub struct LlamaChest(pub bool); #[derive(Component, Deref, DerefMut, Clone)] pub struct Strength(pub i32); #[derive(Component, Deref, DerefMut, Clone)] -pub struct Swag(pub i32); -#[derive(Component, Deref, DerefMut, Clone)] pub struct LlamaVariant(pub i32); #[derive(Component)] pub struct Llama; @@ -4872,9 +5063,6 @@ impl Llama { entity.insert(Strength(d.value.into_int()?)); } 20 => { - entity.insert(Swag(d.value.into_int()?)); - } - 21 => { entity.insert(LlamaVariant(d.value.into_int()?)); } _ => {} @@ -4894,7 +5082,6 @@ pub struct LlamaMetadataBundle { llama_saddled: LlamaSaddled, llama_chest: LlamaChest, strength: Strength, - swag: Swag, llama_variant: LlamaVariant, } impl Default for LlamaMetadataBundle { @@ -4921,17 +5108,17 @@ impl Default for LlamaMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -4952,7 +5139,6 @@ impl Default for LlamaMetadataBundle { llama_saddled: LlamaSaddled(false), llama_chest: LlamaChest(false), strength: Strength(0), - swag: Swag(-1), llama_variant: LlamaVariant(0), } } @@ -4992,12 +5178,12 @@ impl Default for LlamaSpitMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -5045,17 +5231,17 @@ impl Default for MagmaCubeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5105,12 +5291,12 @@ impl Default for MarkerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -5152,12 +5338,12 @@ impl Default for MinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -5222,17 +5408,17 @@ impl Default for MooshroomMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5325,17 +5511,17 @@ impl Default for MuleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5409,17 +5595,17 @@ impl Default for OcelotMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5438,6 +5624,58 @@ impl Default for OcelotMetadataBundle { } } +#[derive(Component, Deref, DerefMut, Clone)] +pub struct OminousItemSpawnerItem(pub ItemSlot); +#[derive(Component)] +pub struct OminousItemSpawner; +impl OminousItemSpawner { + pub fn apply_metadata( + entity: &mut bevy_ecs::system::EntityCommands, + d: EntityDataItem, + ) -> Result<(), UpdateMetadataError> { + match d.index { + 0..=7 => AbstractEntity::apply_metadata(entity, d)?, + 8 => { + entity.insert(OminousItemSpawnerItem(d.value.into_item_stack()?)); + } + _ => {} + } + Ok(()) + } +} + +#[derive(Bundle)] +pub struct OminousItemSpawnerMetadataBundle { + _marker: OminousItemSpawner, + parent: AbstractEntityMetadataBundle, + ominous_item_spawner_item: OminousItemSpawnerItem, +} +impl Default for OminousItemSpawnerMetadataBundle { + fn default() -> Self { + Self { + _marker: OminousItemSpawner, + parent: AbstractEntityMetadataBundle { + _marker: AbstractEntity, + on_fire: OnFire(false), + shift_key_down: ShiftKeyDown(false), + sprinting: Sprinting(false), + swimming: Swimming(false), + currently_glowing: CurrentlyGlowing(false), + invisible: Invisible(false), + fall_flying: FallFlying(false), + air_supply: AirSupply(Default::default()), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), + pose: Pose::default(), + ticks_frozen: TicksFrozen(Default::default()), + }, + ominous_item_spawner_item: OminousItemSpawnerItem(ItemSlot::Empty), + } + } +} + #[derive(Component, Deref, DerefMut, Clone)] pub struct PaintingVariant(pub azalea_registry::PaintingVariant); #[derive(Component)] @@ -5478,12 +5716,12 @@ impl Default for PaintingMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, painting_variant: PaintingVariant(azalea_registry::PaintingVariant::Kebab), } @@ -5583,17 +5821,17 @@ impl Default for PandaMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5672,17 +5910,17 @@ impl Default for ParrotMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5749,17 +5987,17 @@ impl Default for PhantomMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5830,17 +6068,17 @@ impl Default for PigMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -5926,17 +6164,17 @@ impl Default for PiglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6004,17 +6242,17 @@ impl Default for PiglinBruteMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6085,17 +6323,17 @@ impl Default for PillagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6185,17 +6423,17 @@ impl Default for PlayerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6261,17 +6499,17 @@ impl Default for PolarBearMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6330,14 +6568,14 @@ impl Default for PotionMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - potion_item_stack: PotionItemStack(ItemSlot::Empty), + potion_item_stack: PotionItemStack(Default::default()), } } } @@ -6394,17 +6632,17 @@ impl Default for PufferfishMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6471,17 +6709,17 @@ impl Default for RabbitMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6548,17 +6786,17 @@ impl Default for RavagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6621,17 +6859,17 @@ impl Default for SalmonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6648,7 +6886,7 @@ impl Default for SalmonMetadataBundle { } #[derive(Component, Deref, DerefMut, Clone, Copy)] -pub struct Sheared(pub bool); +pub struct SheepSheared(pub bool); #[derive(Component)] pub struct Sheep; impl Sheep { @@ -6660,7 +6898,7 @@ impl Sheep { 0..=16 => AbstractAnimal::apply_metadata(entity, d)?, 17 => { let bitfield = d.value.into_byte()?; - entity.insert(Sheared(bitfield & 0x10 != 0)); + entity.insert(SheepSheared(bitfield & 0x10 != 0)); } _ => {} } @@ -6672,7 +6910,7 @@ impl Sheep { pub struct SheepMetadataBundle { _marker: Sheep, parent: AbstractAnimalMetadataBundle, - sheared: Sheared, + sheep_sheared: SheepSheared, } impl Default for SheepMetadataBundle { fn default() -> Self { @@ -6698,17 +6936,17 @@ impl Default for SheepMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6722,7 +6960,7 @@ impl Default for SheepMetadataBundle { abstract_ageable_baby: AbstractAgeableBaby(false), }, }, - sheared: Sheared(false), + sheep_sheared: SheepSheared(false), } } } @@ -6732,7 +6970,7 @@ pub struct AttachFace(pub Direction); #[derive(Component, Deref, DerefMut, Clone)] pub struct Peek(pub u8); #[derive(Component, Deref, DerefMut, Clone)] -pub struct ShulkerColor(pub u8); +pub struct Color(pub u8); #[derive(Component)] pub struct Shulker; impl Shulker { @@ -6749,7 +6987,7 @@ impl Shulker { entity.insert(Peek(d.value.into_byte()?)); } 18 => { - entity.insert(ShulkerColor(d.value.into_byte()?)); + entity.insert(Color(d.value.into_byte()?)); } _ => {} } @@ -6763,7 +7001,7 @@ pub struct ShulkerMetadataBundle { parent: AbstractCreatureMetadataBundle, attach_face: AttachFace, peek: Peek, - shulker_color: ShulkerColor, + color: Color, } impl Default for ShulkerMetadataBundle { fn default() -> Self { @@ -6785,17 +7023,17 @@ impl Default for ShulkerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6808,7 +7046,7 @@ impl Default for ShulkerMetadataBundle { }, attach_face: AttachFace(Default::default()), peek: Peek(0), - shulker_color: ShulkerColor(16), + color: Color(16), } } } @@ -6847,12 +7085,12 @@ impl Default for ShulkerBulletMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -6900,17 +7138,17 @@ impl Default for SilverfishMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -6974,17 +7212,17 @@ impl Default for SkeletonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7068,17 +7306,17 @@ impl Default for SkeletonHorseMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7143,17 +7381,17 @@ impl Default for SlimeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7208,14 +7446,14 @@ impl Default for SmallFireballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - small_fireball_item_stack: SmallFireballItemStack(ItemSlot::Empty), + small_fireball_item_stack: SmallFireballItemStack(Default::default()), } } } @@ -7276,17 +7514,17 @@ impl Default for SnifferMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7301,7 +7539,7 @@ impl Default for SnifferMetadataBundle { }, }, state: State(Default::default()), - drop_seed_at_tick: DropSeedAtTick(Default::default()), + drop_seed_at_tick: DropSeedAtTick(0), } } } @@ -7353,17 +7591,17 @@ impl Default for SnowGolemMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7419,14 +7657,14 @@ impl Default for SnowballMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, - snowball_item_stack: SnowballItemStack(ItemSlot::Empty), + snowball_item_stack: SnowballItemStack(Default::default()), } } } @@ -7467,12 +7705,12 @@ impl Default for SpawnerMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -7540,12 +7778,12 @@ impl Default for SpectralArrowMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, spectral_arrow_crit_arrow: SpectralArrowCritArrow(false), spectral_arrow_shot_from_crossbow: SpectralArrowShotFromCrossbow(false), @@ -7602,17 +7840,17 @@ impl Default for SpiderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7669,17 +7907,17 @@ impl Default for SquidMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7736,17 +7974,17 @@ impl Default for StrayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7824,17 +8062,17 @@ impl Default for StriderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -7901,17 +8139,17 @@ impl Default for TadpoleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8087,12 +8325,12 @@ impl Default for TextDisplayMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, text_display_transformation_interpolation_start_delta_ticks: TextDisplayTransformationInterpolationStartDeltaTicks(0), @@ -8186,12 +8424,12 @@ impl Default for TntMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, fuse: Fuse(80), tnt_block_state: TntBlockState(Default::default()), @@ -8235,12 +8473,12 @@ impl Default for TntMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -8261,7 +8499,7 @@ impl TraderLlama { d: EntityDataItem, ) -> Result<(), UpdateMetadataError> { match d.index { - 0..=21 => Llama::apply_metadata(entity, d)?, + 0..=20 => Llama::apply_metadata(entity, d)?, _ => {} } Ok(()) @@ -8299,17 +8537,17 @@ impl Default for TraderLlamaMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8330,7 +8568,6 @@ impl Default for TraderLlamaMetadataBundle { llama_saddled: LlamaSaddled(false), llama_chest: LlamaChest(false), strength: Strength(0), - swag: Swag(-1), llama_variant: LlamaVariant(0), }, } @@ -8404,12 +8641,12 @@ impl Default for TridentMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, trident_crit_arrow: TridentCritArrow(false), trident_shot_from_crossbow: TridentShotFromCrossbow(false), @@ -8473,17 +8710,17 @@ impl Default for TropicalFishMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8580,17 +8817,17 @@ impl Default for TurtleMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8662,17 +8899,17 @@ impl Default for VexMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8743,17 +8980,17 @@ impl Default for VillagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8824,17 +9061,17 @@ impl Default for VindicatorMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8899,17 +9136,17 @@ impl Default for WanderingTraderMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -8975,17 +9212,17 @@ impl Default for WardenMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9036,12 +9273,12 @@ impl Default for WindChargeMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, } } @@ -9101,17 +9338,17 @@ impl Default for WitchMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9195,17 +9432,17 @@ impl Default for WitherMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9267,17 +9504,17 @@ impl Default for WitherSkeletonMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9333,12 +9570,12 @@ impl Default for WitherSkullMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, dangerous: Dangerous(false), } @@ -9351,6 +9588,8 @@ pub struct WolfInterested(pub bool); pub struct WolfCollarColor(pub i32); #[derive(Component, Deref, DerefMut, Clone)] pub struct WolfRemainingAngerTime(pub i32); +#[derive(Component, Deref, DerefMut, Clone)] +pub struct WolfVariant(pub azalea_registry::WolfVariant); #[derive(Component)] pub struct Wolf; impl Wolf { @@ -9369,6 +9608,9 @@ impl Wolf { 21 => { entity.insert(WolfRemainingAngerTime(d.value.into_int()?)); } + 22 => { + entity.insert(WolfVariant(d.value.into_wolf_variant()?)); + } _ => {} } Ok(()) @@ -9382,6 +9624,7 @@ pub struct WolfMetadataBundle { wolf_interested: WolfInterested, wolf_collar_color: WolfCollarColor, wolf_remaining_anger_time: WolfRemainingAngerTime, + wolf_variant: WolfVariant, } impl Default for WolfMetadataBundle { fn default() -> Self { @@ -9409,17 +9652,17 @@ impl Default for WolfMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9440,6 +9683,7 @@ impl Default for WolfMetadataBundle { wolf_interested: WolfInterested(false), wolf_collar_color: WolfCollarColor(Default::default()), wolf_remaining_anger_time: WolfRemainingAngerTime(0), + wolf_variant: WolfVariant(Default::default()), } } } @@ -9492,17 +9736,17 @@ impl Default for ZoglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9573,17 +9817,17 @@ impl Default for ZombieMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9669,17 +9913,17 @@ impl Default for ZombieHorseMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9758,17 +10002,17 @@ impl Default for ZombieVillagerMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9838,17 +10082,17 @@ impl Default for ZombifiedPiglinMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9912,17 +10156,17 @@ impl Default for AbstractAgeableMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -9980,17 +10224,17 @@ impl Default for AbstractAnimalMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10045,17 +10289,17 @@ impl Default for AbstractCreatureMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10144,12 +10388,12 @@ impl Default for AbstractEntityMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), } } } @@ -10199,17 +10443,17 @@ impl Default for AbstractInsentientMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10240,7 +10484,7 @@ impl AbstractLiving { entity.insert(Health(d.value.into_float()?)); } 10 => { - entity.insert(AbstractLivingEffectColor(d.value.into_int()?)); + entity.insert(EffectParticles(d.value.into_particles()?)); } 11 => { entity.insert(EffectAmbience(d.value.into_boolean()?)); @@ -10267,7 +10511,7 @@ pub struct AbstractLivingMetadataBundle { auto_spin_attack: AutoSpinAttack, abstract_living_using_item: AbstractLivingUsingItem, health: Health, - abstract_living_effect_color: AbstractLivingEffectColor, + effect_particles: EffectParticles, effect_ambience: EffectAmbience, arrow_count: ArrowCount, stinger_count: StingerCount, @@ -10287,17 +10531,17 @@ impl Default for AbstractLivingMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10364,12 +10608,12 @@ impl Default for AbstractMinecartMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, abstract_minecart_hurt: AbstractMinecartHurt(0), abstract_minecart_hurtdir: AbstractMinecartHurtdir(1), @@ -10421,17 +10665,17 @@ impl Default for AbstractMonsterMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10501,17 +10745,17 @@ impl Default for AbstractTameableMetadataBundle { invisible: Invisible(false), fall_flying: FallFlying(false), air_supply: AirSupply(Default::default()), - custom_name: CustomName(None), - custom_name_visible: CustomNameVisible(false), - silent: Silent(false), - no_gravity: NoGravity(false), + custom_name: CustomName(Default::default()), + custom_name_visible: CustomNameVisible(Default::default()), + silent: Silent(Default::default()), + no_gravity: NoGravity(Default::default()), pose: Pose::default(), - ticks_frozen: TicksFrozen(0), + ticks_frozen: TicksFrozen(Default::default()), }, auto_spin_attack: AutoSpinAttack(false), abstract_living_using_item: AbstractLivingUsingItem(false), health: Health(1.0), - abstract_living_effect_color: AbstractLivingEffectColor(0), + effect_particles: EffectParticles(Default::default()), effect_ambience: EffectAmbience(false), arrow_count: ArrowCount(0), stinger_count: StingerCount(0), @@ -10548,6 +10792,11 @@ pub fn apply_metadata( AreaEffectCloud::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::Armadillo => { + for d in items { + Armadillo::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::ArmorStand => { for d in items { ArmorStand::apply_metadata(entity, d)?; @@ -10588,11 +10837,21 @@ pub fn apply_metadata( Boat::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::Bogged => { + for d in items { + Bogged::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::Breeze => { for d in items { Breeze::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::BreezeWindCharge => { + for d in items { + BreezeWindCharge::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::Camel => { for d in items { Camel::apply_metadata(entity, d)?; @@ -10888,6 +11147,11 @@ pub fn apply_metadata( Ocelot::apply_metadata(entity, d)?; } } + azalea_registry::EntityKind::OminousItemSpawner => { + for d in items { + OminousItemSpawner::apply_metadata(entity, d)?; + } + } azalea_registry::EntityKind::Painting => { for d in items { Painting::apply_metadata(entity, d)?; @@ -11183,6 +11447,9 @@ pub fn apply_default_metadata( azalea_registry::EntityKind::AreaEffectCloud => { entity.insert(AreaEffectCloudMetadataBundle::default()); } + azalea_registry::EntityKind::Armadillo => { + entity.insert(ArmadilloMetadataBundle::default()); + } azalea_registry::EntityKind::ArmorStand => { entity.insert(ArmorStandMetadataBundle::default()); } @@ -11207,9 +11474,15 @@ pub fn apply_default_metadata( azalea_registry::EntityKind::Boat => { entity.insert(BoatMetadataBundle::default()); } + azalea_registry::EntityKind::Bogged => { + entity.insert(BoggedMetadataBundle::default()); + } azalea_registry::EntityKind::Breeze => { entity.insert(BreezeMetadataBundle::default()); } + azalea_registry::EntityKind::BreezeWindCharge => { + entity.insert(BreezeWindChargeMetadataBundle::default()); + } azalea_registry::EntityKind::Camel => { entity.insert(CamelMetadataBundle::default()); } @@ -11387,6 +11660,9 @@ pub fn apply_default_metadata( azalea_registry::EntityKind::Ocelot => { entity.insert(OcelotMetadataBundle::default()); } + azalea_registry::EntityKind::OminousItemSpawner => { + entity.insert(OminousItemSpawnerMetadataBundle::default()); + } azalea_registry::EntityKind::Painting => { entity.insert(PaintingMetadataBundle::default()); } diff --git a/azalea-core/src/particle.rs b/azalea-entity/src/particle.rs similarity index 89% rename from azalea-core/src/particle.rs rename to azalea-entity/src/particle.rs index 4137d8677..6d8c9fd9b 100755 --- a/azalea-core/src/particle.rs +++ b/azalea-entity/src/particle.rs @@ -1,10 +1,10 @@ -use crate::position::BlockPos; use azalea_buf::McBuf; +use azalea_core::position::BlockPos; use azalea_inventory::ItemSlot; use azalea_registry::ParticleKind; +use bevy_ecs::component::Component; -#[cfg_attr(feature = "bevy_ecs", derive(bevy_ecs::component::Component))] -#[derive(Debug, Clone, McBuf, Default)] +#[derive(Component, Debug, Clone, McBuf, Default)] pub struct Particle { #[var] pub id: i32, @@ -13,15 +13,21 @@ pub struct Particle { #[derive(Clone, Debug, McBuf, Default)] pub enum ParticleData { - AmbientEntityEffect, AngryVillager, - Block(BlockParticle), BlockMarker(BlockParticle), + Block(BlockParticle), Bubble, + BubbleColumnUp, + BubblePop, + CampfireCosySmoke, + CampfireSignalSmoke, Cloud, + Composter, Crit, + CurrentDown, DamageIndicator, DragonBreath, + Dolphin, DrippingLava, FallingLava, LandingLava, @@ -38,31 +44,33 @@ pub enum ParticleData { EntityEffect, ExplosionEmitter, Explosion, - Gust, - GustEmitter, SonicBoom, FallingDust(BlockParticle), + Gust, + SmallGust, + GustEmitterLarge, + GustEmitterSmall, Firework, Fishing, Flame, - CherryLeaves, + Infested, SculkSoul, SculkCharge(SculkChargeParticle), SculkChargePop, - SoulFireFlame, Soul, + SoulFireFlame, Flash, HappyVillager, - Composter, Heart, InstantEffect, Item(ItemParticle), - Vibration(VibrationParticle), ItemSlime, + ItemCobweb, ItemSnowball, LargeSmoke, Lava, Mycelium, + Nautilus, Note, Poof, Portal, @@ -70,40 +78,35 @@ pub enum ParticleData { Smoke, WhiteSmoke, Sneeze, + Snowflake, Spit, - SquidInk, SweepAttack, TotemOfUndying, + SquidInk, Underwater, Splash, Witch, - BubblePop, - CurrentDown, - BubbleColumnUp, - Nautilus, - Dolphin, - CampfireCozySmoke, - CampfireSignalSmoke, DrippingHoney, FallingHoney, LandingHoney, FallingNectar, FallingSporeBlossom, + SporeBlossomAir, Ash, CrimsonSpore, WarpedSpore, - SporeBlossomAir, DrippingObsidianTear, FallingObsidianTear, LandingObsidianTear, ReversePortal, WhiteAsh, SmallFlame, - Snowflake, - DrippingDripstoneLava, - FallingDripstoneLava, DrippingDripstoneWater, FallingDripstoneWater, + CherryLeaves, + DrippingDripstoneLava, + FallingDripstoneLava, + Vibration(VibrationParticle), GlowSquidInk, Glow, WaxOn, @@ -113,8 +116,13 @@ pub enum ParticleData { Shriek(ShriekParticle), EggCrack, DustPlume, - GustDust, TrialSpawnerDetection, + TrialSpawnerDetectionOminous, + VaultConnection, + DustPillar, + RaidOmen, + TrialOmen, + OminousSpawning, } impl From for ParticleData { @@ -124,7 +132,6 @@ impl From for ParticleData { // this is mostly just here so it fails to compile when a new particle is added // to ParticleKind, since ParticleData has to be updated manually match kind { - ParticleKind::AmbientEntityEffect => Self::AmbientEntityEffect, ParticleKind::AngryVillager => Self::AngryVillager, ParticleKind::Block => Self::Block(BlockParticle::default()), ParticleKind::BlockMarker => Self::BlockMarker(BlockParticle::default()), @@ -151,7 +158,6 @@ impl From for ParticleData { ParticleKind::ExplosionEmitter => Self::ExplosionEmitter, ParticleKind::Explosion => Self::Explosion, ParticleKind::Gust => Self::Gust, - ParticleKind::GustEmitter => Self::GustEmitter, ParticleKind::SonicBoom => Self::SonicBoom, ParticleKind::FallingDust => Self::FallingDust(BlockParticle::default()), ParticleKind::Firework => Self::Firework, @@ -194,7 +200,7 @@ impl From for ParticleData { ParticleKind::BubbleColumnUp => Self::BubbleColumnUp, ParticleKind::Nautilus => Self::Nautilus, ParticleKind::Dolphin => Self::Dolphin, - ParticleKind::CampfireCosySmoke => Self::CampfireCozySmoke, + ParticleKind::CampfireCosySmoke => Self::CampfireCosySmoke, ParticleKind::CampfireSignalSmoke => Self::CampfireSignalSmoke, ParticleKind::DrippingHoney => Self::DrippingHoney, ParticleKind::FallingHoney => Self::FallingHoney, @@ -225,8 +231,18 @@ impl From for ParticleData { ParticleKind::Shriek => Self::Shriek(ShriekParticle::default()), ParticleKind::EggCrack => Self::EggCrack, ParticleKind::DustPlume => Self::DustPlume, - ParticleKind::GustDust => Self::GustDust, + ParticleKind::SmallGust => Self::SmallGust, + ParticleKind::GustEmitterLarge => Self::GustEmitterLarge, + ParticleKind::GustEmitterSmall => Self::GustEmitterSmall, + ParticleKind::Infested => Self::Infested, + ParticleKind::ItemCobweb => Self::ItemCobweb, ParticleKind::TrialSpawnerDetection => Self::TrialSpawnerDetection, + ParticleKind::TrialSpawnerDetectionOminous => Self::TrialSpawnerDetectionOminous, + ParticleKind::VaultConnection => Self::VaultConnection, + ParticleKind::DustPillar => Self::DustPillar, + ParticleKind::OminousSpawning => Self::OminousSpawning, + ParticleKind::RaidOmen => Self::RaidOmen, + ParticleKind::TrialOmen => Self::TrialOmen, } } } diff --git a/azalea-entity/src/plugin/indexing.rs b/azalea-entity/src/plugin/indexing.rs index c8aaffb00..f04f5ef28 100644 --- a/azalea-entity/src/plugin/indexing.rs +++ b/azalea-entity/src/plugin/indexing.rs @@ -5,7 +5,7 @@ use azalea_world::{Instance, InstanceContainer, InstanceName, MinecraftEntityId} use bevy_ecs::{ component::Component, entity::Entity, - query::Changed, + query::{Added, Changed}, system::{Commands, Query, Res, ResMut, Resource}, }; use derive_more::{Deref, DerefMut}; @@ -119,6 +119,24 @@ pub fn update_entity_chunk_positions( } } +/// Insert new entities into [`Instance::entities_by_chunk`]. +pub fn insert_entity_chunk_position( + query: Query<(Entity, &Position, &InstanceName), Added>, + instance_container: Res, +) { + for (entity, pos, world_name) in query.iter() { + let instance_lock = instance_container.get(world_name).unwrap(); + let mut instance = instance_lock.write(); + + let chunk = ChunkPos::from(*pos); + instance + .entities_by_chunk + .entry(chunk) + .or_default() + .insert(entity); + } +} + /// Despawn entities that aren't being loaded by anything. #[allow(clippy::type_complexity)] pub fn remove_despawned_entities_from_indexes( diff --git a/azalea-entity/src/plugin/mod.rs b/azalea-entity/src/plugin/mod.rs index 4b6d99793..de18cbd3e 100644 --- a/azalea-entity/src/plugin/mod.rs +++ b/azalea-entity/src/plugin/mod.rs @@ -43,7 +43,12 @@ impl Plugin for EntityPlugin { .add_systems( Update, ( - (indexing::update_entity_chunk_positions).in_set(EntityUpdateSet::Index), + ( + indexing::update_entity_chunk_positions, + indexing::insert_entity_chunk_position, + ) + .chain() + .in_set(EntityUpdateSet::Index), ( relative_updates::debug_detect_updates_received_on_local_entities, debug_new_entity, diff --git a/azalea-inventory/Cargo.toml b/azalea-inventory/Cargo.toml index aacbd4340..b62081718 100644 --- a/azalea-inventory/Cargo.toml +++ b/azalea-inventory/Cargo.toml @@ -4,12 +4,17 @@ edition = "2021" license = "MIT" name = "azalea-inventory" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-inventory-macros" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -azalea-buf = { version = "0.9.0", path = "../azalea-buf" } -azalea-inventory-macros = { version = "0.9.0", path = "./azalea-inventory-macros" } -azalea-registry = { version = "0.9.0", path = "../azalea-registry" } +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +azalea-buf = { version = "0.10.0", path = "../azalea-buf" } +azalea-inventory-macros = { version = "0.10.0", path = "./azalea-inventory-macros" } +azalea-registry = { version = "0.10.0", path = "../azalea-registry" } +azalea-chat = { version = "0.10.0", path = "../azalea-chat", features = [ + "azalea-buf", +] } +azalea-core = { version = "0.10.0", path = "../azalea-core" } +uuid = "1.8.0" diff --git a/azalea-inventory/README.md b/azalea-inventory/README.md deleted file mode 100644 index 67030f6ae..000000000 --- a/azalea-inventory/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Representations of various inventory data structures in Minecraft. - diff --git a/azalea-inventory/azalea-inventory-macros/Cargo.toml b/azalea-inventory/azalea-inventory-macros/Cargo.toml index f3c406909..9bb7df5ef 100644 --- a/azalea-inventory/azalea-inventory-macros/Cargo.toml +++ b/azalea-inventory/azalea-inventory-macros/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "MIT" name = "azalea-inventory-macros" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-inventory/azalea-inventory-macros" -version = "0.9.0" +version = "0.10.0" [lib] proc-macro = true @@ -12,6 +12,6 @@ proc-macro = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -proc-macro2 = "1.0.78" -quote = "1.0.35" -syn = "2.0.49" +proc-macro2 = "1.0.81" +quote = "1.0.36" +syn = "2.0.60" diff --git a/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs b/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs index 20c2ddc30..de1ec9723 100644 --- a/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs +++ b/azalea-inventory/azalea-inventory-macros/src/parse_macro.rs @@ -1,5 +1,5 @@ use syn::{ - braced, + braced, parse::{Parse, ParseStream, Result}, Ident, LitInt, Token, }; diff --git a/azalea-inventory/src/components.rs b/azalea-inventory/src/components.rs new file mode 100644 index 000000000..948bb96d2 --- /dev/null +++ b/azalea-inventory/src/components.rs @@ -0,0 +1,656 @@ +use core::f64; +use std::{any::Any, collections::HashMap, io::Cursor}; + +use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable}; +use azalea_chat::FormattedText; +use azalea_core::{position::GlobalPos, resource_location::ResourceLocation}; +use azalea_registry::{ + Attribute, Block, DataComponentKind, Enchantment, HolderSet, Item, MobEffect, Potion, + TrimMaterial, TrimPattern, +}; +use simdnbt::owned::{Nbt, NbtCompound}; +use uuid::Uuid; + +use crate::ItemSlot; + +pub trait DataComponent: Send + Sync + Any {} + +pub trait EncodableDataComponent: Send + Sync + Any { + fn encode(&self, buf: &mut Vec) -> Result<(), std::io::Error>; + // using the Clone trait makes it not be object-safe, so we have our own clone + // function instead + fn clone(&self) -> Box; + // same deal here + fn eq(&self, other: Box) -> bool; +} + +impl EncodableDataComponent for T +where + T: DataComponent + Clone + McBufWritable + McBufReadable + PartialEq, +{ + fn encode(&self, buf: &mut Vec) -> Result<(), std::io::Error> { + self.write_into(buf) + } + fn clone(&self) -> Box { + let cloned = self.clone(); + Box::new(cloned) + } + fn eq(&self, other: Box) -> bool { + let other_any: Box = other; + if let Some(other) = other_any.downcast_ref::() { + self == other + } else { + false + } + } +} + +pub fn from_kind( + kind: azalea_registry::DataComponentKind, + buf: &mut Cursor<&[u8]>, +) -> Result, BufReadError> { + Ok(match kind { + DataComponentKind::CustomData => Box::new(CustomData::read_from(buf)?), + DataComponentKind::MaxStackSize => Box::new(MaxStackSize::read_from(buf)?), + DataComponentKind::MaxDamage => Box::new(MaxDamage::read_from(buf)?), + DataComponentKind::Damage => Box::new(Damage::read_from(buf)?), + DataComponentKind::Unbreakable => Box::new(Unbreakable::read_from(buf)?), + DataComponentKind::CustomName => Box::new(CustomName::read_from(buf)?), + DataComponentKind::ItemName => Box::new(ItemName::read_from(buf)?), + DataComponentKind::Lore => Box::new(Lore::read_from(buf)?), + DataComponentKind::Rarity => Box::new(Rarity::read_from(buf)?), + DataComponentKind::Enchantments => Box::new(Enchantments::read_from(buf)?), + DataComponentKind::CanPlaceOn => Box::new(CanPlaceOn::read_from(buf)?), + DataComponentKind::CanBreak => Box::new(CanBreak::read_from(buf)?), + DataComponentKind::AttributeModifiers => Box::new(AttributeModifiers::read_from(buf)?), + DataComponentKind::CustomModelData => Box::new(CustomModelData::read_from(buf)?), + DataComponentKind::HideAdditionalTooltip => { + Box::new(HideAdditionalTooltip::read_from(buf)?) + } + DataComponentKind::HideTooltip => Box::new(HideTooltip::read_from(buf)?), + DataComponentKind::RepairCost => Box::new(RepairCost::read_from(buf)?), + DataComponentKind::CreativeSlotLock => Box::new(CreativeSlotLock::read_from(buf)?), + DataComponentKind::EnchantmentGlintOverride => { + Box::new(EnchantmentGlintOverride::read_from(buf)?) + } + DataComponentKind::IntangibleProjectile => Box::new(IntangibleProjectile::read_from(buf)?), + DataComponentKind::Food => Box::new(Food::read_from(buf)?), + DataComponentKind::FireResistant => Box::new(FireResistant::read_from(buf)?), + DataComponentKind::Tool => Box::new(Tool::read_from(buf)?), + DataComponentKind::StoredEnchantments => Box::new(StoredEnchantments::read_from(buf)?), + DataComponentKind::DyedColor => Box::new(DyedColor::read_from(buf)?), + DataComponentKind::MapColor => Box::new(MapColor::read_from(buf)?), + DataComponentKind::MapId => Box::new(MapId::read_from(buf)?), + DataComponentKind::MapDecorations => Box::new(MapDecorations::read_from(buf)?), + DataComponentKind::MapPostProcessing => Box::new(MapPostProcessing::read_from(buf)?), + DataComponentKind::ChargedProjectiles => Box::new(ChargedProjectiles::read_from(buf)?), + DataComponentKind::BundleContents => Box::new(BundleContents::read_from(buf)?), + DataComponentKind::PotionContents => Box::new(PotionContents::read_from(buf)?), + DataComponentKind::SuspiciousStewEffects => { + Box::new(SuspiciousStewEffects::read_from(buf)?) + } + DataComponentKind::WritableBookContent => Box::new(WritableBookContent::read_from(buf)?), + DataComponentKind::WrittenBookContent => Box::new(WrittenBookContent::read_from(buf)?), + DataComponentKind::Trim => Box::new(Trim::read_from(buf)?), + DataComponentKind::DebugStickState => Box::new(DebugStickState::read_from(buf)?), + DataComponentKind::EntityData => Box::new(EntityData::read_from(buf)?), + DataComponentKind::BucketEntityData => Box::new(BucketEntityData::read_from(buf)?), + DataComponentKind::BlockEntityData => Box::new(BlockEntityData::read_from(buf)?), + DataComponentKind::Instrument => Box::new(Instrument::read_from(buf)?), + DataComponentKind::OminousBottleAmplifier => { + Box::new(OminousBottleAmplifier::read_from(buf)?) + } + DataComponentKind::Recipes => Box::new(Recipes::read_from(buf)?), + DataComponentKind::LodestoneTracker => Box::new(LodestoneTracker::read_from(buf)?), + DataComponentKind::FireworkExplosion => Box::new(FireworkExplosion::read_from(buf)?), + DataComponentKind::Fireworks => Box::new(Fireworks::read_from(buf)?), + DataComponentKind::Profile => Box::new(Profile::read_from(buf)?), + DataComponentKind::NoteBlockSound => Box::new(NoteBlockSound::read_from(buf)?), + DataComponentKind::BannerPatterns => Box::new(BannerPatterns::read_from(buf)?), + DataComponentKind::BaseColor => Box::new(BaseColor::read_from(buf)?), + DataComponentKind::PotDecorations => Box::new(PotDecorations::read_from(buf)?), + DataComponentKind::Container => Box::new(Container::read_from(buf)?), + DataComponentKind::BlockState => Box::new(BlockState::read_from(buf)?), + DataComponentKind::Bees => Box::new(Bees::read_from(buf)?), + DataComponentKind::Lock => Box::new(Lock::read_from(buf)?), + DataComponentKind::ContainerLoot => Box::new(ContainerLoot::read_from(buf)?), + }) +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CustomData { + pub nbt: Nbt, +} +impl DataComponent for CustomData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MaxStackSize { + #[var] + pub count: i32, +} +impl DataComponent for MaxStackSize {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MaxDamage { + #[var] + pub amount: i32, +} +impl DataComponent for MaxDamage {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Damage { + #[var] + pub amount: i32, +} + +impl DataComponent for Damage {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Unbreakable { + pub show_in_tooltip: bool, +} +impl DataComponent for Unbreakable {} +impl Default for Unbreakable { + fn default() -> Self { + Self { + show_in_tooltip: true, + } + } +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CustomName { + pub name: FormattedText, +} +impl DataComponent for CustomName {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ItemName { + pub name: FormattedText, +} +impl DataComponent for ItemName {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Lore { + pub lines: Vec, + // vanilla also has styled_lines here but it doesn't appear to be used for the protocol +} +impl DataComponent for Lore {} + +#[derive(Clone, PartialEq, Copy, McBuf)] +pub enum Rarity { + Common, + Uncommon, + Rare, + Epic, +} +impl DataComponent for Rarity {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Enchantments { + #[var] + pub levels: HashMap, + pub show_in_tooltip: bool, +} +impl DataComponent for Enchantments {} + +#[derive(Clone, PartialEq, McBuf)] +pub enum BlockStateValueMatcher { + Exact { + value: String, + }, + Range { + min: Option, + max: Option, + }, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockStatePropertyMatcher { + pub name: String, + pub value_matcher: BlockStateValueMatcher, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockPredicate { + pub blocks: Option>, + pub properties: Option>, + pub nbt: Option, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct AdventureModePredicate { + pub predicates: Vec, + pub show_in_tooltip: bool, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CanPlaceOn { + pub predicate: AdventureModePredicate, +} +impl DataComponent for CanPlaceOn {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CanBreak { + pub predicate: AdventureModePredicate, +} +impl DataComponent for CanBreak {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum EquipmentSlotGroup { + Any, + Mainhand, + Offhand, + Hand, + Feet, + Legs, + Chest, + Head, + Armor, + Body, +} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum AttributeModifierOperation { + Addition, + MultiplyBase, + MultiplyTotal, +} + +// this is duplicated in azalea-entity, BUT the one there has a different +// protocol format (and we can't use it anyways because it would cause a +// circular dependency) +#[derive(Clone, PartialEq, McBuf)] +pub struct AttributeModifier { + pub uuid: Uuid, + pub name: String, + pub amount: f64, + pub operation: AttributeModifierOperation, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct AttributeModifiersEntry { + pub attribute: Attribute, + pub modifier: AttributeModifier, + pub slot: EquipmentSlotGroup, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct AttributeModifiers { + pub modifiers: Vec, + pub show_in_tooltip: bool, +} +impl DataComponent for AttributeModifiers {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CustomModelData { + #[var] + pub value: i32, +} +impl DataComponent for CustomModelData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct HideAdditionalTooltip; +impl DataComponent for HideAdditionalTooltip {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct HideTooltip; +impl DataComponent for HideTooltip {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct RepairCost { + #[var] + pub cost: u32, +} +impl DataComponent for RepairCost {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct CreativeSlotLock; +impl DataComponent for CreativeSlotLock {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct EnchantmentGlintOverride { + pub show_glint: bool, +} +impl DataComponent for EnchantmentGlintOverride {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct IntangibleProjectile; +impl DataComponent for IntangibleProjectile {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MobEffectDetails { + #[var] + pub amplifier: i32, + #[var] + pub duration: i32, + pub ambient: bool, + pub show_particles: bool, + pub show_icon: bool, + pub hidden_effect: Option>, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MobEffectInstance { + pub effect: MobEffect, + pub details: MobEffectDetails, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct PossibleEffect { + pub effect: MobEffectInstance, + pub probability: f32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Food { + #[var] + pub nutrition: i32, + pub saturation: f32, + pub can_always_eat: bool, + pub eat_seconds: f32, + pub effects: Vec, +} +impl DataComponent for Food {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct FireResistant; +impl DataComponent for FireResistant {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ToolRule { + pub blocks: HolderSet, + pub speed: Option, + pub correct_for_drops: Option, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Tool { + pub rules: Vec, + pub default_mining_speed: f32, + #[var] + pub damage_per_block: i32, +} +impl DataComponent for Tool {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct StoredEnchantments { + #[var] + pub enchantments: HashMap, + pub show_in_tooltip: bool, +} +impl DataComponent for StoredEnchantments {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct DyedColor { + pub rgb: i32, + pub show_in_tooltip: bool, +} +impl DataComponent for DyedColor {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MapColor { + pub color: i32, +} +impl DataComponent for MapColor {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MapId { + #[var] + pub id: i32, +} +impl DataComponent for MapId {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct MapDecorations { + pub decorations: NbtCompound, +} +impl DataComponent for MapDecorations {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum MapPostProcessing { + Lock, + Scale, +} +impl DataComponent for MapPostProcessing {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ChargedProjectiles { + pub items: Vec, +} +impl DataComponent for ChargedProjectiles {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BundleContents { + pub items: Vec, +} +impl DataComponent for BundleContents {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct PotionContents { + pub potion: Option, + pub custom_color: Option, + pub custom_effects: Vec, +} +impl DataComponent for PotionContents {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct SuspiciousStewEffect { + pub effect: MobEffect, + #[var] + pub duration: i32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct SuspiciousStewEffects { + pub effects: Vec, +} +impl DataComponent for SuspiciousStewEffects {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct WritableBookContent { + pub pages: Vec, +} +impl DataComponent for WritableBookContent {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct WrittenBookContent { + pub title: String, + pub author: String, + #[var] + pub generation: i32, + pub pages: Vec, + pub resolved: bool, +} +impl DataComponent for WrittenBookContent {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Trim { + pub material: TrimMaterial, + pub pattern: TrimPattern, + pub show_in_tooltip: bool, +} +impl DataComponent for Trim {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct DebugStickState { + pub properties: NbtCompound, +} +impl DataComponent for DebugStickState {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct EntityData { + pub entity: NbtCompound, +} +impl DataComponent for EntityData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BucketEntityData { + pub entity: NbtCompound, +} +impl DataComponent for BucketEntityData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockEntityData { + pub entity: NbtCompound, +} +impl DataComponent for BlockEntityData {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Instrument { + pub instrument: azalea_registry::Instrument, +} +impl DataComponent for Instrument {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct OminousBottleAmplifier { + #[var] + pub amplifier: i32, +} +impl DataComponent for OminousBottleAmplifier {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Recipes { + pub recipes: Vec, +} +impl DataComponent for Recipes {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct LodestoneTracker { + pub target: Option, + pub tracked: bool, +} +impl DataComponent for LodestoneTracker {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum FireworkExplosionShape { + SmallBall, + LargeBall, + Star, + Creeper, + Burst, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct FireworkExplosion { + pub shape: FireworkExplosionShape, + pub colors: Vec, + pub fade_colors: Vec, + pub has_trail: bool, + pub has_twinkle: bool, +} +impl DataComponent for FireworkExplosion {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Fireworks { + #[var] + pub flight_duration: i32, + pub explosions: Vec, +} +impl DataComponent for Fireworks {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct GameProfileProperty { + pub name: String, + pub value: String, + pub signature: Option, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Profile { + pub name: String, + pub id: Option, + pub properties: Vec, +} +impl DataComponent for Profile {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct NoteBlockSound { + pub sound: ResourceLocation, +} +impl DataComponent for NoteBlockSound {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BannerPattern { + #[var] + pub pattern: i32, + #[var] + pub color: i32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BannerPatterns { + pub patterns: Vec, +} +impl DataComponent for BannerPatterns {} + +#[derive(Clone, Copy, PartialEq, McBuf)] +pub enum DyeColor { + White, + Orange, + Magenta, + LightBlue, + Yellow, + Lime, + Pink, + Gray, + LightGray, + Cyan, + Purple, + Blue, + Brown, + Green, + Red, + Black, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BaseColor { + pub color: DyeColor, +} +impl DataComponent for BaseColor {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct PotDecorations { + pub items: Vec, +} +impl DataComponent for PotDecorations {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Container { + pub items: Vec, +} +impl DataComponent for Container {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BlockState { + pub properties: HashMap, +} +impl DataComponent for BlockState {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct BeehiveOccupant { + pub entity_data: NbtCompound, + #[var] + pub ticks_in_hive: i32, + #[var] + pub min_ticks_in_hive: i32, +} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Bees { + pub occupants: Vec, +} +impl DataComponent for Bees {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct Lock { + pub key: String, +} +impl DataComponent for Lock {} + +#[derive(Clone, PartialEq, McBuf)] +pub struct ContainerLoot { + pub loot: NbtCompound, +} +impl DataComponent for ContainerLoot {} diff --git a/azalea-inventory/src/item/mod.rs b/azalea-inventory/src/item/mod.rs index 0ad7b2c04..862cd20e1 100644 --- a/azalea-inventory/src/item/mod.rs +++ b/azalea-inventory/src/item/mod.rs @@ -5,7 +5,7 @@ pub trait MaxStackSizeExt { /// [`ItemSlotData`]. /// /// [`ItemSlotData`]: crate::ItemSlotData - fn max_stack_size(&self) -> i8; + fn max_stack_size(&self) -> i32; /// Whether this item can be stacked with other items. /// @@ -16,7 +16,7 @@ pub trait MaxStackSizeExt { } impl MaxStackSizeExt for azalea_registry::Item { - fn max_stack_size(&self) -> i8 { + fn max_stack_size(&self) -> i32 { // TODO: have the properties for every item defined somewhere 64 } diff --git a/azalea-inventory/src/lib.rs b/azalea-inventory/src/lib.rs index b2ea215a1..ba14eff8d 100644 --- a/azalea-inventory/src/lib.rs +++ b/azalea-inventory/src/lib.rs @@ -1,5 +1,7 @@ -#![doc = include_str!("../README.md")] +#![feature(trait_upcasting)] +/// Representations of various inventory data structures in Minecraft. +pub mod components; pub mod item; pub mod operations; mod slot; diff --git a/azalea-inventory/src/operations.rs b/azalea-inventory/src/operations.rs index ca21a3e78..652d19004 100644 --- a/azalea-inventory/src/operations.rs +++ b/azalea-inventory/src/operations.rs @@ -621,7 +621,7 @@ impl Menu { } /// Get the maximum number of items that can be placed in this slot. - pub fn max_stack_size(&self, _target_slot_index: usize) -> u8 { + pub fn max_stack_size(&self, _target_slot_index: usize) -> u32 { 64 } @@ -671,9 +671,11 @@ impl Menu { let target_slot = self.slot(target_slot_index).unwrap(); if let ItemSlot::Present(target_item) = target_slot { // the target slot is empty, so we can just move the item there - if self.may_place(target_slot_index, item) && target_item.is_same_item_and_nbt(item) { + if self.may_place(target_slot_index, item) + && target_item.is_same_item_and_components(item) + { let slot_item_limit = self.max_stack_size(target_slot_index); - let new_target_slot_data = item.split(u8::min(slot_item_limit, item.count as u8)); + let new_target_slot_data = item.split(u32::min(slot_item_limit, item.count as u32)); // get the target slot again but mut this time so we can update it let target_slot = self.slot_mut(target_slot_index).unwrap(); @@ -691,7 +693,7 @@ impl Menu { let target_slot = self.slot(target_slot_index).unwrap(); if target_slot.is_empty() && self.may_place(target_slot_index, item) { let slot_item_limit = self.max_stack_size(target_slot_index); - let new_target_slot_data = item.split(u8::min(slot_item_limit, item.count as u8)); + let new_target_slot_data = item.split(u32::min(slot_item_limit, item.count as u32)); let target_slot = self.slot_mut(target_slot_index).unwrap(); *target_slot = ItemSlot::Present(new_target_slot_data); diff --git a/azalea-inventory/src/slot.rs b/azalea-inventory/src/slot.rs index c4f8da056..9aa33263c 100644 --- a/azalea-inventory/src/slot.rs +++ b/azalea-inventory/src/slot.rs @@ -1,6 +1,12 @@ -use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable}; -use simdnbt::owned::Nbt; -use std::io::{Cursor, Write}; +use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; +use azalea_registry::DataComponentKind; +use std::{ + collections::HashMap, + fmt, + io::{Cursor, Write}, +}; + +use crate::components::{self}; /// Either an item in an inventory or nothing. #[derive(Debug, Clone, Default, PartialEq)] @@ -33,7 +39,7 @@ impl ItemSlot { /// /// Note that it's possible for the count to be zero or negative when the /// slot is present. - pub fn count(&self) -> i8 { + pub fn count(&self) -> i32 { match self { ItemSlot::Empty => 0, ItemSlot::Present(i) => i.count, @@ -41,7 +47,7 @@ impl ItemSlot { } /// Remove `count` items from this slot, returning the removed items. - pub fn split(&mut self, count: u8) -> ItemSlot { + pub fn split(&mut self, count: u32) -> ItemSlot { match self { ItemSlot::Empty => ItemSlot::Empty, ItemSlot::Present(i) => { @@ -83,20 +89,20 @@ impl ItemSlot { /// An item in an inventory, with a count and NBT. Usually you want [`ItemSlot`] /// or [`azalea_registry::Item`] instead. -#[derive(Debug, Clone, McBuf, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub struct ItemSlotData { - pub kind: azalea_registry::Item, /// The amount of the item in this slot. /// /// The count can be zero or negative, but this is rare. - pub count: i8, - pub nbt: Nbt, + pub count: i32, + pub kind: azalea_registry::Item, + pub components: DataComponentPatch, } impl ItemSlotData { /// Remove `count` items from this slot, returning the removed items. - pub fn split(&mut self, count: u8) -> ItemSlotData { - let returning_count = i8::min(count as i8, self.count); + pub fn split(&mut self, count: u32) -> ItemSlotData { + let returning_count = i32::min(count as i32, self.count); let mut returning = self.clone(); returning.count = returning_count; self.count -= returning_count; @@ -116,39 +122,161 @@ impl ItemSlotData { /// let mut a = ItemSlotData { /// kind: Item::Stone, /// count: 1, - /// nbt: Default::default(), + /// components: Default::default(), /// }; /// let mut b = ItemSlotData { /// kind: Item::Stone, /// count: 2, - /// nbt: Default::default(), + /// components: Default::default(), /// }; - /// assert!(a.is_same_item_and_nbt(&b)); + /// assert!(a.is_same_item_and_components(&b)); /// /// b.kind = Item::Dirt; - /// assert!(!a.is_same_item_and_nbt(&b)); + /// assert!(!a.is_same_item_and_components(&b)); /// ``` - pub fn is_same_item_and_nbt(&self, other: &ItemSlotData) -> bool { - self.kind == other.kind && self.nbt == other.nbt + pub fn is_same_item_and_components(&self, other: &ItemSlotData) -> bool { + self.kind == other.kind && self.components == other.components } } impl McBufReadable for ItemSlot { fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let slot = Option::::read_from(buf)?; - Ok(slot.map_or(ItemSlot::Empty, ItemSlot::Present)) + let count = i32::var_read_from(buf)?; + if count <= 0 { + Ok(ItemSlot::Empty) + } else { + let kind = azalea_registry::Item::read_from(buf)?; + let components = DataComponentPatch::read_from(buf)?; + Ok(ItemSlot::Present(ItemSlotData { + count, + kind, + components, + })) + } } } impl McBufWritable for ItemSlot { fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { match self { - ItemSlot::Empty => false.write_into(buf)?, + ItemSlot::Empty => 0.var_write_into(buf)?, ItemSlot::Present(i) => { - true.write_into(buf)?; - i.write_into(buf)?; + i.count.var_write_into(buf)?; + i.kind.write_into(buf)?; + i.components.write_into(buf)?; } }; Ok(()) } } + +#[derive(Default)] +pub struct DataComponentPatch { + components: HashMap>>, +} + +impl DataComponentPatch { + pub fn get(&self, kind: DataComponentKind) -> Option<&dyn components::EncodableDataComponent> { + self.components.get(&kind).and_then(|c| c.as_deref()) + } +} + +impl McBufReadable for DataComponentPatch { + fn read_from(buf: &mut Cursor<&[u8]>) -> Result { + let components_with_data_count = u32::var_read_from(buf)?; + let components_without_data_count = u32::var_read_from(buf)?; + + if components_without_data_count == 0 && components_with_data_count == 0 { + return Ok(DataComponentPatch::default()); + } + + let mut components = HashMap::new(); + for _ in 0..components_with_data_count { + let component_kind = DataComponentKind::read_from(buf)?; + let component_data = components::from_kind(component_kind, buf)?; + components.insert(component_kind, Some(component_data)); + } + + for _ in 0..components_without_data_count { + let component_kind = DataComponentKind::read_from(buf)?; + components.insert(component_kind, None); + } + + Ok(DataComponentPatch { components }) + } +} + +impl McBufWritable for DataComponentPatch { + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + let mut components_with_data_count = 0; + let mut components_without_data_count = 0; + for component in self.components.values() { + if component.is_some() { + components_with_data_count += 1; + } else { + components_without_data_count += 1; + } + } + + components_with_data_count.write_into(buf)?; + components_without_data_count.write_into(buf)?; + + for (kind, component) in &self.components { + if let Some(component) = component { + kind.write_into(buf)?; + let mut component_buf = Vec::new(); + component.encode(&mut component_buf).unwrap(); + component_buf.write_into(buf)?; + } + } + + for (kind, component) in &self.components { + if component.is_none() { + kind.write_into(buf)?; + } + } + + Ok(()) + } +} + +impl Clone for DataComponentPatch { + fn clone(&self) -> Self { + let mut components = HashMap::with_capacity(self.components.len()); + for (kind, component) in &self.components { + components.insert(*kind, component.as_ref().map(|c| (*c).clone())); + } + DataComponentPatch { components } + } +} +impl fmt::Debug for DataComponentPatch { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_set().entries(self.components.keys()).finish() + } +} +impl PartialEq for DataComponentPatch { + fn eq(&self, other: &Self) -> bool { + if self.components.len() != other.components.len() { + return false; + } + for (kind, component) in &self.components { + if let Some(other_component) = other.components.get(kind) { + // we can't use PartialEq, but we can use our own eq method + if let Some(component) = component { + if let Some(other_component) = other_component { + if !component.eq((*other_component).clone()) { + return false; + } + } else { + return false; + } + } else if other_component.is_some() { + return false; + } + } else { + return false; + } + } + true + } +} diff --git a/azalea-language/Cargo.toml b/azalea-language/Cargo.toml index 3ffa1f1c8..962442e28 100644 --- a/azalea-language/Cargo.toml +++ b/azalea-language/Cargo.toml @@ -4,12 +4,12 @@ edition = "2021" license = "MIT" name = "azalea-language" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-language" -version = "0.9.0" +version = "0.10.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] once_cell = "1.19.0" serde = "^1.0" -serde_json = "^1.0.113" +serde_json = "^1.0.116" # tokio = {version = "^1.21.2", features = ["fs"]} diff --git a/azalea-language/src/en_us.json b/azalea-language/src/en_us.json index 85ae19902..95f56701e 100755 --- a/azalea-language/src/en_us.json +++ b/azalea-language/src/en_us.json @@ -18,10 +18,16 @@ "advancements.adventure.arbalistic.title": "Arbalistic", "advancements.adventure.avoid_vibration.description": "Sneak near a Sculk Sensor or Warden to prevent it from detecting you", "advancements.adventure.avoid_vibration.title": "Sneak 100", + "advancements.adventure.blowback.description": "Kill a Breeze with a deflected Breeze-shot Wind Charge", + "advancements.adventure.blowback.title": "Blowback", + "advancements.adventure.brush_armadillo.description": "Get Armadillo Scutes from an Armadillo using a Brush", + "advancements.adventure.brush_armadillo.title": "Isn't It Scute?", "advancements.adventure.bullseye.description": "Hit the bullseye of a Target block from at least 30 meters away", "advancements.adventure.bullseye.title": "Bullseye", "advancements.adventure.craft_decorated_pot_using_only_sherds.description": "Make a Decorated Pot out of 4 Pottery Sherds", "advancements.adventure.craft_decorated_pot_using_only_sherds.title": "Careful Restoration", + "advancements.adventure.crafters_crafting_crafters.description": "Be near a Crafter when it crafts a Crafter", + "advancements.adventure.crafters_crafting_crafters.title": "Crafters Crafting Crafters", "advancements.adventure.fall_from_world_height.description": "Free fall from the top of the world (build limit) to the bottom of the world and survive", "advancements.adventure.fall_from_world_height.title": "Caves & Cliffs", "advancements.adventure.hero_of_the_village.description": "Successfully defend a village from a raid", @@ -34,14 +40,22 @@ "advancements.adventure.kill_all_mobs.title": "Monsters Hunted", "advancements.adventure.kill_mob_near_sculk_catalyst.description": "Kill a mob near a Sculk Catalyst", "advancements.adventure.kill_mob_near_sculk_catalyst.title": "It Spreads", + "advancements.adventure.lighten_up.description": "Scrape a Copper Bulb with an Axe to make it brighter", + "advancements.adventure.lighten_up.title": "Lighten Up", "advancements.adventure.lightning_rod_with_villager_no_fire.description": "Protect a Villager from an undesired shock without starting a fire", "advancements.adventure.lightning_rod_with_villager_no_fire.title": "Surge Protector", + "advancements.adventure.minecraft_trials_edition.description": "Step foot in a Trial Chamber", + "advancements.adventure.minecraft_trials_edition.title": "Minecraft: Trial(s) Edition", "advancements.adventure.ol_betsy.description": "Shoot a Crossbow", "advancements.adventure.ol_betsy.title": "Ol' Betsy", + "advancements.adventure.overoverkill.description": "Deal 50 hearts of damage in a single hit using the Mace", + "advancements.adventure.overoverkill.title": "Over-Overkill", "advancements.adventure.play_jukebox_in_meadows.description": "Make the Meadows come alive with the sound of music from a Jukebox", "advancements.adventure.play_jukebox_in_meadows.title": "Sound of Music", "advancements.adventure.read_power_from_chiseled_bookshelf.description": "Read the power signal of a Chiseled Bookshelf using a Comparator", "advancements.adventure.read_power_from_chiseled_bookshelf.title": "The Power of Books", + "advancements.adventure.revaulting.description": "Unlock an Ominous Vault with an Ominous Trial Key", + "advancements.adventure.revaulting.title": "Revaulting", "advancements.adventure.root.description": "Adventure, exploration and combat", "advancements.adventure.root.title": "Adventure", "advancements.adventure.salvage_sherd.description": "Brush a Suspicious block to obtain a Pottery Sherd", @@ -74,12 +88,16 @@ "advancements.adventure.trim_with_any_armor_pattern.title": "Crafting a New Look", "advancements.adventure.two_birds_one_arrow.description": "Kill two Phantoms with a piercing Arrow", "advancements.adventure.two_birds_one_arrow.title": "Two Birds, One Arrow", + "advancements.adventure.under_lock_and_key.description": "Unlock a Vault with a Trial Key", + "advancements.adventure.under_lock_and_key.title": "Under Lock and Key", "advancements.adventure.very_very_frightening.description": "Strike a Villager with lightning", "advancements.adventure.very_very_frightening.title": "Very Very Frightening", "advancements.adventure.voluntary_exile.description": "Kill a raid captain.\nMaybe consider staying away from villages for the time being...", "advancements.adventure.voluntary_exile.title": "Voluntary Exile", "advancements.adventure.walk_on_powder_snow_with_leather_boots.description": "Walk on Powder Snow... without sinking in it", "advancements.adventure.walk_on_powder_snow_with_leather_boots.title": "Light as a Rabbit", + "advancements.adventure.who_needs_rockets.description": "Use a Wind Charge to launch yourself upward 8 blocks", + "advancements.adventure.who_needs_rockets.title": "Who Needs Rockets?", "advancements.adventure.whos_the_pillager_now.description": "Give a Pillager a taste of their own medicine", "advancements.adventure.whos_the_pillager_now.title": "Who's the Pillager Now?", "advancements.empty": "There doesn't seem to be anything here...", @@ -135,6 +153,10 @@ "advancements.husbandry.plant_any_sniffer_seed.title": "Planting the Past", "advancements.husbandry.plant_seed.description": "Plant a seed and watch it grow", "advancements.husbandry.plant_seed.title": "A Seedy Place", + "advancements.husbandry.remove_wolf_armor.description": "Remove Wolf Armor from a Wolf using Shears", + "advancements.husbandry.remove_wolf_armor.title": "Shear Brilliance", + "advancements.husbandry.repair_wolf_armor.description": "Repair a damaged Wolf Armor using Armadillo Scutes", + "advancements.husbandry.repair_wolf_armor.title": "Good as New", "advancements.husbandry.ride_a_boat_with_a_goat.description": "Get in a Boat and float with a Goat", "advancements.husbandry.ride_a_boat_with_a_goat.title": "Whatever Floats Your Goat!", "advancements.husbandry.root.description": "The world is full of friends and food", @@ -153,6 +175,8 @@ "advancements.husbandry.wax_off.title": "Wax Off", "advancements.husbandry.wax_on.description": "Apply Honeycomb to a Copper block!", "advancements.husbandry.wax_on.title": "Wax On", + "advancements.husbandry.whole_pack.description": "Tame one of each Wolf variant", + "advancements.husbandry.whole_pack.title": "The Whole Pack", "advancements.nether.all_effects.description": "Have every effect applied at the same time", "advancements.nether.all_effects.title": "How Did We Get Here?", "advancements.nether.all_potions.description": "Have every potion effect applied at the same time", @@ -332,6 +356,7 @@ "argument.literal.incorrect": "Expected literal %s", "argument.long.big": "Long must not be more than %s, found %s", "argument.long.low": "Long must not be less than %s, found %s", + "argument.message.too_long": "Chat message was too long (%s > maximum %s characters)", "argument.nbt.array.invalid": "Invalid array type '%s'", "argument.nbt.array.mixed": "Can't insert %s into %s", "argument.nbt.expected.key": "Expected key", @@ -352,6 +377,8 @@ "argument.range.empty": "Expected value or range of values", "argument.range.ints": "Only whole numbers allowed, not decimals", "argument.range.swapped": "Min cannot be bigger than max", + "argument.resource_or_id.failed_to_parse": "Failed to parse structure: %s", + "argument.resource_or_id.invalid": "Invalid id or tag", "argument.resource_tag.invalid_type": "Tag '%s' has wrong type '%s' (expected '%s')", "argument.resource_tag.not_found": "Can't find tag '%s' of type '%s'", "argument.resource.invalid_type": "Element '%s' has wrong type '%s' (expected '%s')", @@ -360,14 +387,21 @@ "argument.scoreboardDisplaySlot.invalid": "Unknown display slot '%s'", "argument.scoreHolder.empty": "No relevant score holders could be found", "argument.style.invalid": "Invalid style: %s", - "argument.time.invalid_tick_count": "Tick count must be non-negative", + "argument.time.invalid_tick_count": "The tick count must be non-negative", "argument.time.invalid_unit": "Invalid unit", - "argument.time.tick_count_too_low": "Tick count must not be less than %s, found %s", + "argument.time.tick_count_too_low": "The tick count must not be less than %s, found %s", "argument.uuid.invalid": "Invalid UUID", "arguments.block.tag.unknown": "Unknown block tag '%s'", "arguments.function.tag.unknown": "Unknown function tag '%s'", "arguments.function.unknown": "Unknown function %s", + "arguments.item.component.expected": "Expected item component", + "arguments.item.component.malformed": "Malformed '%s' component: '%s'", + "arguments.item.component.repeated": "Item component '%s' was repeated, but only one value can be specified", + "arguments.item.component.unknown": "Unknown item component '%s'", + "arguments.item.malformed": "Malformed item: '%s'", "arguments.item.overstacked": "%s can only stack up to %s", + "arguments.item.predicate.malformed": "Malformed '%s' predicate: '%s'", + "arguments.item.predicate.unknown": "Unknown item predicate '%s'", "arguments.item.tag.unknown": "Unknown item tag '%s'", "arguments.nbtpath.node.invalid": "Invalid NBT path element", "arguments.nbtpath.nothing_found": "Found no elements matching %s", @@ -392,14 +426,25 @@ "attribute.name.generic.attack_damage": "Attack Damage", "attribute.name.generic.attack_knockback": "Attack Knockback", "attribute.name.generic.attack_speed": "Attack Speed", + "attribute.name.generic.block_interaction_range": "Block Interaction Range", + "attribute.name.generic.entity_interaction_range": "Entity Interaction Range", + "attribute.name.generic.fall_damage_multiplier": "Fall Damage Multiplier", "attribute.name.generic.flying_speed": "Flying Speed", "attribute.name.generic.follow_range": "Mob Follow Range", + "attribute.name.generic.gravity": "Gravity", + "attribute.name.generic.jump_strength": "Jump Strength", "attribute.name.generic.knockback_resistance": "Knockback Resistance", "attribute.name.generic.luck": "Luck", "attribute.name.generic.max_absorption": "Max Absorption", "attribute.name.generic.max_health": "Max Health", "attribute.name.generic.movement_speed": "Speed", + "attribute.name.generic.safe_fall_distance": "Safe Fall Distance", + "attribute.name.generic.scale": "Scale", + "attribute.name.generic.step_height": "Step Height", "attribute.name.horse.jump_strength": "Horse Jump Strength", + "attribute.name.player.block_break_speed": "Block Break Speed", + "attribute.name.player.block_interaction_range": "Block Interaction Range", + "attribute.name.player.entity_interaction_range": "Entity Interaction Range", "attribute.name.zombie.spawn_reinforcements": "Zombie Reinforcements", "biome.minecraft.badlands": "Badlands", "biome.minecraft.bamboo_jungle": "Bamboo Jungle", @@ -693,6 +738,22 @@ "block.minecraft.banner.diagonal_up_right.red": "Red Per Bend Sinister Inverted", "block.minecraft.banner.diagonal_up_right.white": "White Per Bend Sinister Inverted", "block.minecraft.banner.diagonal_up_right.yellow": "Yellow Per Bend Sinister Inverted", + "block.minecraft.banner.flow.black": "Black Flow", + "block.minecraft.banner.flow.blue": "Blue Flow", + "block.minecraft.banner.flow.brown": "Brown Flow", + "block.minecraft.banner.flow.cyan": "Cyan Flow", + "block.minecraft.banner.flow.gray": "Gray Flow", + "block.minecraft.banner.flow.green": "Green Flow", + "block.minecraft.banner.flow.light_blue": "Light Blue Flow", + "block.minecraft.banner.flow.light_gray": "Light Gray Flow", + "block.minecraft.banner.flow.lime": "Lime Flow", + "block.minecraft.banner.flow.magenta": "Magenta Flow", + "block.minecraft.banner.flow.orange": "Orange Flow", + "block.minecraft.banner.flow.pink": "Pink Flow", + "block.minecraft.banner.flow.purple": "Purple Flow", + "block.minecraft.banner.flow.red": "Red Flow", + "block.minecraft.banner.flow.white": "White Flow", + "block.minecraft.banner.flow.yellow": "Yellow Flow", "block.minecraft.banner.flower.black": "Black Flower Charge", "block.minecraft.banner.flower.blue": "Blue Flower Charge", "block.minecraft.banner.flower.brown": "Brown Flower Charge", @@ -757,6 +818,22 @@ "block.minecraft.banner.gradient.red": "Red Gradient", "block.minecraft.banner.gradient.white": "White Gradient", "block.minecraft.banner.gradient.yellow": "Yellow Gradient", + "block.minecraft.banner.guster.black": "Black Guster", + "block.minecraft.banner.guster.blue": "Blue Guster", + "block.minecraft.banner.guster.brown": "Brown Guster", + "block.minecraft.banner.guster.cyan": "Cyan Guster", + "block.minecraft.banner.guster.gray": "Gray Guster", + "block.minecraft.banner.guster.green": "Green Guster", + "block.minecraft.banner.guster.light_blue": "Light Blue Guster", + "block.minecraft.banner.guster.light_gray": "Light Gray Guster", + "block.minecraft.banner.guster.lime": "Lime Guster", + "block.minecraft.banner.guster.magenta": "Magenta Guster", + "block.minecraft.banner.guster.orange": "Orange Guster", + "block.minecraft.banner.guster.pink": "Pink Guster", + "block.minecraft.banner.guster.purple": "Purple Guster", + "block.minecraft.banner.guster.red": "Red Guster", + "block.minecraft.banner.guster.white": "White Guster", + "block.minecraft.banner.guster.yellow": "Yellow Guster", "block.minecraft.banner.half_horizontal_bottom.black": "Black Per Fess Inverted", "block.minecraft.banner.half_horizontal_bottom.blue": "Blue Per Fess Inverted", "block.minecraft.banner.half_horizontal_bottom.brown": "Brown Per Fess Inverted", @@ -1551,6 +1628,7 @@ "block.minecraft.grindstone": "Grindstone", "block.minecraft.hanging_roots": "Hanging Roots", "block.minecraft.hay_block": "Hay Bale", + "block.minecraft.heavy_core": "Heavy Core", "block.minecraft.heavy_weighted_pressure_plate": "Heavy Weighted Pressure Plate", "block.minecraft.honey_block": "Honey Block", "block.minecraft.honeycomb_block": "Honeycomb Block", @@ -2071,6 +2149,7 @@ "block.minecraft.turtle_egg": "Turtle Egg", "block.minecraft.twisting_vines": "Twisting Vines", "block.minecraft.twisting_vines_plant": "Twisting Vines Plant", + "block.minecraft.vault": "Vault", "block.minecraft.verdant_froglight": "Verdant Froglight", "block.minecraft.vine": "Vines", "block.minecraft.void_air": "Void Air", @@ -2200,9 +2279,12 @@ "chat.deleted_marker": "This chat message has been deleted by the server.", "chat.disabled.chain_broken": "Chat disabled due to broken chain. Please try reconnecting.", "chat.disabled.expiredProfileKey": "Chat disabled due to expired profile public key. Please try reconnecting.", + "chat.disabled.invalid_command_signature": "Command had unexpected or missing command argument signatures.", + "chat.disabled.invalid_signature": "Chat had an invalid signature. Please try reconnecting.", "chat.disabled.launcher": "Chat disabled by launcher option. Cannot send message.", "chat.disabled.missingProfileKey": "Chat disabled due to missing profile public key. Please try reconnecting.", "chat.disabled.options": "Chat disabled in client options.", + "chat.disabled.out_of_order_chat": "Chat received out-of-order. Did your system time change?", "chat.disabled.profile": "Chat not allowed by account settings. Press '%s' again for more information.", "chat.disabled.profile.moreInfo": "Chat not allowed by account settings. Cannot send or view messages.", "chat.editBox": "chat", @@ -2231,6 +2313,11 @@ "chat.type.text": "<%s> %s", "chat.type.text.narrate": "%s says %s", "chat.validation_error": "Chat validation error", + "chunk.toast.checkLog": "See log for more details", + "chunk.toast.loadFailure": "Failed to load chunk at %s", + "chunk.toast.lowDiskSpace": "Low disk space!", + "chunk.toast.lowDiskSpace.description": "Might not be able to save the world.", + "chunk.toast.saveFailure": "Failed to save chunk at %s", "clear.failed.multiple": "No items were found on %s players", "clear.failed.single": "No items were found on player %s", "color.minecraft.black": "Black", @@ -2363,6 +2450,7 @@ "commands.data.storage.modified": "Modified storage %s", "commands.data.storage.query": "Storage %s has the following contents: %s", "commands.datapack.disable.failed": "Pack '%s' is not enabled!", + "commands.datapack.disable.failed.feature": "Pack '%s' cannot be disabled, since it is part of an enabled flag!", "commands.datapack.enable.failed": "Pack '%s' is already enabled!", "commands.datapack.enable.failed.no_flags": "Pack '%s' cannot be enabled, since required flags are not enabled in this world: %s!", "commands.datapack.list.available.none": "There are no more data packs available", @@ -2613,6 +2701,7 @@ "commands.setblock.failed": "Could not set the block", "commands.setblock.success": "Changed the block at %s, %s, %s", "commands.setidletimeout.success": "The player idle timeout is now %s minute(s)", + "commands.setworldspawn.failure.not_overworld": "Can only set the world spawn for overworld", "commands.setworldspawn.success": "Set the world spawn point to %s, %s, %s [%s]", "commands.spawnpoint.success.multiple": "Set spawn point to %s, %s, %s [%s] in %s for %s players", "commands.spawnpoint.success.single": "Set spawn point to %s, %s, %s [%s] in %s for %s", @@ -2689,14 +2778,14 @@ "commands.tick.rate.success": "Set the target tick rate to %s per second", "commands.tick.sprint.report": "Sprint completed with %s ticks per second, or %s ms per tick", "commands.tick.sprint.stop.fail": "No tick sprint in progress", - "commands.tick.sprint.stop.success": "A tick sprint interrupted", + "commands.tick.sprint.stop.success": "Interrupted the current tick sprint", "commands.tick.status.frozen": "The game is frozen", "commands.tick.status.lagging": "The game is running, but can't keep up with the target tick rate", - "commands.tick.status.running": "The game runs normally", + "commands.tick.status.running": "The game is running normally", "commands.tick.status.sprinting": "The game is sprinting", "commands.tick.step.fail": "Unable to step the game - the game must be frozen first", "commands.tick.step.stop.fail": "No tick step in progress", - "commands.tick.step.stop.success": "A tick step interrupted", + "commands.tick.step.stop.success": "Interrupted the current tick step", "commands.tick.step.success": "Stepping %s tick(s)", "commands.time.query": "The time is %s", "commands.time.set": "Set the time to %s", @@ -2712,6 +2801,9 @@ "commands.title.show.title.single": "Showing new title for %s", "commands.title.times.multiple": "Changed title display times for %s players", "commands.title.times.single": "Changed title display times for %s", + "commands.transfer.error.no_players": "Must specify at least one player to transfer", + "commands.transfer.success.multiple": "Transferring %s players to %s:%s", + "commands.transfer.success.single": "Transferring %s to %s:%s", "commands.trigger.add.success": "Triggered %s (added %s to value)", "commands.trigger.failed.invalid": "You can only trigger objectives that are 'trigger' type", "commands.trigger.failed.unprimed": "You cannot trigger this objective yet", @@ -2757,10 +2849,12 @@ "connect.connecting": "Connecting to the server...", "connect.encrypting": "Encrypting...", "connect.failed": "Failed to connect to the server", + "connect.failed.transfer": "Connection failed while transferring to the server", "connect.joining": "Joining world...", "connect.negotiating": "Negotiating...", "connect.reconfiging": "Reconfiguring...", "connect.reconfiguring": "Reconfiguring...", + "connect.transferring": "Transferring to new server...", "container.barrel": "Barrel", "container.beacon": "Beacon", "container.blast_furnace": "Blast Furnace", @@ -3094,9 +3188,11 @@ "disconnect.loginFailedInfo.userBanned": "You are banned from playing online", "disconnect.lost": "Connection Lost", "disconnect.overflow": "Buffer overflow", + "disconnect.packetError": "Network Protocol Error", "disconnect.quitting": "Quitting", "disconnect.spam": "Kicked for spamming", "disconnect.timeout": "Timed out", + "disconnect.transfer": "Transferred to another server", "disconnect.unknownHost": "Unknown host", "download.pack.failed": "%s out of %s packs failed to download", "download.pack.progress.bytes": "Progress: %s (total size unknown)", @@ -3117,6 +3213,7 @@ "effect.minecraft.health_boost": "Health Boost", "effect.minecraft.hero_of_the_village": "Hero of the Village", "effect.minecraft.hunger": "Hunger", + "effect.minecraft.infested": "Infested", "effect.minecraft.instant_damage": "Instant Damage", "effect.minecraft.instant_health": "Instant Health", "effect.minecraft.invisibility": "Invisibility", @@ -3126,7 +3223,9 @@ "effect.minecraft.mining_fatigue": "Mining Fatigue", "effect.minecraft.nausea": "Nausea", "effect.minecraft.night_vision": "Night Vision", + "effect.minecraft.oozing": "Oozing", "effect.minecraft.poison": "Poison", + "effect.minecraft.raid_omen": "Raid Omen", "effect.minecraft.regeneration": "Regeneration", "effect.minecraft.resistance": "Resistance", "effect.minecraft.saturation": "Saturation", @@ -3134,9 +3233,12 @@ "effect.minecraft.slowness": "Slowness", "effect.minecraft.speed": "Speed", "effect.minecraft.strength": "Strength", + "effect.minecraft.trial_omen": "Trial Omen", "effect.minecraft.unluck": "Bad Luck", "effect.minecraft.water_breathing": "Water Breathing", "effect.minecraft.weakness": "Weakness", + "effect.minecraft.weaving": "Weaving", + "effect.minecraft.wind_charged": "Wind Charged", "effect.minecraft.wither": "Wither", "effect.none": "No Effects", "enchantment.level.1": "I", @@ -3153,7 +3255,9 @@ "enchantment.minecraft.bane_of_arthropods": "Bane of Arthropods", "enchantment.minecraft.binding_curse": "Curse of Binding", "enchantment.minecraft.blast_protection": "Blast Protection", + "enchantment.minecraft.breach": "Breach", "enchantment.minecraft.channeling": "Channeling", + "enchantment.minecraft.density": "Density", "enchantment.minecraft.depth_strider": "Depth Strider", "enchantment.minecraft.efficiency": "Efficiency", "enchantment.minecraft.feather_falling": "Feather Falling", @@ -3184,12 +3288,15 @@ "enchantment.minecraft.smite": "Smite", "enchantment.minecraft.soul_speed": "Soul Speed", "enchantment.minecraft.sweeping": "Sweeping Edge", + "enchantment.minecraft.sweeping_edge": "Sweeping Edge", "enchantment.minecraft.swift_sneak": "Swift Sneak", "enchantment.minecraft.thorns": "Thorns", "enchantment.minecraft.unbreaking": "Unbreaking", "enchantment.minecraft.vanishing_curse": "Curse of Vanishing", + "enchantment.minecraft.wind_burst": "Wind Burst", "entity.minecraft.allay": "Allay", "entity.minecraft.area_effect_cloud": "Area Effect Cloud", + "entity.minecraft.armadillo": "Armadillo", "entity.minecraft.armor_stand": "Armor Stand", "entity.minecraft.arrow": "Arrow", "entity.minecraft.axolotl": "Axolotl", @@ -3198,7 +3305,9 @@ "entity.minecraft.blaze": "Blaze", "entity.minecraft.block_display": "Block Display", "entity.minecraft.boat": "Boat", + "entity.minecraft.bogged": "Bogged", "entity.minecraft.breeze": "Breeze", + "entity.minecraft.breeze_wind_charge": "Wind Charge", "entity.minecraft.camel": "Camel", "entity.minecraft.cat": "Cat", "entity.minecraft.cave_spider": "Cave Spider", @@ -3260,6 +3369,7 @@ "entity.minecraft.mooshroom": "Mooshroom", "entity.minecraft.mule": "Mule", "entity.minecraft.ocelot": "Ocelot", + "entity.minecraft.ominous_item_spawner": "Ominous Item Spawner", "entity.minecraft.painting": "Painting", "entity.minecraft.panda": "Panda", "entity.minecraft.parrot": "Parrot", @@ -3381,6 +3491,7 @@ "filled_map.mansion": "Woodland Explorer Map", "filled_map.monument": "Ocean Explorer Map", "filled_map.scale": "Scaling at 1:%s", + "filled_map.trial_chambers": "Trial Chambers Map", "filled_map.unknown": "Unknown Map", "filled_map.village_desert": "Desert Village Map", "filled_map.village_plains": "Plains Village Map", @@ -3476,7 +3587,10 @@ "gamerule.showDeathMessages": "Show death messages", "gamerule.snowAccumulationHeight": "Snow accumulation height", "gamerule.snowAccumulationHeight.description": "When it snows, layers of snow form on the ground up to at most this number of layers.", + "gamerule.spawnChunkRadius": "Spawn chunk radius", + "gamerule.spawnChunkRadius.description": "Amount of chunks that stay loaded around the overworld spawn position.", "gamerule.spawnRadius": "Respawn location radius", + "gamerule.spawnRadius.description": "Controls the size of the area around the spawn point that players can spawn in.", "gamerule.spectatorsGenerateChunks": "Allow spectators to generate terrain", "gamerule.tntExplosionDropDecay": "In TNT explosions, some blocks won't drop their loot", "gamerule.tntExplosionDropDecay.description": "Some of the drops from blocks destroyed by explosions caused by TNT are lost in the explosion.", @@ -3700,7 +3814,9 @@ "item_modifier.unknown": "Unknown item modifier: %s", "item.canBreak": "Can break:", "item.canPlace": "Can be placed on:", + "item.canUse.unknown": "Unknown", "item.color": "Color: %s", + "item.components": "%s component(s)", "item.disabled": "Disabled item", "item.durability": "Durability: %s / %s", "item.dyed": "Dyed", @@ -3713,6 +3829,8 @@ "item.minecraft.apple": "Apple", "item.minecraft.archer_pottery_shard": "Archer Pottery Shard", "item.minecraft.archer_pottery_sherd": "Archer Pottery Sherd", + "item.minecraft.armadillo_scute": "Armadillo Scute", + "item.minecraft.armadillo_spawn_egg": "Armadillo Spawn Egg", "item.minecraft.armor_stand": "Armor Stand", "item.minecraft.arms_up_pottery_shard": "Arms Up Pottery Shard", "item.minecraft.arms_up_pottery_sherd": "Arms Up Pottery Sherd", @@ -3737,12 +3855,15 @@ "item.minecraft.blaze_rod": "Blaze Rod", "item.minecraft.blaze_spawn_egg": "Blaze Spawn Egg", "item.minecraft.blue_dye": "Blue Dye", + "item.minecraft.bogged_spawn_egg": "Bogged Spawn Egg", + "item.minecraft.bolt_armor_trim_smithing_template": "Smithing Template", "item.minecraft.bone": "Bone", "item.minecraft.bone_meal": "Bone Meal", "item.minecraft.book": "Book", "item.minecraft.bow": "Bow", "item.minecraft.bowl": "Bowl", "item.minecraft.bread": "Bread", + "item.minecraft.breeze_rod": "Breeze Rod", "item.minecraft.breeze_spawn_egg": "Breeze Spawn Egg", "item.minecraft.brewer_pottery_shard": "Brewer Pottery Shard", "item.minecraft.brewer_pottery_sherd": "Brewer Pottery Sherd", @@ -3879,6 +4000,10 @@ "item.minecraft.fishing_rod": "Fishing Rod", "item.minecraft.flint": "Flint", "item.minecraft.flint_and_steel": "Flint and Steel", + "item.minecraft.flow_armor_trim_smithing_template": "Smithing Template", + "item.minecraft.flow_banner_pattern": "Banner Pattern", + "item.minecraft.flow_banner_pattern.desc": "Flow", + "item.minecraft.flow_pottery_sherd": "Flow Pottery Sherd", "item.minecraft.flower_banner_pattern": "Banner Pattern", "item.minecraft.flower_banner_pattern.desc": "Flower Charge", "item.minecraft.flower_pot": "Flower Pot", @@ -3918,6 +4043,9 @@ "item.minecraft.green_dye": "Green Dye", "item.minecraft.guardian_spawn_egg": "Guardian Spawn Egg", "item.minecraft.gunpowder": "Gunpowder", + "item.minecraft.guster_banner_pattern": "Banner Pattern", + "item.minecraft.guster_banner_pattern.desc": "Guster", + "item.minecraft.guster_pottery_sherd": "Guster Pottery Sherd", "item.minecraft.heart_of_the_sea": "Heart of the Sea", "item.minecraft.heart_pottery_shard": "Heart Pottery Shard", "item.minecraft.heart_pottery_sherd": "Heart Pottery Sherd", @@ -3968,12 +4096,14 @@ "item.minecraft.lingering_potion.effect.fire_resistance": "Lingering Potion of Fire Resistance", "item.minecraft.lingering_potion.effect.harming": "Lingering Potion of Harming", "item.minecraft.lingering_potion.effect.healing": "Lingering Potion of Healing", + "item.minecraft.lingering_potion.effect.infested": "Lingering Potion of Infestation", "item.minecraft.lingering_potion.effect.invisibility": "Lingering Potion of Invisibility", "item.minecraft.lingering_potion.effect.leaping": "Lingering Potion of Leaping", "item.minecraft.lingering_potion.effect.levitation": "Lingering Potion of Levitation", "item.minecraft.lingering_potion.effect.luck": "Lingering Potion of Luck", "item.minecraft.lingering_potion.effect.mundane": "Mundane Lingering Potion", "item.minecraft.lingering_potion.effect.night_vision": "Lingering Potion of Night Vision", + "item.minecraft.lingering_potion.effect.oozing": "Lingering Potion of Oozing", "item.minecraft.lingering_potion.effect.poison": "Lingering Potion of Poison", "item.minecraft.lingering_potion.effect.regeneration": "Lingering Potion of Regeneration", "item.minecraft.lingering_potion.effect.slow_falling": "Lingering Potion of Slow Falling", @@ -3985,8 +4115,11 @@ "item.minecraft.lingering_potion.effect.water": "Lingering Water Bottle", "item.minecraft.lingering_potion.effect.water_breathing": "Lingering Potion of Water Breathing", "item.minecraft.lingering_potion.effect.weakness": "Lingering Potion of Weakness", + "item.minecraft.lingering_potion.effect.weaving": "Lingering Potion of Weaving", + "item.minecraft.lingering_potion.effect.wind_charged": "Lingering Potion of Wind Charging", "item.minecraft.llama_spawn_egg": "Llama Spawn Egg", "item.minecraft.lodestone_compass": "Lodestone Compass", + "item.minecraft.mace": "Mace", "item.minecraft.magenta_dye": "Magenta Dye", "item.minecraft.magma_cream": "Magma Cream", "item.minecraft.magma_cube_spawn_egg": "Magma Cube Spawn Egg", @@ -4059,6 +4192,8 @@ "item.minecraft.oak_boat": "Oak Boat", "item.minecraft.oak_chest_boat": "Oak Boat with Chest", "item.minecraft.ocelot_spawn_egg": "Ocelot Spawn Egg", + "item.minecraft.ominous_bottle": "Ominous Bottle", + "item.minecraft.ominous_trial_key": "Ominous Trial Key", "item.minecraft.orange_dye": "Orange Dye", "item.minecraft.painting": "Painting", "item.minecraft.panda_spawn_egg": "Panda Spawn Egg", @@ -4088,12 +4223,14 @@ "item.minecraft.potion.effect.fire_resistance": "Potion of Fire Resistance", "item.minecraft.potion.effect.harming": "Potion of Harming", "item.minecraft.potion.effect.healing": "Potion of Healing", + "item.minecraft.potion.effect.infested": "Potion of Infestation", "item.minecraft.potion.effect.invisibility": "Potion of Invisibility", "item.minecraft.potion.effect.leaping": "Potion of Leaping", "item.minecraft.potion.effect.levitation": "Potion of Levitation", "item.minecraft.potion.effect.luck": "Potion of Luck", "item.minecraft.potion.effect.mundane": "Mundane Potion", "item.minecraft.potion.effect.night_vision": "Potion of Night Vision", + "item.minecraft.potion.effect.oozing": "Potion of Oozing", "item.minecraft.potion.effect.poison": "Potion of Poison", "item.minecraft.potion.effect.regeneration": "Potion of Regeneration", "item.minecraft.potion.effect.slow_falling": "Potion of Slow Falling", @@ -4105,6 +4242,8 @@ "item.minecraft.potion.effect.water": "Water Bottle", "item.minecraft.potion.effect.water_breathing": "Potion of Water Breathing", "item.minecraft.potion.effect.weakness": "Potion of Weakness", + "item.minecraft.potion.effect.weaving": "Potion of Weaving", + "item.minecraft.potion.effect.wind_charged": "Potion of Wind Charging", "item.minecraft.pottery_shard_archer": "Archer Pottery Shard", "item.minecraft.pottery_shard_arms_up": "Arms Up Pottery Shard", "item.minecraft.pottery_shard_prize": "Prize Pottery Shard", @@ -4140,6 +4279,7 @@ "item.minecraft.salmon": "Raw Salmon", "item.minecraft.salmon_bucket": "Bucket of Salmon", "item.minecraft.salmon_spawn_egg": "Salmon Spawn Egg", + "item.minecraft.scrape_pottery_sherd": "Scrape Pottery Sherd", "item.minecraft.scute": "Scute", "item.minecraft.sentry_armor_trim_smithing_template": "Smithing Template", "item.minecraft.shaper_armor_trim_smithing_template": "Smithing Template", @@ -4207,12 +4347,14 @@ "item.minecraft.splash_potion.effect.fire_resistance": "Splash Potion of Fire Resistance", "item.minecraft.splash_potion.effect.harming": "Splash Potion of Harming", "item.minecraft.splash_potion.effect.healing": "Splash Potion of Healing", + "item.minecraft.splash_potion.effect.infested": "Splash Potion of Infestation", "item.minecraft.splash_potion.effect.invisibility": "Splash Potion of Invisibility", "item.minecraft.splash_potion.effect.leaping": "Splash Potion of Leaping", "item.minecraft.splash_potion.effect.levitation": "Splash Potion of Levitation", "item.minecraft.splash_potion.effect.luck": "Splash Potion of Luck", "item.minecraft.splash_potion.effect.mundane": "Mundane Splash Potion", "item.minecraft.splash_potion.effect.night_vision": "Splash Potion of Night Vision", + "item.minecraft.splash_potion.effect.oozing": "Splash Potion of Oozing", "item.minecraft.splash_potion.effect.poison": "Splash Potion of Poison", "item.minecraft.splash_potion.effect.regeneration": "Splash Potion of Regeneration", "item.minecraft.splash_potion.effect.slow_falling": "Splash Potion of Slow Falling", @@ -4224,6 +4366,8 @@ "item.minecraft.splash_potion.effect.water": "Splash Water Bottle", "item.minecraft.splash_potion.effect.water_breathing": "Splash Potion of Water Breathing", "item.minecraft.splash_potion.effect.weakness": "Splash Potion of Weakness", + "item.minecraft.splash_potion.effect.weaving": "Splash Potion of Weaving", + "item.minecraft.splash_potion.effect.wind_charged": "Splash Potion of Wind Charging", "item.minecraft.spruce_boat": "Spruce Boat", "item.minecraft.spruce_chest_boat": "Spruce Boat with Chest", "item.minecraft.spyglass": "Spyglass", @@ -4249,12 +4393,14 @@ "item.minecraft.tipped_arrow.effect.fire_resistance": "Arrow of Fire Resistance", "item.minecraft.tipped_arrow.effect.harming": "Arrow of Harming", "item.minecraft.tipped_arrow.effect.healing": "Arrow of Healing", + "item.minecraft.tipped_arrow.effect.infested": "Arrow of Infestation", "item.minecraft.tipped_arrow.effect.invisibility": "Arrow of Invisibility", "item.minecraft.tipped_arrow.effect.leaping": "Arrow of Leaping", "item.minecraft.tipped_arrow.effect.levitation": "Arrow of Levitation", "item.minecraft.tipped_arrow.effect.luck": "Arrow of Luck", "item.minecraft.tipped_arrow.effect.mundane": "Tipped Arrow", "item.minecraft.tipped_arrow.effect.night_vision": "Arrow of Night Vision", + "item.minecraft.tipped_arrow.effect.oozing": "Arrow of Oozing", "item.minecraft.tipped_arrow.effect.poison": "Arrow of Poison", "item.minecraft.tipped_arrow.effect.regeneration": "Arrow of Regeneration", "item.minecraft.tipped_arrow.effect.slow_falling": "Arrow of Slow Falling", @@ -4266,6 +4412,8 @@ "item.minecraft.tipped_arrow.effect.water": "Arrow of Splashing", "item.minecraft.tipped_arrow.effect.water_breathing": "Arrow of Water Breathing", "item.minecraft.tipped_arrow.effect.weakness": "Arrow of Weakness", + "item.minecraft.tipped_arrow.effect.weaving": "Arrow of Weaving", + "item.minecraft.tipped_arrow.effect.wind_charged": "Arrow of Wind Charging", "item.minecraft.tnt_minecart": "Minecart with TNT", "item.minecraft.torchflower_seeds": "Torchflower Seeds", "item.minecraft.totem_of_undying": "Totem of Undying", @@ -4276,6 +4424,7 @@ "item.minecraft.tropical_fish_bucket": "Bucket of Tropical Fish", "item.minecraft.tropical_fish_spawn_egg": "Tropical Fish Spawn Egg", "item.minecraft.turtle_helmet": "Turtle Shell", + "item.minecraft.turtle_scute": "Turtle Scute", "item.minecraft.turtle_spawn_egg": "Turtle Spawn Egg", "item.minecraft.vex_armor_trim_smithing_template": "Smithing Template", "item.minecraft.vex_spawn_egg": "Vex Spawn Egg", @@ -4291,9 +4440,11 @@ "item.minecraft.wheat_seeds": "Wheat Seeds", "item.minecraft.white_dye": "White Dye", "item.minecraft.wild_armor_trim_smithing_template": "Smithing Template", + "item.minecraft.wind_charge": "Wind Charge", "item.minecraft.witch_spawn_egg": "Witch Spawn Egg", "item.minecraft.wither_skeleton_spawn_egg": "Wither Skeleton Spawn Egg", "item.minecraft.wither_spawn_egg": "Wither Spawn Egg", + "item.minecraft.wolf_armor": "Wolf Armor", "item.minecraft.wolf_spawn_egg": "Wolf Spawn Egg", "item.minecraft.wooden_axe": "Wooden Axe", "item.minecraft.wooden_hoe": "Wooden Hoe", @@ -4308,6 +4459,7 @@ "item.minecraft.zombie_spawn_egg": "Zombie Spawn Egg", "item.minecraft.zombie_villager_spawn_egg": "Zombie Villager Spawn Egg", "item.minecraft.zombified_piglin_spawn_egg": "Zombified Piglin Spawn Egg", + "item.modifiers.body": "When equipped:", "item.modifiers.chest": "When on Body:", "item.modifiers.feet": "When on Feet:", "item.modifiers.head": "When on Head:", @@ -4516,6 +4668,7 @@ "mco.backup.entry.worldType": "World Type", "mco.backup.generate.world": "Generate world", "mco.backup.info.title": "Changes From Last Backup", + "mco.backup.narration": "Backup from %s", "mco.backup.nobackups": "This realm doesn't have any backups currently.", "mco.backup.restoring": "Restoring your realm", "mco.backup.unknown": "UNKNOWN", @@ -4533,6 +4686,8 @@ "mco.client.incompatible.msg.line2": "Please use the most recent version of Minecraft.", "mco.client.incompatible.msg.line3": "Realms is not compatible with snapshot versions.", "mco.client.incompatible.title": "Client incompatible!", + "mco.client.outdated.stable.version": "Your client version (%s) is not compatible with Realms.\n\nPlease use the most recent version of Minecraft.", + "mco.client.unsupported.snapshot.version": "Your client version (%s) is not compatible with Realms.\n\nRealms is not available for this snapshot version.", "mco.compatibility.downgrade": "Downgrade", "mco.compatibility.downgrade.description": "This world was last played in version %s; you are on version %s. Downgrading a world could cause corruption - we cannot guarantee that it will load or work.\n\nA backup of your world will be saved under \"World backups\". Please restore your world if needed.", "mco.compatibility.unverifiable.message": "The version this world was last played in could not be verified. If the world gets upgraded or downgraded, a backup will be automatically created and saved under \"World backups\".", @@ -4556,7 +4711,7 @@ "mco.configure.world.buttons.resetworld": "Reset World", "mco.configure.world.buttons.settings": "Settings", "mco.configure.world.buttons.subscription": "Subscription", - "mco.configure.world.buttons.switchminigame": "Switch minigame", + "mco.configure.world.buttons.switchminigame": "Switch Minigame", "mco.configure.world.close.question.line1": "Your realm will become unavailable.", "mco.configure.world.close.question.line2": "Are you sure you want to continue?", "mco.configure.world.closing": "Closing the realm...", @@ -4574,7 +4729,7 @@ "mco.configure.world.invite.profile.name": "Name", "mco.configure.world.invited": "Invited", "mco.configure.world.invited.number": "Invited (%s)", - "mco.configure.world.invites.normal.tooltip": "Normal user", + "mco.configure.world.invites.normal.tooltip": "Normal User", "mco.configure.world.invites.ops.tooltip": "Operator", "mco.configure.world.invites.remove.tooltip": "Remove", "mco.configure.world.leave.question.line1": "If you leave this realm you won't see it unless you are invited again", @@ -4679,26 +4834,27 @@ "mco.gui.button": "Button", "mco.gui.ok": "Ok", "mco.info": "Info!", + "mco.invited.player.narration": "Invited player %s", "mco.invites.button.accept": "Accept", "mco.invites.button.reject": "Reject", "mco.invites.nopending": "No pending invites!", "mco.invites.pending": "New invite(s)!", "mco.invites.title": "Pending Invites", - "mco.minigame.world.changeButton": "Select another minigame", + "mco.minigame.world.changeButton": "Select Another Minigame", "mco.minigame.world.info.line1": "This will temporarily replace your world with a minigame!", "mco.minigame.world.info.line2": "You can later return to your original world without losing anything.", "mco.minigame.world.noSelection": "Please make a selection", - "mco.minigame.world.restore": "Ending minigame...", + "mco.minigame.world.restore": "Ending Minigame...", "mco.minigame.world.restore.question.line1": "The minigame will end and your realm will be restored.", "mco.minigame.world.restore.question.line2": "Are you sure you want to continue?", - "mco.minigame.world.selected": "Selected minigame:", - "mco.minigame.world.slot.screen.title": "Switching world...", + "mco.minigame.world.selected": "Selected Minigame:", + "mco.minigame.world.slot.screen.title": "Switching World...", "mco.minigame.world.startButton": "Switch", - "mco.minigame.world.starting.screen.title": "Starting minigame...", - "mco.minigame.world.stopButton": "End minigame", + "mco.minigame.world.starting.screen.title": "Starting Minigame...", + "mco.minigame.world.stopButton": "End Minigame", "mco.minigame.world.switch.new": "Select another minigame?", - "mco.minigame.world.switch.title": "Switch minigame", - "mco.minigame.world.title": "Switch realm to minigame", + "mco.minigame.world.switch.title": "Switch Minigame", + "mco.minigame.world.title": "Switch Realm to Minigame", "mco.news": "Realms news", "mco.notification.dismiss": "Dismiss", "mco.notification.transferSubscription.buttonText": "Transfer Now", @@ -4792,6 +4948,7 @@ "mco.upload.close.failure": "Could not close your realm, please try again later", "mco.upload.done": "Upload done", "mco.upload.entry.cheats": "%1$s, %2$s", + "mco.upload.entry.commands": "%1$s, %2$s", "mco.upload.entry.id": "%1$s (%2$s)", "mco.upload.failed": "Upload failed! (%s)", "mco.upload.hardcore": "Hardcore worlds can't be uploaded!", @@ -4882,6 +5039,7 @@ "multiplayer.disconnect.server_shutdown": "Server closed", "multiplayer.disconnect.slow_login": "Took too long to log in", "multiplayer.disconnect.too_many_pending_chats": "Too many unacknowledged chat messages", + "multiplayer.disconnect.transfers_disabled": "Server does not accept transfers", "multiplayer.disconnect.unexpected_query_response": "Unexpected custom data from client", "multiplayer.disconnect.unsigned_chat": "Received chat packet with missing or invalid signature.", "multiplayer.disconnect.unverified_username": "Failed to verify username!", @@ -4986,13 +5144,21 @@ "optimizeWorld.stage.counting": "Counting chunks...", "optimizeWorld.stage.failed": "Failed! :(", "optimizeWorld.stage.finished": "Finishing up...", + "optimizeWorld.stage.finished.chunks": "Finishing up upgrading chunks...", + "optimizeWorld.stage.finished.entities": "Finishing up upgrading entities...", + "optimizeWorld.stage.finished.poi": "Finishing up upgrading points of interest...", "optimizeWorld.stage.upgrading": "Upgrading all chunks...", + "optimizeWorld.stage.upgrading.chunks": "Upgrading all chunks...", + "optimizeWorld.stage.upgrading.entities": "Upgrading all entities...", + "optimizeWorld.stage.upgrading.poi": "Upgrading all points of interest...", "optimizeWorld.title": "Optimizing World '%s'", "options.accessibility": "Accessibility Settings...", "options.accessibility.high_contrast": "High Contrast", "options.accessibility.high_contrast.error.tooltip": "High Contrast resource pack is not available", "options.accessibility.high_contrast.tooltip": "Enhances the contrast of UI elements", "options.accessibility.link": "Accessibility Guide", + "options.accessibility.menu_background_blurriness": "Menu Background Blur", + "options.accessibility.menu_background_blurriness.tooltip": "Changes the blurriness of menu backgrounds", "options.accessibility.narrator_hotkey": "Narrator Hotkey", "options.accessibility.narrator_hotkey.mac.tooltip": "Allows the Narrator to be toggled on and off with 'Cmd+B'", "options.accessibility.narrator_hotkey.tooltip": "Allows the Narrator to be toggled on and off with 'Ctrl+B'", @@ -5071,6 +5237,8 @@ "options.discrete_mouse_scroll": "Discrete Scrolling", "options.entityDistanceScaling": "Entity Distance", "options.entityShadows": "Entity Shadows", + "options.font": "Font Settings...", + "options.font.title": "Font Settings", "options.forceUnicodeFont": "Force Unicode Font", "options.fov": "FOV", "options.fov.max": "Quake Pro", @@ -5118,6 +5286,8 @@ "options.hideSplashTexts": "Hide Splash Texts", "options.hideSplashTexts.tooltip": "Hides the yellow splash text in the main menu.", "options.invertMouse": "Invert Mouse", + "options.japaneseGlyphVariants": "Japanese Glyph Variants", + "options.japaneseGlyphVariants.tooltip": "Uses Japanese variants of CJK characters in the default font", "options.key.hold": "Hold", "options.key.toggle": "Toggle", "options.language": "Language...", @@ -5191,6 +5361,7 @@ "options.telemetry": "Telemetry Data...", "options.telemetry.button": "Data Collection", "options.telemetry.button.tooltip": "\"%s\" includes only the required data.\n\"%s\" includes optional, as well as the required data.", + "options.telemetry.disabled": "Telemetry is disabled.", "options.telemetry.state.all": "All", "options.telemetry.state.minimal": "Minimal", "options.telemetry.state.none": "None", @@ -5300,6 +5471,7 @@ "parsing.quote.escape": "Invalid escape sequence '\\%s' in quoted string", "parsing.quote.expected.end": "Unclosed quoted string", "parsing.quote.expected.start": "Expected quote to start a string", + "particle.invalidOptions": "Can't parse particle options: %s", "particle.notFound": "Unknown particle: %s", "permissions.requires.entity": "An entity is required to run this command here", "permissions.requires.player": "A player is required to run this command here", @@ -5366,6 +5538,7 @@ "selectWorld.access_failure": "Failed to access world", "selectWorld.allowCommands": "Allow Cheats", "selectWorld.allowCommands.info": "Commands like /gamemode, /experience", + "selectWorld.allowCommands.new": "Allow Commands", "selectWorld.backupEraseCache": "Erase Cached Data", "selectWorld.backupJoinConfirmButton": "Create Backup and Load", "selectWorld.backupJoinSkipButton": "I know what I'm doing!", @@ -5379,6 +5552,7 @@ "selectWorld.backupWarning.snapshot": "This world was last played in version %s; you are on version %s. Please make a backup in case you experience world corruptions.", "selectWorld.bonusItems": "Bonus Chest", "selectWorld.cheats": "Cheats", + "selectWorld.commands": "Commands", "selectWorld.conversion": "Must be converted!", "selectWorld.conversion.tooltip": "This world must be opened in an older version (like 1.6.4) to be safely converted", "selectWorld.create": "Create New World", @@ -5482,11 +5656,14 @@ "selectWorld.warning.deprecated.title": "Warning! These settings are using deprecated features", "selectWorld.warning.experimental.question": "These settings are experimental and could one day stop working. Do you wish to proceed?", "selectWorld.warning.experimental.title": "Warning! These settings are using experimental features", + "selectWorld.warning.lowDiskSpace.description": "There is not much space left on your device.\nRunning out of disk space while in game can lead to your world being damaged.", + "selectWorld.warning.lowDiskSpace.title": "Warning! Low disk space!", "selectWorld.world": "World", "sign.edit": "Edit Sign Message", "sleep.not_possible": "No amount of rest can pass this night", "sleep.players_sleeping": "%s/%s players sleeping", "sleep.skipping_night": "Sleeping through this night", + "slot.only_single_allowed": "Only single slots allowed, got '%s'", "slot.unknown": "Unknown slot '%s'", "soundCategory.ambient": "Ambient/Environment", "soundCategory.block": "Blocks", @@ -5671,6 +5848,7 @@ "subtitles.block.cake.add_candle": "Cake squishes", "subtitles.block.campfire.crackle": "Campfire crackles", "subtitles.block.candle.crackle": "Candle crackles", + "subtitles.block.candle.extinguish": "Candle extinguishes", "subtitles.block.chest.close": "Chest closes", "subtitles.block.chest.locked": "Chest locked", "subtitles.block.chest.open": "Chest opens", @@ -5730,7 +5908,7 @@ "subtitles.block.pressure_plate.click": "Pressure Plate clicks", "subtitles.block.pumpkin.carve": "Shears carve", "subtitles.block.redstone_torch.burnout": "Torch fizzes", - "subtitles.block.respawn_anchor.ambient": "Portal whooshes", + "subtitles.block.respawn_anchor.ambient": "Respawn Anchor whooshes", "subtitles.block.respawn_anchor.charge": "Respawn Anchor is charged", "subtitles.block.respawn_anchor.deplete": "Respawn Anchor depletes", "subtitles.block.respawn_anchor.set_spawn": "Respawn Anchor sets spawn", @@ -5751,16 +5929,30 @@ "subtitles.block.sponge.absorb": "Sponge sucks", "subtitles.block.sweet_berry_bush.pick_berries": "Berries pop", "subtitles.block.trapdoor.toggle": "Trapdoor creaks", + "subtitles.block.trial_spawner.about_to_spawn_item": "Ominous item prepares", "subtitles.block.trial_spawner.ambient": "Trial Spawner crackles", + "subtitles.block.trial_spawner.ambient_charged": "Ominous Trial Spawner crackles", + "subtitles.block.trial_spawner.charge_activate": "Omen engulfs Trial Spawner", "subtitles.block.trial_spawner.close_shutter": "Trial Spawner closes", "subtitles.block.trial_spawner.detect_player": "Trial Spawner charges up", "subtitles.block.trial_spawner.eject_item": "Trial Spawner ejects items", "subtitles.block.trial_spawner.open_shutter": "Trial Spawner opens", - "subtitles.block.trial_spawner.spawn_mob": "Mob spawns", + "subtitles.block.trial_spawner.spawn_item": "Ominous item drops", + "subtitles.block.trial_spawner.spawn_item_begin": "Ominous item appears", + "subtitles.block.trial_spawner.spawn_mob": "Trial Spawner spawns a mob", "subtitles.block.tripwire.attach": "Tripwire attaches", "subtitles.block.tripwire.click": "Tripwire clicks", "subtitles.block.tripwire.detach": "Tripwire detaches", + "subtitles.block.vault.activate": "Vault ignites", + "subtitles.block.vault.ambient": "Vault crackles", + "subtitles.block.vault.close_shutter": "Vault closes", + "subtitles.block.vault.deactivate": "Vault extinguishes", + "subtitles.block.vault.eject_item": "Vault ejects item", + "subtitles.block.vault.insert_item": "Vault unlocks", + "subtitles.block.vault.insert_item_fail": "Vault fails unlocking", + "subtitles.block.vault.open_shutter": "Vault opens", "subtitles.block.water.ambient": "Water flows", + "subtitles.block.wet_sponge.dries": "Sponge dries", "subtitles.chiseled_bookshelf.insert": "Book placed", "subtitles.chiseled_bookshelf.insert_enchanted": "Enchanted Book placed", "subtitles.chiseled_bookshelf.take": "Book taken", @@ -5773,6 +5965,18 @@ "subtitles.entity.allay.item_given": "Allay chortles", "subtitles.entity.allay.item_taken": "Allay allays", "subtitles.entity.allay.item_thrown": "Allay tosses", + "subtitles.entity.armadillo.ambient": "Armadillo grunts", + "subtitles.entity.armadillo.brush": "Scute is brushed off", + "subtitles.entity.armadillo.death": "Armadillo dies", + "subtitles.entity.armadillo.eat": "Armadillo eats", + "subtitles.entity.armadillo.hurt": "Armadillo hurts", + "subtitles.entity.armadillo.hurt_reduced": "Armadillo shields itself", + "subtitles.entity.armadillo.land": "Armadillo lands", + "subtitles.entity.armadillo.peek": "Armadillo peeks", + "subtitles.entity.armadillo.roll": "Armadillo rolls up", + "subtitles.entity.armadillo.scute_drop": "Armadillo sheds scute", + "subtitles.entity.armadillo.unroll_finish": "Armadillo unrolls", + "subtitles.entity.armadillo.unroll_start": "Armadillo peeks", "subtitles.entity.armor_stand.fall": "Something fell", "subtitles.entity.arrow.hit": "Arrow hits", "subtitles.entity.arrow.hit_player": "Player hit", @@ -5802,7 +6006,12 @@ "subtitles.entity.blaze.shoot": "Blaze shoots", "subtitles.entity.boat.paddle_land": "Rowing", "subtitles.entity.boat.paddle_water": "Rowing", + "subtitles.entity.bogged.ambient": "Bogged rattles", + "subtitles.entity.bogged.death": "Bogged dies", + "subtitles.entity.bogged.hurt": "Bogged hurts", + "subtitles.entity.breeze.charge": "Breeze charges", "subtitles.entity.breeze.death": "Breeze dies", + "subtitles.entity.breeze.deflect": "Breeze deflects", "subtitles.entity.breeze.hurt": "Breeze hurts", "subtitles.entity.breeze.idle_air": "Breeze flies", "subtitles.entity.breeze.idle_ground": "Breeze whirs", @@ -5811,6 +6020,8 @@ "subtitles.entity.breeze.land": "Breeze lands", "subtitles.entity.breeze.shoot": "Breeze shoots", "subtitles.entity.breeze.slide": "Breeze slides", + "subtitles.entity.breeze.whirl": "Breeze whirls", + "subtitles.entity.breeze.wind_burst": "Wind Charge bursts", "subtitles.entity.camel.ambient": "Camel grunts", "subtitles.entity.camel.dash": "Camel yeets", "subtitles.entity.camel.dash_ready": "Camel recovers", @@ -5859,6 +6070,7 @@ "subtitles.entity.donkey.death": "Donkey dies", "subtitles.entity.donkey.eat": "Donkey eats", "subtitles.entity.donkey.hurt": "Donkey hurts", + "subtitles.entity.donkey.jump": "Donkey jumps", "subtitles.entity.drowned.ambient": "Drowned gurgles", "subtitles.entity.drowned.ambient_water": "Drowned gurgles", "subtitles.entity.drowned.death": "Drowned dies", @@ -5941,7 +6153,7 @@ "subtitles.entity.ghast.hurt": "Ghast hurts", "subtitles.entity.ghast.shoot": "Ghast shoots", "subtitles.entity.glow_item_frame.add_item": "Glow Item Frame fills", - "subtitles.entity.glow_item_frame.break": "Glow Item Frame breaks", + "subtitles.entity.glow_item_frame.break": "Glow Item Frame broken", "subtitles.entity.glow_item_frame.place": "Glow Item Frame placed", "subtitles.entity.glow_item_frame.remove_item": "Glow Item Frame empties", "subtitles.entity.glow_item_frame.rotate_item": "Glow Item Frame clicks", @@ -6001,13 +6213,13 @@ "subtitles.entity.iron_golem.hurt": "Iron Golem hurts", "subtitles.entity.iron_golem.repair": "Iron Golem repaired", "subtitles.entity.item_frame.add_item": "Item Frame fills", - "subtitles.entity.item_frame.break": "Item Frame breaks", + "subtitles.entity.item_frame.break": "Item Frame broken", "subtitles.entity.item_frame.place": "Item Frame placed", "subtitles.entity.item_frame.remove_item": "Item Frame empties", "subtitles.entity.item_frame.rotate_item": "Item Frame clicks", "subtitles.entity.item.break": "Item breaks", "subtitles.entity.item.pickup": "Item plops", - "subtitles.entity.leash_knot.break": "Leash Knot breaks", + "subtitles.entity.leash_knot.break": "Leash Knot broken", "subtitles.entity.leash_knot.place": "Leash Knot tied", "subtitles.entity.lightning_bolt.impact": "Lightning strikes", "subtitles.entity.lightning_bolt.thunder": "Thunder roars", @@ -6034,7 +6246,8 @@ "subtitles.entity.mule.death": "Mule dies", "subtitles.entity.mule.eat": "Mule eats", "subtitles.entity.mule.hurt": "Mule hurts", - "subtitles.entity.painting.break": "Painting breaks", + "subtitles.entity.mule.jump": "Mule jumps", + "subtitles.entity.painting.break": "Painting broken", "subtitles.entity.painting.place": "Painting placed", "subtitles.entity.panda.aggressive_ambient": "Panda huffs", "subtitles.entity.panda.ambient": "Panda pants", @@ -6053,6 +6266,7 @@ "subtitles.entity.parrot.fly": "Parrot flutters", "subtitles.entity.parrot.hurts": "Parrot hurts", "subtitles.entity.parrot.imitate.blaze": "Parrot breathes", + "subtitles.entity.parrot.imitate.bogged": "Parrot rattles", "subtitles.entity.parrot.imitate.breeze": "Parrot whirs", "subtitles.entity.parrot.imitate.creeper": "Parrot hisses", "subtitles.entity.parrot.imitate.drowned": "Parrot gurgles", @@ -6130,7 +6344,7 @@ "subtitles.entity.player.levelup": "Player dings", "subtitles.entity.player.teleport": "Player teleports", "subtitles.entity.polar_bear.ambient": "Polar Bear groans", - "subtitles.entity.polar_bear.ambient_baby": "Polar Bear hums", + "subtitles.entity.polar_bear.ambient_baby": "Baby Polar Bear hums", "subtitles.entity.polar_bear.death": "Polar Bear dies", "subtitles.entity.polar_bear.hurt": "Polar Bear hurts", "subtitles.entity.polar_bear.warning": "Polar Bear roars", @@ -6229,15 +6443,15 @@ "subtitles.entity.tropical_fish.hurt": "Tropical Fish hurts", "subtitles.entity.turtle.ambient_land": "Turtle chirps", "subtitles.entity.turtle.death": "Turtle dies", - "subtitles.entity.turtle.death_baby": "Turtle baby dies", + "subtitles.entity.turtle.death_baby": "Baby Turtle dies", "subtitles.entity.turtle.egg_break": "Turtle Egg breaks", "subtitles.entity.turtle.egg_crack": "Turtle Egg cracks", "subtitles.entity.turtle.egg_hatch": "Turtle Egg hatches", "subtitles.entity.turtle.hurt": "Turtle hurts", - "subtitles.entity.turtle.hurt_baby": "Turtle baby hurts", + "subtitles.entity.turtle.hurt_baby": "Baby Turtle hurts", "subtitles.entity.turtle.lay_egg": "Turtle lays egg", "subtitles.entity.turtle.shamble": "Turtle shambles", - "subtitles.entity.turtle.shamble_baby": "Turtle baby shambles", + "subtitles.entity.turtle.shamble_baby": "Baby Turtle shambles", "subtitles.entity.turtle.swim": "Turtle swims", "subtitles.entity.vex.ambient": "Vex vexes", "subtitles.entity.vex.charge": "Vex shrieks", @@ -6297,6 +6511,8 @@ "subtitles.entity.warden.sonic_charge": "Warden charges", "subtitles.entity.warden.step": "Warden steps", "subtitles.entity.warden.tendril_clicks": "Warden's tendrils click", + "subtitles.entity.wind_charge.throw": "Wind Charge flies", + "subtitles.entity.wind_charge.wind_burst": "Wind Charge bursts", "subtitles.entity.witch.ambient": "Witch giggles", "subtitles.entity.witch.celebrate": "Witch cheers", "subtitles.entity.witch.death": "Witch dies", @@ -6342,6 +6558,9 @@ "subtitles.entity.zombified_piglin.angry": "Zombified Piglin grunts angrily", "subtitles.entity.zombified_piglin.death": "Zombified Piglin dies", "subtitles.entity.zombified_piglin.hurt": "Zombified Piglin hurts", + "subtitles.event.mob_effect.bad_omen": "Omen takes hold", + "subtitles.event.mob_effect.raid_omen": "Raid looms nearby", + "subtitles.event.mob_effect.trial_omen": "Ominous trial looms nearby", "subtitles.event.raid.horn": "Ominous horn blares", "subtitles.item.armor.equip": "Gear equips", "subtitles.item.armor.equip_chain": "Chain armor jingles", @@ -6352,6 +6571,8 @@ "subtitles.item.armor.equip_leather": "Leather armor rustles", "subtitles.item.armor.equip_netherite": "Netherite armor clanks", "subtitles.item.armor.equip_turtle": "Turtle Shell thunks", + "subtitles.item.armor.equip_wolf": "Wolf Armor is fastened", + "subtitles.item.armor.unequip_wolf": "Wolf Armor snips away", "subtitles.item.axe.scrape": "Axe scrapes", "subtitles.item.axe.strip": "Axe strips", "subtitles.item.axe.wax_off": "Wax off", @@ -6389,7 +6610,10 @@ "subtitles.item.honeycomb.wax_on": "Wax on", "subtitles.item.ink_sac.use": "Ink Sac splotches", "subtitles.item.lodestone_compass.lock": "Lodestone Compass locks onto Lodestone", + "subtitles.item.mace.smash_air": "Mace smashes", + "subtitles.item.mace.smash_ground": "Mace smashes", "subtitles.item.nether_wart.plant": "Crop planted", + "subtitles.item.ominous_bottle.dispose": "Bottle breaks", "subtitles.item.shears.shear": "Shears click", "subtitles.item.shield.block": "Shield blocks", "subtitles.item.shovel.flatten": "Shovel flattens", @@ -6402,6 +6626,10 @@ "subtitles.item.trident.riptide": "Trident zooms", "subtitles.item.trident.throw": "Trident clangs", "subtitles.item.trident.thunder": "Trident thunder cracks", + "subtitles.item.wolf_armor.break": "Wolf Armor breaks", + "subtitles.item.wolf_armor.crack": "Wolf Armor cracks", + "subtitles.item.wolf_armor.damage": "Wolf Armor takes damage", + "subtitles.item.wolf_armor.repair": "Wolf Armor is repaired", "subtitles.particle.soul_escape": "Soul escapes", "subtitles.ui.cartography_table.take_result": "Map drawn", "subtitles.ui.loom.take_result": "Loom used", @@ -6506,9 +6734,11 @@ "trim_material.minecraft.netherite": "Netherite Material", "trim_material.minecraft.quartz": "Quartz Material", "trim_material.minecraft.redstone": "Redstone Material", + "trim_pattern.minecraft.bolt": "Bolt Armor Trim", "trim_pattern.minecraft.coast": "Coast Armor Trim", "trim_pattern.minecraft.dune": "Dune Armor Trim", "trim_pattern.minecraft.eye": "Eye Armor Trim", + "trim_pattern.minecraft.flow": "Flow Armor Trim", "trim_pattern.minecraft.host": "Host Armor Trim", "trim_pattern.minecraft.raiser": "Raiser Armor Trim", "trim_pattern.minecraft.rib": "Rib Armor Trim", diff --git a/azalea-physics/Cargo.toml b/azalea-physics/Cargo.toml index 7b7628961..874202e85 100644 --- a/azalea-physics/Cargo.toml +++ b/azalea-physics/Cargo.toml @@ -4,25 +4,25 @@ edition = "2021" license = "MIT" name = "azalea-physics" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-physics" -version = "0.9.0" +version = "0.10.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -azalea-block = { path = "../azalea-block", version = "0.9.0" } -azalea-core = { path = "../azalea-core", version = "0.9.0" } -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } -azalea-registry = { path = "../azalea-registry", version = "0.9.0" } -azalea-world = { path = "../azalea-world", version = "0.9.0" } -bevy_app = "0.13.0" -bevy_ecs = "0.13.0" +azalea-block = { path = "../azalea-block", version = "0.10.0" } +azalea-core = { path = "../azalea-core", version = "0.10.0" } +azalea-registry = { path = "../azalea-registry", version = "0.10.0" } +azalea-world = { path = "../azalea-world", version = "0.10.0" } +bevy_app = "0.13.2" +bevy_ecs = "0.13.2" tracing = "0.1.40" once_cell = "1.19.0" parking_lot = "^0.12.1" nohash-hasher = "0.2.0" -smallvec = "1.13.1" +smallvec = "1.13.2" +azalea-entity = { version = "0.10.0", path = "../azalea-entity" } +azalea-inventory = { version = "0.10.0", path = "../azalea-inventory" } [dev-dependencies] -bevy_time = "0.13.0" -uuid = "^1.7.0" +bevy_time = "0.13.2" +uuid = "^1.8.0" diff --git a/azalea-physics/src/collision/blocks.rs b/azalea-physics/src/collision/blocks.rs index aec40f37d..b0655b876 100644 --- a/azalea-physics/src/collision/blocks.rs +++ b/azalea-physics/src/collision/blocks.rs @@ -1735,7165 +1735,7 @@ static SHAPE317: Lazy = impl BlockWithShape for BlockState { fn shape(&self) -> &'static VoxelShape { - match self.id { - 0 - | 25..=78 - | 80..=111 - | 1944..=1991 - | 2004..=2010 - | 2063..=2090 - | 2355..=2872 - | 2978..=4273 - | 4278..=4285 - | 4302..=4589 - | 4662..=4681 - | 4762..=5537 - | 5626..=5651 - | 5716..=5733 - | 5738..=5772 - | 5799..=5814 - | 5858..=5862 - | 5864..=5865 - | 6813..=6998 - | 7001..=7002 - | 7005..=7006 - | 7009..=7010 - | 7013..=7014 - | 7017..=7018 - | 7021..=7022 - | 7025..=7026 - | 7385..=7388 - | 7406 - | 7521..=7664 - | 7925 - | 7928 - | 8249 - | 8252 - | 8595..=8826 - | 9143..=9174 - | 9320..=9343 - | 10367..=10398 - | 10747..=11078 - | 11310..=11311 - | 11314..=11315 - | 11318..=11319 - | 11322..=11323 - | 11326..=11327 - | 11330..=11331 - | 11334..=11335 - | 11338..=11339 - | 11342..=11343 - | 11346..=11347 - | 11350..=11351 - | 11354..=11355 - | 11358..=11359 - | 11362..=11363 - | 11366..=11367 - | 11370..=11371 - | 11374..=11375 - | 11378..=11379 - | 11382..=11383 - | 11386..=11387 - | 11390..=11391 - | 11394..=11395 - | 11398..=11399 - | 11402..=11403 - | 11406..=11407 - | 11410..=11411 - | 11414..=11415 - | 11418..=11419 - | 11422..=11423 - | 11426..=11427 - | 11430..=11431 - | 11434..=11435 - | 11438..=11439 - | 11442..=11443 - | 11446..=11447 - | 11450..=11451 - | 11454..=11455 - | 11458..=11459 - | 11462..=11463 - | 11466..=11467 - | 11470..=11471 - | 11474..=11475 - | 11478..=11479 - | 11482..=11483 - | 11486..=11487 - | 11490..=11491 - | 11494..=11495 - | 11498..=11499 - | 11502..=11503 - | 11506..=11507 - | 11510..=11511 - | 11514..=11515 - | 11518..=11519 - | 11522..=11523 - | 11526..=11527 - | 11530..=11531 - | 11534..=11535 - | 11538..=11539 - | 11542..=11543 - | 11546..=11547 - | 11550..=11551 - | 11554..=11555 - | 11558..=11559 - | 11562..=11563 - | 12495..=12496 - | 12499 - | 12501 - | 12503 - | 12505 - | 12507..=12512 - | 12514 - | 12549 - | 12760..=12786 - | 12813..=12932 - | 12944 - | 12958..=12961 - | 14166 - | 14169 - | 14490 - | 14493 - | 14814 - | 14817 - | 15138 - | 15141 - | 15462 - | 15465 - | 15786 - | 15789 - | 16110 - | 16113 - | 16434 - | 16437 - | 16758 - | 16761 - | 17082 - | 17085 - | 17406 - | 17409 - | 17730 - | 17733 - | 18054 - | 18057 - | 18575..=18578 - | 18592 - | 18594..=18595 - | 18609 - | 18611..=18665 - | 18680..=18683 - | 18876..=18877 - | 18880..=18881 - | 18884..=18885 - | 18888..=18889 - | 18892..=18893 - | 18896..=18897 - | 18900..=18901 - | 18904..=18905 - | 18908..=18909 - | 18912..=18913 - | 18916..=18917 - | 18920..=18921 - | 18924..=18925 - | 18928..=18929 - | 18932..=18933 - | 18936..=18937 - | 19100..=19147 - | 19276..=19355 - | 19547 - | 19550 - | 19967 - | 19970 - | 20372..=20397 - | 20404 - | 20407 - | 21174 - | 21177 - | 21585 - | 21588 - | 21997 - | 22000 - | 22318 - | 22800..=22927 - | 24769..=24823 - | 24827..=24842 - | 24850..=24851 - | 24858..=24859 - | 24866..=24867 - | 24874..=24901 - | 25000 - | 25003 - | 25411 - | 25414 - | 25822 - | 25825 - | 26233 - | 26236 - | 26572 => &SHAPE0, - 1688 | 1690 | 1693 | 1695 | 1704 | 1706 | 1709 | 1711 | 1720 | 1722 | 1725 | 1727 - | 1736 | 1738 | 1741 | 1743 | 1752 | 1754 | 1757 | 1759 | 1768 | 1770 | 1773 | 1775 - | 1784 | 1786 | 1789 | 1791 | 1800 | 1802 | 1805 | 1807 | 1816 | 1818 | 1821 | 1823 - | 1832 | 1834 | 1837 | 1839 | 1848 | 1850 | 1853 | 1855 | 1864 | 1866 | 1869 | 1871 - | 1880 | 1882 | 1885 | 1887 | 1896 | 1898 | 1901 | 1903 | 1912 | 1914 | 1917 | 1919 - | 1928 | 1930 | 1933 | 1935 => &SHAPE3, - 1689 - | 1691..=1692 - | 1694 - | 1705 - | 1707..=1708 - | 1710 - | 1721 - | 1723..=1724 - | 1726 - | 1737 - | 1739..=1740 - | 1742 - | 1753 - | 1755..=1756 - | 1758 - | 1769 - | 1771..=1772 - | 1774 - | 1785 - | 1787..=1788 - | 1790 - | 1801 - | 1803..=1804 - | 1806 - | 1817 - | 1819..=1820 - | 1822 - | 1833 - | 1835..=1836 - | 1838 - | 1849 - | 1851..=1852 - | 1854 - | 1865 - | 1867..=1868 - | 1870 - | 1881 - | 1883..=1884 - | 1886 - | 1897 - | 1899..=1900 - | 1902 - | 1913 - | 1915..=1916 - | 1918 - | 1929 - | 1931..=1932 - | 1934 => &SHAPE4, - 1696 | 1698 | 1701 | 1703 | 1712 | 1714 | 1717 | 1719 | 1728 | 1730 | 1733 | 1735 - | 1744 | 1746 | 1749 | 1751 | 1760 | 1762 | 1765 | 1767 | 1776 | 1778 | 1781 | 1783 - | 1792 | 1794 | 1797 | 1799 | 1808 | 1810 | 1813 | 1815 | 1824 | 1826 | 1829 | 1831 - | 1840 | 1842 | 1845 | 1847 | 1856 | 1858 | 1861 | 1863 | 1872 | 1874 | 1877 | 1879 - | 1888 | 1890 | 1893 | 1895 | 1904 | 1906 | 1909 | 1911 | 1920 | 1922 | 1925 | 1927 - | 1936 | 1938 | 1941 | 1943 => &SHAPE5, - 1697 - | 1699..=1700 - | 1702 - | 1713 - | 1715..=1716 - | 1718 - | 1729 - | 1731..=1732 - | 1734 - | 1745 - | 1747..=1748 - | 1750 - | 1761 - | 1763..=1764 - | 1766 - | 1777 - | 1779..=1780 - | 1782 - | 1793 - | 1795..=1796 - | 1798 - | 1809 - | 1811..=1812 - | 1814 - | 1825 - | 1827..=1828 - | 1830 - | 1841 - | 1843..=1844 - | 1846 - | 1857 - | 1859..=1860 - | 1862 - | 1873 - | 1875..=1876 - | 1878 - | 1889 - | 1891..=1892 - | 1894 - | 1905 - | 1907..=1908 - | 1910 - | 1921 - | 1923..=1924 - | 1926 - | 1937 - | 1939..=1940 - | 1942 => &SHAPE6, - 1992 | 2011 => &SHAPE9, - 1993 | 2012 => &SHAPE10, - 1994 | 2013 => &SHAPE11, - 1995 | 2014 => &SHAPE12, - 1996 | 2015 | 5778 | 7389 => &SHAPE13, - 1997 | 2016 => &SHAPE14, - 2023..=2024 => &SHAPE15, - 2025..=2026 => &SHAPE16, - 2027..=2028 => &SHAPE17, - 2029..=2030 => &SHAPE18, - 2031..=2032 => &SHAPE19, - 2033..=2034 => &SHAPE20, - 2035..=2036 => &SHAPE21, - 2037..=2038 => &SHAPE22, - 2039..=2040 => &SHAPE23, - 2041..=2042 => &SHAPE24, - 2043..=2044 => &SHAPE25, - 2045..=2046 => &SHAPE26, - 2874..=2875 - | 4682..=4683 - | 7029..=7030 - | 7109..=7110 - | 7189..=7190 - | 7305..=7306 - | 7431..=7432 - | 7666..=7667 - | 7746..=7747 - | 7826..=7827 - | 9240..=9241 - | 9884..=9885 - | 9964..=9965 - | 10044..=10045 - | 10124..=10125 - | 10204..=10205 - | 10284..=10285 - | 10466..=10467 - | 10546..=10547 - | 10626..=10627 - | 11082..=11083 - | 12414..=12415 - | 12962..=12963 - | 13042..=13043 - | 13122..=13123 - | 13202..=13203 - | 13282..=13283 - | 13362..=13363 - | 13442..=13443 - | 13522..=13523 - | 13602..=13603 - | 13682..=13683 - | 13762..=13763 - | 13842..=13843 - | 13922..=13923 - | 14002..=14003 - | 18940..=18941 - | 19020..=19021 - | 19461..=19462 - | 19881..=19882 - | 20286..=20287 - | 21088..=21089 - | 21499..=21500 - | 21911..=21912 - | 22956..=22957 - | 23036..=23037 - | 23116..=23117 - | 23196..=23197 - | 23308..=23309 - | 23388..=23389 - | 23468..=23469 - | 23548..=23549 - | 24908..=24909 - | 25319..=25320 - | 25730..=25731 - | 26141..=26142 => &SHAPE29, - 2876..=2877 - | 2918..=2919 - | 4684..=4685 - | 4726..=4727 - | 7031..=7032 - | 7073..=7074 - | 7111..=7112 - | 7153..=7154 - | 7191..=7192 - | 7233..=7234 - | 7307..=7308 - | 7349..=7350 - | 7433..=7434 - | 7475..=7476 - | 7668..=7669 - | 7710..=7711 - | 7748..=7749 - | 7790..=7791 - | 7828..=7829 - | 7870..=7871 - | 9242..=9243 - | 9284..=9285 - | 9886..=9887 - | 9928..=9929 - | 9966..=9967 - | 10008..=10009 - | 10046..=10047 - | 10088..=10089 - | 10126..=10127 - | 10168..=10169 - | 10206..=10207 - | 10248..=10249 - | 10286..=10287 - | 10328..=10329 - | 10468..=10469 - | 10510..=10511 - | 10548..=10549 - | 10590..=10591 - | 10628..=10629 - | 10670..=10671 - | 11084..=11085 - | 11126..=11127 - | 12416..=12417 - | 12458..=12459 - | 12964..=12965 - | 13006..=13007 - | 13044..=13045 - | 13086..=13087 - | 13124..=13125 - | 13166..=13167 - | 13204..=13205 - | 13246..=13247 - | 13284..=13285 - | 13326..=13327 - | 13364..=13365 - | 13406..=13407 - | 13444..=13445 - | 13486..=13487 - | 13524..=13525 - | 13566..=13567 - | 13604..=13605 - | 13646..=13647 - | 13684..=13685 - | 13726..=13727 - | 13764..=13765 - | 13806..=13807 - | 13844..=13845 - | 13886..=13887 - | 13924..=13925 - | 13966..=13967 - | 14004..=14005 - | 14046..=14047 - | 18942..=18943 - | 18984..=18985 - | 19022..=19023 - | 19064..=19065 - | 19463..=19464 - | 19505..=19506 - | 19883..=19884 - | 19925..=19926 - | 20288..=20289 - | 20330..=20331 - | 21090..=21091 - | 21132..=21133 - | 21501..=21502 - | 21543..=21544 - | 21913..=21914 - | 21955..=21956 - | 22958..=22959 - | 23000..=23001 - | 23038..=23039 - | 23080..=23081 - | 23118..=23119 - | 23160..=23161 - | 23198..=23199 - | 23240..=23241 - | 23310..=23311 - | 23352..=23353 - | 23390..=23391 - | 23432..=23433 - | 23470..=23471 - | 23512..=23513 - | 23550..=23551 - | 23592..=23593 - | 24910..=24911 - | 24952..=24953 - | 25321..=25322 - | 25363..=25364 - | 25732..=25733 - | 25774..=25775 - | 26143..=26144 - | 26185..=26186 => &SHAPE30, - 2878..=2879 - | 2936..=2937 - | 4686..=4687 - | 4744..=4745 - | 7033..=7034 - | 7091..=7092 - | 7113..=7114 - | 7171..=7172 - | 7193..=7194 - | 7251..=7252 - | 7309..=7310 - | 7367..=7368 - | 7435..=7436 - | 7493..=7494 - | 7670..=7671 - | 7728..=7729 - | 7750..=7751 - | 7808..=7809 - | 7830..=7831 - | 7888..=7889 - | 9244..=9245 - | 9302..=9303 - | 9888..=9889 - | 9946..=9947 - | 9968..=9969 - | 10026..=10027 - | 10048..=10049 - | 10106..=10107 - | 10128..=10129 - | 10186..=10187 - | 10208..=10209 - | 10266..=10267 - | 10288..=10289 - | 10346..=10347 - | 10470..=10471 - | 10528..=10529 - | 10550..=10551 - | 10608..=10609 - | 10630..=10631 - | 10688..=10689 - | 11086..=11087 - | 11144..=11145 - | 12418..=12419 - | 12476..=12477 - | 12966..=12967 - | 13024..=13025 - | 13046..=13047 - | 13104..=13105 - | 13126..=13127 - | 13184..=13185 - | 13206..=13207 - | 13264..=13265 - | 13286..=13287 - | 13344..=13345 - | 13366..=13367 - | 13424..=13425 - | 13446..=13447 - | 13504..=13505 - | 13526..=13527 - | 13584..=13585 - | 13606..=13607 - | 13664..=13665 - | 13686..=13687 - | 13744..=13745 - | 13766..=13767 - | 13824..=13825 - | 13846..=13847 - | 13904..=13905 - | 13926..=13927 - | 13984..=13985 - | 14006..=14007 - | 14064..=14065 - | 18944..=18945 - | 19002..=19003 - | 19024..=19025 - | 19082..=19083 - | 19465..=19466 - | 19523..=19524 - | 19885..=19886 - | 19943..=19944 - | 20290..=20291 - | 20348..=20349 - | 21092..=21093 - | 21150..=21151 - | 21503..=21504 - | 21561..=21562 - | 21915..=21916 - | 21973..=21974 - | 22960..=22961 - | 23018..=23019 - | 23040..=23041 - | 23098..=23099 - | 23120..=23121 - | 23178..=23179 - | 23200..=23201 - | 23258..=23259 - | 23312..=23313 - | 23370..=23371 - | 23392..=23393 - | 23450..=23451 - | 23472..=23473 - | 23530..=23531 - | 23552..=23553 - | 23610..=23611 - | 24912..=24913 - | 24970..=24971 - | 25323..=25324 - | 25381..=25382 - | 25734..=25735 - | 25792..=25793 - | 26145..=26146 - | 26203..=26204 => &SHAPE31, - 2880..=2881 - | 2922..=2923 - | 4688..=4689 - | 4730..=4731 - | 7035..=7036 - | 7077..=7078 - | 7115..=7116 - | 7157..=7158 - | 7195..=7196 - | 7237..=7238 - | 7311..=7312 - | 7353..=7354 - | 7437..=7438 - | 7479..=7480 - | 7672..=7673 - | 7714..=7715 - | 7752..=7753 - | 7794..=7795 - | 7832..=7833 - | 7874..=7875 - | 9246..=9247 - | 9288..=9289 - | 9890..=9891 - | 9932..=9933 - | 9970..=9971 - | 10012..=10013 - | 10050..=10051 - | 10092..=10093 - | 10130..=10131 - | 10172..=10173 - | 10210..=10211 - | 10252..=10253 - | 10290..=10291 - | 10332..=10333 - | 10472..=10473 - | 10514..=10515 - | 10552..=10553 - | 10594..=10595 - | 10632..=10633 - | 10674..=10675 - | 11088..=11089 - | 11130..=11131 - | 12420..=12421 - | 12462..=12463 - | 12968..=12969 - | 13010..=13011 - | 13048..=13049 - | 13090..=13091 - | 13128..=13129 - | 13170..=13171 - | 13208..=13209 - | 13250..=13251 - | 13288..=13289 - | 13330..=13331 - | 13368..=13369 - | 13410..=13411 - | 13448..=13449 - | 13490..=13491 - | 13528..=13529 - | 13570..=13571 - | 13608..=13609 - | 13650..=13651 - | 13688..=13689 - | 13730..=13731 - | 13768..=13769 - | 13810..=13811 - | 13848..=13849 - | 13890..=13891 - | 13928..=13929 - | 13970..=13971 - | 14008..=14009 - | 14050..=14051 - | 18946..=18947 - | 18988..=18989 - | 19026..=19027 - | 19068..=19069 - | 19467..=19468 - | 19509..=19510 - | 19887..=19888 - | 19929..=19930 - | 20292..=20293 - | 20334..=20335 - | 21094..=21095 - | 21136..=21137 - | 21505..=21506 - | 21547..=21548 - | 21917..=21918 - | 21959..=21960 - | 22962..=22963 - | 23004..=23005 - | 23042..=23043 - | 23084..=23085 - | 23122..=23123 - | 23164..=23165 - | 23202..=23203 - | 23244..=23245 - | 23314..=23315 - | 23356..=23357 - | 23394..=23395 - | 23436..=23437 - | 23474..=23475 - | 23516..=23517 - | 23554..=23555 - | 23596..=23597 - | 24914..=24915 - | 24956..=24957 - | 25325..=25326 - | 25367..=25368 - | 25736..=25737 - | 25778..=25779 - | 26147..=26148 - | 26189..=26190 => &SHAPE32, - 2882..=2883 - | 2940..=2941 - | 4690..=4691 - | 4748..=4749 - | 7037..=7038 - | 7095..=7096 - | 7117..=7118 - | 7175..=7176 - | 7197..=7198 - | 7255..=7256 - | 7313..=7314 - | 7371..=7372 - | 7439..=7440 - | 7497..=7498 - | 7674..=7675 - | 7732..=7733 - | 7754..=7755 - | 7812..=7813 - | 7834..=7835 - | 7892..=7893 - | 9248..=9249 - | 9306..=9307 - | 9892..=9893 - | 9950..=9951 - | 9972..=9973 - | 10030..=10031 - | 10052..=10053 - | 10110..=10111 - | 10132..=10133 - | 10190..=10191 - | 10212..=10213 - | 10270..=10271 - | 10292..=10293 - | 10350..=10351 - | 10474..=10475 - | 10532..=10533 - | 10554..=10555 - | 10612..=10613 - | 10634..=10635 - | 10692..=10693 - | 11090..=11091 - | 11148..=11149 - | 12422..=12423 - | 12480..=12481 - | 12970..=12971 - | 13028..=13029 - | 13050..=13051 - | 13108..=13109 - | 13130..=13131 - | 13188..=13189 - | 13210..=13211 - | 13268..=13269 - | 13290..=13291 - | 13348..=13349 - | 13370..=13371 - | 13428..=13429 - | 13450..=13451 - | 13508..=13509 - | 13530..=13531 - | 13588..=13589 - | 13610..=13611 - | 13668..=13669 - | 13690..=13691 - | 13748..=13749 - | 13770..=13771 - | 13828..=13829 - | 13850..=13851 - | 13908..=13909 - | 13930..=13931 - | 13988..=13989 - | 14010..=14011 - | 14068..=14069 - | 18948..=18949 - | 19006..=19007 - | 19028..=19029 - | 19086..=19087 - | 19469..=19470 - | 19527..=19528 - | 19889..=19890 - | 19947..=19948 - | 20294..=20295 - | 20352..=20353 - | 21096..=21097 - | 21154..=21155 - | 21507..=21508 - | 21565..=21566 - | 21919..=21920 - | 21977..=21978 - | 22964..=22965 - | 23022..=23023 - | 23044..=23045 - | 23102..=23103 - | 23124..=23125 - | 23182..=23183 - | 23204..=23205 - | 23262..=23263 - | 23316..=23317 - | 23374..=23375 - | 23396..=23397 - | 23454..=23455 - | 23476..=23477 - | 23534..=23535 - | 23556..=23557 - | 23614..=23615 - | 24916..=24917 - | 24974..=24975 - | 25327..=25328 - | 25385..=25386 - | 25738..=25739 - | 25796..=25797 - | 26149..=26150 - | 26207..=26208 => &SHAPE33, - 2884..=2885 - | 4692..=4693 - | 7039..=7040 - | 7119..=7120 - | 7199..=7200 - | 7315..=7316 - | 7441..=7442 - | 7676..=7677 - | 7756..=7757 - | 7836..=7837 - | 9250..=9251 - | 9894..=9895 - | 9974..=9975 - | 10054..=10055 - | 10134..=10135 - | 10214..=10215 - | 10294..=10295 - | 10476..=10477 - | 10556..=10557 - | 10636..=10637 - | 11092..=11093 - | 12424..=12425 - | 12972..=12973 - | 13052..=13053 - | 13132..=13133 - | 13212..=13213 - | 13292..=13293 - | 13372..=13373 - | 13452..=13453 - | 13532..=13533 - | 13612..=13613 - | 13692..=13693 - | 13772..=13773 - | 13852..=13853 - | 13932..=13933 - | 14012..=14013 - | 18950..=18951 - | 19030..=19031 - | 19471..=19472 - | 19891..=19892 - | 20296..=20297 - | 21098..=21099 - | 21509..=21510 - | 21921..=21922 - | 22966..=22967 - | 23046..=23047 - | 23126..=23127 - | 23206..=23207 - | 23318..=23319 - | 23398..=23399 - | 23478..=23479 - | 23558..=23559 - | 24918..=24919 - | 25329..=25330 - | 25740..=25741 - | 26151..=26152 => &SHAPE34, - 2886..=2887 - | 2928..=2929 - | 4694..=4695 - | 4736..=4737 - | 7041..=7042 - | 7083..=7084 - | 7121..=7122 - | 7163..=7164 - | 7201..=7202 - | 7243..=7244 - | 7317..=7318 - | 7359..=7360 - | 7443..=7444 - | 7485..=7486 - | 7678..=7679 - | 7720..=7721 - | 7758..=7759 - | 7800..=7801 - | 7838..=7839 - | 7880..=7881 - | 9252..=9253 - | 9294..=9295 - | 9896..=9897 - | 9938..=9939 - | 9976..=9977 - | 10018..=10019 - | 10056..=10057 - | 10098..=10099 - | 10136..=10137 - | 10178..=10179 - | 10216..=10217 - | 10258..=10259 - | 10296..=10297 - | 10338..=10339 - | 10478..=10479 - | 10520..=10521 - | 10558..=10559 - | 10600..=10601 - | 10638..=10639 - | 10680..=10681 - | 11094..=11095 - | 11136..=11137 - | 12426..=12427 - | 12468..=12469 - | 12974..=12975 - | 13016..=13017 - | 13054..=13055 - | 13096..=13097 - | 13134..=13135 - | 13176..=13177 - | 13214..=13215 - | 13256..=13257 - | 13294..=13295 - | 13336..=13337 - | 13374..=13375 - | 13416..=13417 - | 13454..=13455 - | 13496..=13497 - | 13534..=13535 - | 13576..=13577 - | 13614..=13615 - | 13656..=13657 - | 13694..=13695 - | 13736..=13737 - | 13774..=13775 - | 13816..=13817 - | 13854..=13855 - | 13896..=13897 - | 13934..=13935 - | 13976..=13977 - | 14014..=14015 - | 14056..=14057 - | 18952..=18953 - | 18994..=18995 - | 19032..=19033 - | 19074..=19075 - | 19473..=19474 - | 19515..=19516 - | 19893..=19894 - | 19935..=19936 - | 20298..=20299 - | 20340..=20341 - | 21100..=21101 - | 21142..=21143 - | 21511..=21512 - | 21553..=21554 - | 21923..=21924 - | 21965..=21966 - | 22968..=22969 - | 23010..=23011 - | 23048..=23049 - | 23090..=23091 - | 23128..=23129 - | 23170..=23171 - | 23208..=23209 - | 23250..=23251 - | 23320..=23321 - | 23362..=23363 - | 23400..=23401 - | 23442..=23443 - | 23480..=23481 - | 23522..=23523 - | 23560..=23561 - | 23602..=23603 - | 24920..=24921 - | 24962..=24963 - | 25331..=25332 - | 25373..=25374 - | 25742..=25743 - | 25784..=25785 - | 26153..=26154 - | 26195..=26196 => &SHAPE35, - 2888..=2889 - | 2946..=2947 - | 4696..=4697 - | 4754..=4755 - | 7043..=7044 - | 7101..=7102 - | 7123..=7124 - | 7181..=7182 - | 7203..=7204 - | 7261..=7262 - | 7319..=7320 - | 7377..=7378 - | 7445..=7446 - | 7503..=7504 - | 7680..=7681 - | 7738..=7739 - | 7760..=7761 - | 7818..=7819 - | 7840..=7841 - | 7898..=7899 - | 9254..=9255 - | 9312..=9313 - | 9898..=9899 - | 9956..=9957 - | 9978..=9979 - | 10036..=10037 - | 10058..=10059 - | 10116..=10117 - | 10138..=10139 - | 10196..=10197 - | 10218..=10219 - | 10276..=10277 - | 10298..=10299 - | 10356..=10357 - | 10480..=10481 - | 10538..=10539 - | 10560..=10561 - | 10618..=10619 - | 10640..=10641 - | 10698..=10699 - | 11096..=11097 - | 11154..=11155 - | 12428..=12429 - | 12486..=12487 - | 12976..=12977 - | 13034..=13035 - | 13056..=13057 - | 13114..=13115 - | 13136..=13137 - | 13194..=13195 - | 13216..=13217 - | 13274..=13275 - | 13296..=13297 - | 13354..=13355 - | 13376..=13377 - | 13434..=13435 - | 13456..=13457 - | 13514..=13515 - | 13536..=13537 - | 13594..=13595 - | 13616..=13617 - | 13674..=13675 - | 13696..=13697 - | 13754..=13755 - | 13776..=13777 - | 13834..=13835 - | 13856..=13857 - | 13914..=13915 - | 13936..=13937 - | 13994..=13995 - | 14016..=14017 - | 14074..=14075 - | 18954..=18955 - | 19012..=19013 - | 19034..=19035 - | 19092..=19093 - | 19475..=19476 - | 19533..=19534 - | 19895..=19896 - | 19953..=19954 - | 20300..=20301 - | 20358..=20359 - | 21102..=21103 - | 21160..=21161 - | 21513..=21514 - | 21571..=21572 - | 21925..=21926 - | 21983..=21984 - | 22970..=22971 - | 23028..=23029 - | 23050..=23051 - | 23108..=23109 - | 23130..=23131 - | 23188..=23189 - | 23210..=23211 - | 23268..=23269 - | 23322..=23323 - | 23380..=23381 - | 23402..=23403 - | 23460..=23461 - | 23482..=23483 - | 23540..=23541 - | 23562..=23563 - | 23620..=23621 - | 24922..=24923 - | 24980..=24981 - | 25333..=25334 - | 25391..=25392 - | 25744..=25745 - | 25802..=25803 - | 26155..=26156 - | 26213..=26214 => &SHAPE36, - 2890..=2891 - | 2932..=2933 - | 4698..=4699 - | 4740..=4741 - | 7045..=7046 - | 7087..=7088 - | 7125..=7126 - | 7167..=7168 - | 7205..=7206 - | 7247..=7248 - | 7321..=7322 - | 7363..=7364 - | 7447..=7448 - | 7489..=7490 - | 7682..=7683 - | 7724..=7725 - | 7762..=7763 - | 7804..=7805 - | 7842..=7843 - | 7884..=7885 - | 9256..=9257 - | 9298..=9299 - | 9900..=9901 - | 9942..=9943 - | 9980..=9981 - | 10022..=10023 - | 10060..=10061 - | 10102..=10103 - | 10140..=10141 - | 10182..=10183 - | 10220..=10221 - | 10262..=10263 - | 10300..=10301 - | 10342..=10343 - | 10482..=10483 - | 10524..=10525 - | 10562..=10563 - | 10604..=10605 - | 10642..=10643 - | 10684..=10685 - | 11098..=11099 - | 11140..=11141 - | 12430..=12431 - | 12472..=12473 - | 12978..=12979 - | 13020..=13021 - | 13058..=13059 - | 13100..=13101 - | 13138..=13139 - | 13180..=13181 - | 13218..=13219 - | 13260..=13261 - | 13298..=13299 - | 13340..=13341 - | 13378..=13379 - | 13420..=13421 - | 13458..=13459 - | 13500..=13501 - | 13538..=13539 - | 13580..=13581 - | 13618..=13619 - | 13660..=13661 - | 13698..=13699 - | 13740..=13741 - | 13778..=13779 - | 13820..=13821 - | 13858..=13859 - | 13900..=13901 - | 13938..=13939 - | 13980..=13981 - | 14018..=14019 - | 14060..=14061 - | 18956..=18957 - | 18998..=18999 - | 19036..=19037 - | 19078..=19079 - | 19477..=19478 - | 19519..=19520 - | 19897..=19898 - | 19939..=19940 - | 20302..=20303 - | 20344..=20345 - | 21104..=21105 - | 21146..=21147 - | 21515..=21516 - | 21557..=21558 - | 21927..=21928 - | 21969..=21970 - | 22972..=22973 - | 23014..=23015 - | 23052..=23053 - | 23094..=23095 - | 23132..=23133 - | 23174..=23175 - | 23212..=23213 - | 23254..=23255 - | 23324..=23325 - | 23366..=23367 - | 23404..=23405 - | 23446..=23447 - | 23484..=23485 - | 23526..=23527 - | 23564..=23565 - | 23606..=23607 - | 24924..=24925 - | 24966..=24967 - | 25335..=25336 - | 25377..=25378 - | 25746..=25747 - | 25788..=25789 - | 26157..=26158 - | 26199..=26200 => &SHAPE37, - 2892..=2893 - | 2950..=2951 - | 4700..=4701 - | 4758..=4759 - | 7047..=7048 - | 7105..=7106 - | 7127..=7128 - | 7185..=7186 - | 7207..=7208 - | 7265..=7266 - | 7323..=7324 - | 7381..=7382 - | 7449..=7450 - | 7507..=7508 - | 7684..=7685 - | 7742..=7743 - | 7764..=7765 - | 7822..=7823 - | 7844..=7845 - | 7902..=7903 - | 9258..=9259 - | 9316..=9317 - | 9902..=9903 - | 9960..=9961 - | 9982..=9983 - | 10040..=10041 - | 10062..=10063 - | 10120..=10121 - | 10142..=10143 - | 10200..=10201 - | 10222..=10223 - | 10280..=10281 - | 10302..=10303 - | 10360..=10361 - | 10484..=10485 - | 10542..=10543 - | 10564..=10565 - | 10622..=10623 - | 10644..=10645 - | 10702..=10703 - | 11100..=11101 - | 11158..=11159 - | 12432..=12433 - | 12490..=12491 - | 12980..=12981 - | 13038..=13039 - | 13060..=13061 - | 13118..=13119 - | 13140..=13141 - | 13198..=13199 - | 13220..=13221 - | 13278..=13279 - | 13300..=13301 - | 13358..=13359 - | 13380..=13381 - | 13438..=13439 - | 13460..=13461 - | 13518..=13519 - | 13540..=13541 - | 13598..=13599 - | 13620..=13621 - | 13678..=13679 - | 13700..=13701 - | 13758..=13759 - | 13780..=13781 - | 13838..=13839 - | 13860..=13861 - | 13918..=13919 - | 13940..=13941 - | 13998..=13999 - | 14020..=14021 - | 14078..=14079 - | 18958..=18959 - | 19016..=19017 - | 19038..=19039 - | 19096..=19097 - | 19479..=19480 - | 19537..=19538 - | 19899..=19900 - | 19957..=19958 - | 20304..=20305 - | 20362..=20363 - | 21106..=21107 - | 21164..=21165 - | 21517..=21518 - | 21575..=21576 - | 21929..=21930 - | 21987..=21988 - | 22974..=22975 - | 23032..=23033 - | 23054..=23055 - | 23112..=23113 - | 23134..=23135 - | 23192..=23193 - | 23214..=23215 - | 23272..=23273 - | 23326..=23327 - | 23384..=23385 - | 23406..=23407 - | 23464..=23465 - | 23486..=23487 - | 23544..=23545 - | 23566..=23567 - | 23624..=23625 - | 24926..=24927 - | 24984..=24985 - | 25337..=25338 - | 25395..=25396 - | 25748..=25749 - | 25806..=25807 - | 26159..=26160 - | 26217..=26218 => &SHAPE38, - 2894..=2895 - | 4702..=4703 - | 7049..=7050 - | 7129..=7130 - | 7209..=7210 - | 7325..=7326 - | 7451..=7452 - | 7686..=7687 - | 7766..=7767 - | 7846..=7847 - | 9260..=9261 - | 9904..=9905 - | 9984..=9985 - | 10064..=10065 - | 10144..=10145 - | 10224..=10225 - | 10304..=10305 - | 10486..=10487 - | 10566..=10567 - | 10646..=10647 - | 11102..=11103 - | 12434..=12435 - | 12982..=12983 - | 13062..=13063 - | 13142..=13143 - | 13222..=13223 - | 13302..=13303 - | 13382..=13383 - | 13462..=13463 - | 13542..=13543 - | 13622..=13623 - | 13702..=13703 - | 13782..=13783 - | 13862..=13863 - | 13942..=13943 - | 14022..=14023 - | 18960..=18961 - | 19040..=19041 - | 19481..=19482 - | 19901..=19902 - | 20306..=20307 - | 21108..=21109 - | 21519..=21520 - | 21931..=21932 - | 22976..=22977 - | 23056..=23057 - | 23136..=23137 - | 23216..=23217 - | 23328..=23329 - | 23408..=23409 - | 23488..=23489 - | 23568..=23569 - | 24928..=24929 - | 25339..=25340 - | 25750..=25751 - | 26161..=26162 => &SHAPE39, - 2896..=2897 - | 2938..=2939 - | 4704..=4705 - | 4746..=4747 - | 7051..=7052 - | 7093..=7094 - | 7131..=7132 - | 7173..=7174 - | 7211..=7212 - | 7253..=7254 - | 7327..=7328 - | 7369..=7370 - | 7453..=7454 - | 7495..=7496 - | 7688..=7689 - | 7730..=7731 - | 7768..=7769 - | 7810..=7811 - | 7848..=7849 - | 7890..=7891 - | 9262..=9263 - | 9304..=9305 - | 9906..=9907 - | 9948..=9949 - | 9986..=9987 - | 10028..=10029 - | 10066..=10067 - | 10108..=10109 - | 10146..=10147 - | 10188..=10189 - | 10226..=10227 - | 10268..=10269 - | 10306..=10307 - | 10348..=10349 - | 10488..=10489 - | 10530..=10531 - | 10568..=10569 - | 10610..=10611 - | 10648..=10649 - | 10690..=10691 - | 11104..=11105 - | 11146..=11147 - | 12436..=12437 - | 12478..=12479 - | 12984..=12985 - | 13026..=13027 - | 13064..=13065 - | 13106..=13107 - | 13144..=13145 - | 13186..=13187 - | 13224..=13225 - | 13266..=13267 - | 13304..=13305 - | 13346..=13347 - | 13384..=13385 - | 13426..=13427 - | 13464..=13465 - | 13506..=13507 - | 13544..=13545 - | 13586..=13587 - | 13624..=13625 - | 13666..=13667 - | 13704..=13705 - | 13746..=13747 - | 13784..=13785 - | 13826..=13827 - | 13864..=13865 - | 13906..=13907 - | 13944..=13945 - | 13986..=13987 - | 14024..=14025 - | 14066..=14067 - | 18962..=18963 - | 19004..=19005 - | 19042..=19043 - | 19084..=19085 - | 19483..=19484 - | 19525..=19526 - | 19903..=19904 - | 19945..=19946 - | 20308..=20309 - | 20350..=20351 - | 21110..=21111 - | 21152..=21153 - | 21521..=21522 - | 21563..=21564 - | 21933..=21934 - | 21975..=21976 - | 22978..=22979 - | 23020..=23021 - | 23058..=23059 - | 23100..=23101 - | 23138..=23139 - | 23180..=23181 - | 23218..=23219 - | 23260..=23261 - | 23330..=23331 - | 23372..=23373 - | 23410..=23411 - | 23452..=23453 - | 23490..=23491 - | 23532..=23533 - | 23570..=23571 - | 23612..=23613 - | 24930..=24931 - | 24972..=24973 - | 25341..=25342 - | 25383..=25384 - | 25752..=25753 - | 25794..=25795 - | 26163..=26164 - | 26205..=26206 => &SHAPE40, - 2898..=2899 - | 2916..=2917 - | 4706..=4707 - | 4724..=4725 - | 7053..=7054 - | 7071..=7072 - | 7133..=7134 - | 7151..=7152 - | 7213..=7214 - | 7231..=7232 - | 7329..=7330 - | 7347..=7348 - | 7455..=7456 - | 7473..=7474 - | 7690..=7691 - | 7708..=7709 - | 7770..=7771 - | 7788..=7789 - | 7850..=7851 - | 7868..=7869 - | 9264..=9265 - | 9282..=9283 - | 9908..=9909 - | 9926..=9927 - | 9988..=9989 - | 10006..=10007 - | 10068..=10069 - | 10086..=10087 - | 10148..=10149 - | 10166..=10167 - | 10228..=10229 - | 10246..=10247 - | 10308..=10309 - | 10326..=10327 - | 10490..=10491 - | 10508..=10509 - | 10570..=10571 - | 10588..=10589 - | 10650..=10651 - | 10668..=10669 - | 11106..=11107 - | 11124..=11125 - | 12438..=12439 - | 12456..=12457 - | 12986..=12987 - | 13004..=13005 - | 13066..=13067 - | 13084..=13085 - | 13146..=13147 - | 13164..=13165 - | 13226..=13227 - | 13244..=13245 - | 13306..=13307 - | 13324..=13325 - | 13386..=13387 - | 13404..=13405 - | 13466..=13467 - | 13484..=13485 - | 13546..=13547 - | 13564..=13565 - | 13626..=13627 - | 13644..=13645 - | 13706..=13707 - | 13724..=13725 - | 13786..=13787 - | 13804..=13805 - | 13866..=13867 - | 13884..=13885 - | 13946..=13947 - | 13964..=13965 - | 14026..=14027 - | 14044..=14045 - | 18964..=18965 - | 18982..=18983 - | 19044..=19045 - | 19062..=19063 - | 19485..=19486 - | 19503..=19504 - | 19905..=19906 - | 19923..=19924 - | 20310..=20311 - | 20328..=20329 - | 21112..=21113 - | 21130..=21131 - | 21523..=21524 - | 21541..=21542 - | 21935..=21936 - | 21953..=21954 - | 22980..=22981 - | 22998..=22999 - | 23060..=23061 - | 23078..=23079 - | 23140..=23141 - | 23158..=23159 - | 23220..=23221 - | 23238..=23239 - | 23332..=23333 - | 23350..=23351 - | 23412..=23413 - | 23430..=23431 - | 23492..=23493 - | 23510..=23511 - | 23572..=23573 - | 23590..=23591 - | 24932..=24933 - | 24950..=24951 - | 25343..=25344 - | 25361..=25362 - | 25754..=25755 - | 25772..=25773 - | 26165..=26166 - | 26183..=26184 => &SHAPE41, - 2900..=2901 - | 2942..=2943 - | 4708..=4709 - | 4750..=4751 - | 7055..=7056 - | 7097..=7098 - | 7135..=7136 - | 7177..=7178 - | 7215..=7216 - | 7257..=7258 - | 7331..=7332 - | 7373..=7374 - | 7457..=7458 - | 7499..=7500 - | 7692..=7693 - | 7734..=7735 - | 7772..=7773 - | 7814..=7815 - | 7852..=7853 - | 7894..=7895 - | 9266..=9267 - | 9308..=9309 - | 9910..=9911 - | 9952..=9953 - | 9990..=9991 - | 10032..=10033 - | 10070..=10071 - | 10112..=10113 - | 10150..=10151 - | 10192..=10193 - | 10230..=10231 - | 10272..=10273 - | 10310..=10311 - | 10352..=10353 - | 10492..=10493 - | 10534..=10535 - | 10572..=10573 - | 10614..=10615 - | 10652..=10653 - | 10694..=10695 - | 11108..=11109 - | 11150..=11151 - | 12440..=12441 - | 12482..=12483 - | 12988..=12989 - | 13030..=13031 - | 13068..=13069 - | 13110..=13111 - | 13148..=13149 - | 13190..=13191 - | 13228..=13229 - | 13270..=13271 - | 13308..=13309 - | 13350..=13351 - | 13388..=13389 - | 13430..=13431 - | 13468..=13469 - | 13510..=13511 - | 13548..=13549 - | 13590..=13591 - | 13628..=13629 - | 13670..=13671 - | 13708..=13709 - | 13750..=13751 - | 13788..=13789 - | 13830..=13831 - | 13868..=13869 - | 13910..=13911 - | 13948..=13949 - | 13990..=13991 - | 14028..=14029 - | 14070..=14071 - | 18966..=18967 - | 19008..=19009 - | 19046..=19047 - | 19088..=19089 - | 19487..=19488 - | 19529..=19530 - | 19907..=19908 - | 19949..=19950 - | 20312..=20313 - | 20354..=20355 - | 21114..=21115 - | 21156..=21157 - | 21525..=21526 - | 21567..=21568 - | 21937..=21938 - | 21979..=21980 - | 22982..=22983 - | 23024..=23025 - | 23062..=23063 - | 23104..=23105 - | 23142..=23143 - | 23184..=23185 - | 23222..=23223 - | 23264..=23265 - | 23334..=23335 - | 23376..=23377 - | 23414..=23415 - | 23456..=23457 - | 23494..=23495 - | 23536..=23537 - | 23574..=23575 - | 23616..=23617 - | 24934..=24935 - | 24976..=24977 - | 25345..=25346 - | 25387..=25388 - | 25756..=25757 - | 25798..=25799 - | 26167..=26168 - | 26209..=26210 => &SHAPE42, - 2902..=2903 - | 2920..=2921 - | 4710..=4711 - | 4728..=4729 - | 7057..=7058 - | 7075..=7076 - | 7137..=7138 - | 7155..=7156 - | 7217..=7218 - | 7235..=7236 - | 7333..=7334 - | 7351..=7352 - | 7459..=7460 - | 7477..=7478 - | 7694..=7695 - | 7712..=7713 - | 7774..=7775 - | 7792..=7793 - | 7854..=7855 - | 7872..=7873 - | 9268..=9269 - | 9286..=9287 - | 9912..=9913 - | 9930..=9931 - | 9992..=9993 - | 10010..=10011 - | 10072..=10073 - | 10090..=10091 - | 10152..=10153 - | 10170..=10171 - | 10232..=10233 - | 10250..=10251 - | 10312..=10313 - | 10330..=10331 - | 10494..=10495 - | 10512..=10513 - | 10574..=10575 - | 10592..=10593 - | 10654..=10655 - | 10672..=10673 - | 11110..=11111 - | 11128..=11129 - | 12442..=12443 - | 12460..=12461 - | 12990..=12991 - | 13008..=13009 - | 13070..=13071 - | 13088..=13089 - | 13150..=13151 - | 13168..=13169 - | 13230..=13231 - | 13248..=13249 - | 13310..=13311 - | 13328..=13329 - | 13390..=13391 - | 13408..=13409 - | 13470..=13471 - | 13488..=13489 - | 13550..=13551 - | 13568..=13569 - | 13630..=13631 - | 13648..=13649 - | 13710..=13711 - | 13728..=13729 - | 13790..=13791 - | 13808..=13809 - | 13870..=13871 - | 13888..=13889 - | 13950..=13951 - | 13968..=13969 - | 14030..=14031 - | 14048..=14049 - | 18968..=18969 - | 18986..=18987 - | 19048..=19049 - | 19066..=19067 - | 19489..=19490 - | 19507..=19508 - | 19909..=19910 - | 19927..=19928 - | 20314..=20315 - | 20332..=20333 - | 21116..=21117 - | 21134..=21135 - | 21527..=21528 - | 21545..=21546 - | 21939..=21940 - | 21957..=21958 - | 22984..=22985 - | 23002..=23003 - | 23064..=23065 - | 23082..=23083 - | 23144..=23145 - | 23162..=23163 - | 23224..=23225 - | 23242..=23243 - | 23336..=23337 - | 23354..=23355 - | 23416..=23417 - | 23434..=23435 - | 23496..=23497 - | 23514..=23515 - | 23576..=23577 - | 23594..=23595 - | 24936..=24937 - | 24954..=24955 - | 25347..=25348 - | 25365..=25366 - | 25758..=25759 - | 25776..=25777 - | 26169..=26170 - | 26187..=26188 => &SHAPE43, - 2904..=2905 - | 4712..=4713 - | 7059..=7060 - | 7139..=7140 - | 7219..=7220 - | 7335..=7336 - | 7461..=7462 - | 7696..=7697 - | 7776..=7777 - | 7856..=7857 - | 9270..=9271 - | 9914..=9915 - | 9994..=9995 - | 10074..=10075 - | 10154..=10155 - | 10234..=10235 - | 10314..=10315 - | 10496..=10497 - | 10576..=10577 - | 10656..=10657 - | 11112..=11113 - | 12444..=12445 - | 12992..=12993 - | 13072..=13073 - | 13152..=13153 - | 13232..=13233 - | 13312..=13313 - | 13392..=13393 - | 13472..=13473 - | 13552..=13553 - | 13632..=13633 - | 13712..=13713 - | 13792..=13793 - | 13872..=13873 - | 13952..=13953 - | 14032..=14033 - | 18970..=18971 - | 19050..=19051 - | 19491..=19492 - | 19911..=19912 - | 20316..=20317 - | 21118..=21119 - | 21529..=21530 - | 21941..=21942 - | 22986..=22987 - | 23066..=23067 - | 23146..=23147 - | 23226..=23227 - | 23338..=23339 - | 23418..=23419 - | 23498..=23499 - | 23578..=23579 - | 24938..=24939 - | 25349..=25350 - | 25760..=25761 - | 26171..=26172 => &SHAPE44, - 2906..=2907 - | 2948..=2949 - | 4714..=4715 - | 4756..=4757 - | 7061..=7062 - | 7103..=7104 - | 7141..=7142 - | 7183..=7184 - | 7221..=7222 - | 7263..=7264 - | 7337..=7338 - | 7379..=7380 - | 7463..=7464 - | 7505..=7506 - | 7698..=7699 - | 7740..=7741 - | 7778..=7779 - | 7820..=7821 - | 7858..=7859 - | 7900..=7901 - | 9272..=9273 - | 9314..=9315 - | 9916..=9917 - | 9958..=9959 - | 9996..=9997 - | 10038..=10039 - | 10076..=10077 - | 10118..=10119 - | 10156..=10157 - | 10198..=10199 - | 10236..=10237 - | 10278..=10279 - | 10316..=10317 - | 10358..=10359 - | 10498..=10499 - | 10540..=10541 - | 10578..=10579 - | 10620..=10621 - | 10658..=10659 - | 10700..=10701 - | 11114..=11115 - | 11156..=11157 - | 12446..=12447 - | 12488..=12489 - | 12994..=12995 - | 13036..=13037 - | 13074..=13075 - | 13116..=13117 - | 13154..=13155 - | 13196..=13197 - | 13234..=13235 - | 13276..=13277 - | 13314..=13315 - | 13356..=13357 - | 13394..=13395 - | 13436..=13437 - | 13474..=13475 - | 13516..=13517 - | 13554..=13555 - | 13596..=13597 - | 13634..=13635 - | 13676..=13677 - | 13714..=13715 - | 13756..=13757 - | 13794..=13795 - | 13836..=13837 - | 13874..=13875 - | 13916..=13917 - | 13954..=13955 - | 13996..=13997 - | 14034..=14035 - | 14076..=14077 - | 18972..=18973 - | 19014..=19015 - | 19052..=19053 - | 19094..=19095 - | 19493..=19494 - | 19535..=19536 - | 19913..=19914 - | 19955..=19956 - | 20318..=20319 - | 20360..=20361 - | 21120..=21121 - | 21162..=21163 - | 21531..=21532 - | 21573..=21574 - | 21943..=21944 - | 21985..=21986 - | 22988..=22989 - | 23030..=23031 - | 23068..=23069 - | 23110..=23111 - | 23148..=23149 - | 23190..=23191 - | 23228..=23229 - | 23270..=23271 - | 23340..=23341 - | 23382..=23383 - | 23420..=23421 - | 23462..=23463 - | 23500..=23501 - | 23542..=23543 - | 23580..=23581 - | 23622..=23623 - | 24940..=24941 - | 24982..=24983 - | 25351..=25352 - | 25393..=25394 - | 25762..=25763 - | 25804..=25805 - | 26173..=26174 - | 26215..=26216 => &SHAPE45, - 2908..=2909 - | 2926..=2927 - | 4716..=4717 - | 4734..=4735 - | 7063..=7064 - | 7081..=7082 - | 7143..=7144 - | 7161..=7162 - | 7223..=7224 - | 7241..=7242 - | 7339..=7340 - | 7357..=7358 - | 7465..=7466 - | 7483..=7484 - | 7700..=7701 - | 7718..=7719 - | 7780..=7781 - | 7798..=7799 - | 7860..=7861 - | 7878..=7879 - | 9274..=9275 - | 9292..=9293 - | 9918..=9919 - | 9936..=9937 - | 9998..=9999 - | 10016..=10017 - | 10078..=10079 - | 10096..=10097 - | 10158..=10159 - | 10176..=10177 - | 10238..=10239 - | 10256..=10257 - | 10318..=10319 - | 10336..=10337 - | 10500..=10501 - | 10518..=10519 - | 10580..=10581 - | 10598..=10599 - | 10660..=10661 - | 10678..=10679 - | 11116..=11117 - | 11134..=11135 - | 12448..=12449 - | 12466..=12467 - | 12996..=12997 - | 13014..=13015 - | 13076..=13077 - | 13094..=13095 - | 13156..=13157 - | 13174..=13175 - | 13236..=13237 - | 13254..=13255 - | 13316..=13317 - | 13334..=13335 - | 13396..=13397 - | 13414..=13415 - | 13476..=13477 - | 13494..=13495 - | 13556..=13557 - | 13574..=13575 - | 13636..=13637 - | 13654..=13655 - | 13716..=13717 - | 13734..=13735 - | 13796..=13797 - | 13814..=13815 - | 13876..=13877 - | 13894..=13895 - | 13956..=13957 - | 13974..=13975 - | 14036..=14037 - | 14054..=14055 - | 18974..=18975 - | 18992..=18993 - | 19054..=19055 - | 19072..=19073 - | 19495..=19496 - | 19513..=19514 - | 19915..=19916 - | 19933..=19934 - | 20320..=20321 - | 20338..=20339 - | 21122..=21123 - | 21140..=21141 - | 21533..=21534 - | 21551..=21552 - | 21945..=21946 - | 21963..=21964 - | 22990..=22991 - | 23008..=23009 - | 23070..=23071 - | 23088..=23089 - | 23150..=23151 - | 23168..=23169 - | 23230..=23231 - | 23248..=23249 - | 23342..=23343 - | 23360..=23361 - | 23422..=23423 - | 23440..=23441 - | 23502..=23503 - | 23520..=23521 - | 23582..=23583 - | 23600..=23601 - | 24942..=24943 - | 24960..=24961 - | 25353..=25354 - | 25371..=25372 - | 25764..=25765 - | 25782..=25783 - | 26175..=26176 - | 26193..=26194 => &SHAPE46, - 2910..=2911 - | 2952..=2953 - | 4718..=4719 - | 4760..=4761 - | 7065..=7066 - | 7107..=7108 - | 7145..=7146 - | 7187..=7188 - | 7225..=7226 - | 7267..=7268 - | 7341..=7342 - | 7383..=7384 - | 7467..=7468 - | 7509..=7510 - | 7702..=7703 - | 7744..=7745 - | 7782..=7783 - | 7824..=7825 - | 7862..=7863 - | 7904..=7905 - | 9276..=9277 - | 9318..=9319 - | 9920..=9921 - | 9962..=9963 - | 10000..=10001 - | 10042..=10043 - | 10080..=10081 - | 10122..=10123 - | 10160..=10161 - | 10202..=10203 - | 10240..=10241 - | 10282..=10283 - | 10320..=10321 - | 10362..=10363 - | 10502..=10503 - | 10544..=10545 - | 10582..=10583 - | 10624..=10625 - | 10662..=10663 - | 10704..=10705 - | 11118..=11119 - | 11160..=11161 - | 12450..=12451 - | 12492..=12493 - | 12998..=12999 - | 13040..=13041 - | 13078..=13079 - | 13120..=13121 - | 13158..=13159 - | 13200..=13201 - | 13238..=13239 - | 13280..=13281 - | 13318..=13319 - | 13360..=13361 - | 13398..=13399 - | 13440..=13441 - | 13478..=13479 - | 13520..=13521 - | 13558..=13559 - | 13600..=13601 - | 13638..=13639 - | 13680..=13681 - | 13718..=13719 - | 13760..=13761 - | 13798..=13799 - | 13840..=13841 - | 13878..=13879 - | 13920..=13921 - | 13958..=13959 - | 14000..=14001 - | 14038..=14039 - | 14080..=14081 - | 18976..=18977 - | 19018..=19019 - | 19056..=19057 - | 19098..=19099 - | 19497..=19498 - | 19539..=19540 - | 19917..=19918 - | 19959..=19960 - | 20322..=20323 - | 20364..=20365 - | 21124..=21125 - | 21166..=21167 - | 21535..=21536 - | 21577..=21578 - | 21947..=21948 - | 21989..=21990 - | 22992..=22993 - | 23034..=23035 - | 23072..=23073 - | 23114..=23115 - | 23152..=23153 - | 23194..=23195 - | 23232..=23233 - | 23274..=23275 - | 23344..=23345 - | 23386..=23387 - | 23424..=23425 - | 23466..=23467 - | 23504..=23505 - | 23546..=23547 - | 23584..=23585 - | 23626..=23627 - | 24944..=24945 - | 24986..=24987 - | 25355..=25356 - | 25397..=25398 - | 25766..=25767 - | 25808..=25809 - | 26177..=26178 - | 26219..=26220 => &SHAPE47, - 2912..=2913 - | 2930..=2931 - | 4720..=4721 - | 4738..=4739 - | 7067..=7068 - | 7085..=7086 - | 7147..=7148 - | 7165..=7166 - | 7227..=7228 - | 7245..=7246 - | 7343..=7344 - | 7361..=7362 - | 7469..=7470 - | 7487..=7488 - | 7704..=7705 - | 7722..=7723 - | 7784..=7785 - | 7802..=7803 - | 7864..=7865 - | 7882..=7883 - | 9278..=9279 - | 9296..=9297 - | 9922..=9923 - | 9940..=9941 - | 10002..=10003 - | 10020..=10021 - | 10082..=10083 - | 10100..=10101 - | 10162..=10163 - | 10180..=10181 - | 10242..=10243 - | 10260..=10261 - | 10322..=10323 - | 10340..=10341 - | 10504..=10505 - | 10522..=10523 - | 10584..=10585 - | 10602..=10603 - | 10664..=10665 - | 10682..=10683 - | 11120..=11121 - | 11138..=11139 - | 12452..=12453 - | 12470..=12471 - | 13000..=13001 - | 13018..=13019 - | 13080..=13081 - | 13098..=13099 - | 13160..=13161 - | 13178..=13179 - | 13240..=13241 - | 13258..=13259 - | 13320..=13321 - | 13338..=13339 - | 13400..=13401 - | 13418..=13419 - | 13480..=13481 - | 13498..=13499 - | 13560..=13561 - | 13578..=13579 - | 13640..=13641 - | 13658..=13659 - | 13720..=13721 - | 13738..=13739 - | 13800..=13801 - | 13818..=13819 - | 13880..=13881 - | 13898..=13899 - | 13960..=13961 - | 13978..=13979 - | 14040..=14041 - | 14058..=14059 - | 18978..=18979 - | 18996..=18997 - | 19058..=19059 - | 19076..=19077 - | 19499..=19500 - | 19517..=19518 - | 19919..=19920 - | 19937..=19938 - | 20324..=20325 - | 20342..=20343 - | 21126..=21127 - | 21144..=21145 - | 21537..=21538 - | 21555..=21556 - | 21949..=21950 - | 21967..=21968 - | 22994..=22995 - | 23012..=23013 - | 23074..=23075 - | 23092..=23093 - | 23154..=23155 - | 23172..=23173 - | 23234..=23235 - | 23252..=23253 - | 23346..=23347 - | 23364..=23365 - | 23426..=23427 - | 23444..=23445 - | 23506..=23507 - | 23524..=23525 - | 23586..=23587 - | 23604..=23605 - | 24946..=24947 - | 24964..=24965 - | 25357..=25358 - | 25375..=25376 - | 25768..=25769 - | 25786..=25787 - | 26179..=26180 - | 26197..=26198 => &SHAPE48, - 2914..=2915 - | 4722..=4723 - | 7069..=7070 - | 7149..=7150 - | 7229..=7230 - | 7345..=7346 - | 7471..=7472 - | 7706..=7707 - | 7786..=7787 - | 7866..=7867 - | 9280..=9281 - | 9924..=9925 - | 10004..=10005 - | 10084..=10085 - | 10164..=10165 - | 10244..=10245 - | 10324..=10325 - | 10506..=10507 - | 10586..=10587 - | 10666..=10667 - | 11122..=11123 - | 12454..=12455 - | 13002..=13003 - | 13082..=13083 - | 13162..=13163 - | 13242..=13243 - | 13322..=13323 - | 13402..=13403 - | 13482..=13483 - | 13562..=13563 - | 13642..=13643 - | 13722..=13723 - | 13802..=13803 - | 13882..=13883 - | 13962..=13963 - | 14042..=14043 - | 18980..=18981 - | 19060..=19061 - | 19501..=19502 - | 19921..=19922 - | 20326..=20327 - | 21128..=21129 - | 21539..=21540 - | 21951..=21952 - | 22996..=22997 - | 23076..=23077 - | 23156..=23157 - | 23236..=23237 - | 23348..=23349 - | 23428..=23429 - | 23508..=23509 - | 23588..=23589 - | 24948..=24949 - | 25359..=25360 - | 25770..=25771 - | 26181..=26182 => &SHAPE49, - 2924..=2925 - | 4732..=4733 - | 7079..=7080 - | 7159..=7160 - | 7239..=7240 - | 7355..=7356 - | 7481..=7482 - | 7716..=7717 - | 7796..=7797 - | 7876..=7877 - | 9290..=9291 - | 9934..=9935 - | 10014..=10015 - | 10094..=10095 - | 10174..=10175 - | 10254..=10255 - | 10334..=10335 - | 10516..=10517 - | 10596..=10597 - | 10676..=10677 - | 11132..=11133 - | 12464..=12465 - | 13012..=13013 - | 13092..=13093 - | 13172..=13173 - | 13252..=13253 - | 13332..=13333 - | 13412..=13413 - | 13492..=13493 - | 13572..=13573 - | 13652..=13653 - | 13732..=13733 - | 13812..=13813 - | 13892..=13893 - | 13972..=13973 - | 14052..=14053 - | 18990..=18991 - | 19070..=19071 - | 19511..=19512 - | 19931..=19932 - | 20336..=20337 - | 21138..=21139 - | 21549..=21550 - | 21961..=21962 - | 23006..=23007 - | 23086..=23087 - | 23166..=23167 - | 23246..=23247 - | 23358..=23359 - | 23438..=23439 - | 23518..=23519 - | 23598..=23599 - | 24958..=24959 - | 25369..=25370 - | 25780..=25781 - | 26191..=26192 => &SHAPE50, - 2934..=2935 - | 4742..=4743 - | 7089..=7090 - | 7169..=7170 - | 7249..=7250 - | 7365..=7366 - | 7491..=7492 - | 7726..=7727 - | 7806..=7807 - | 7886..=7887 - | 9300..=9301 - | 9944..=9945 - | 10024..=10025 - | 10104..=10105 - | 10184..=10185 - | 10264..=10265 - | 10344..=10345 - | 10526..=10527 - | 10606..=10607 - | 10686..=10687 - | 11142..=11143 - | 12474..=12475 - | 13022..=13023 - | 13102..=13103 - | 13182..=13183 - | 13262..=13263 - | 13342..=13343 - | 13422..=13423 - | 13502..=13503 - | 13582..=13583 - | 13662..=13663 - | 13742..=13743 - | 13822..=13823 - | 13902..=13903 - | 13982..=13983 - | 14062..=14063 - | 19000..=19001 - | 19080..=19081 - | 19521..=19522 - | 19941..=19942 - | 20346..=20347 - | 21148..=21149 - | 21559..=21560 - | 21971..=21972 - | 23016..=23017 - | 23096..=23097 - | 23176..=23177 - | 23256..=23257 - | 23368..=23369 - | 23448..=23449 - | 23528..=23529 - | 23608..=23609 - | 24968..=24969 - | 25379..=25380 - | 25790..=25791 - | 26201..=26202 => &SHAPE51, - 2944..=2945 - | 4752..=4753 - | 7099..=7100 - | 7179..=7180 - | 7259..=7260 - | 7375..=7376 - | 7501..=7502 - | 7736..=7737 - | 7816..=7817 - | 7896..=7897 - | 9310..=9311 - | 9954..=9955 - | 10034..=10035 - | 10114..=10115 - | 10194..=10195 - | 10274..=10275 - | 10354..=10355 - | 10536..=10537 - | 10616..=10617 - | 10696..=10697 - | 11152..=11153 - | 12484..=12485 - | 13032..=13033 - | 13112..=13113 - | 13192..=13193 - | 13272..=13273 - | 13352..=13353 - | 13432..=13433 - | 13512..=13513 - | 13592..=13593 - | 13672..=13673 - | 13752..=13753 - | 13832..=13833 - | 13912..=13913 - | 13992..=13993 - | 14072..=14073 - | 19010..=19011 - | 19090..=19091 - | 19531..=19532 - | 19951..=19952 - | 20356..=20357 - | 21158..=21159 - | 21569..=21570 - | 21981..=21982 - | 23026..=23027 - | 23106..=23107 - | 23186..=23187 - | 23266..=23267 - | 23378..=23379 - | 23458..=23459 - | 23538..=23539 - | 23618..=23619 - | 24978..=24979 - | 25389..=25390 - | 25800..=25801 - | 26211..=26212 => &SHAPE52, - 2954..=2955 - | 2960..=2961 - | 2966..=2967 - | 2972..=2973 - | 7513..=7520 - | 9119..=9120 - | 9125..=9126 - | 9131..=9132 - | 9137..=9138 => &SHAPE53, - 2956..=2957 | 2964..=2965 | 9121..=9122 | 9129..=9130 => &SHAPE54, - 2958..=2959 | 2962..=2963 | 9123..=9124 | 9127..=9128 => &SHAPE55, - 2968..=2969 | 2976..=2977 | 9133..=9134 | 9141..=9142 => &SHAPE56, - 2970..=2971 | 2974..=2975 | 9135..=9136 | 9139..=9140 => &SHAPE57, - 4286..=4293 | 12513 => &SHAPE62, - 4590..=4591 - | 4598..=4599 - | 4610..=4611 - | 4618..=4619 - | 4640..=4641 - | 4644..=4645 - | 4648..=4649 - | 4652..=4653 - | 4660..=4661 - | 5652..=5653 - | 5660..=5661 - | 5672..=5673 - | 5680..=5681 - | 5702..=5703 - | 5706..=5707 - | 5710..=5711 - | 5714..=5715 - | 6009..=6012 - | 6017..=6020 - | 6073..=6076 - | 6081..=6084 - | 6137..=6140 - | 6145..=6148 - | 6201..=6204 - | 6209..=6212 - | 6265..=6268 - | 6273..=6276 - | 6329..=6332 - | 6337..=6340 - | 6393..=6396 - | 6401..=6404 - | 6457..=6460 - | 6465..=6468 - | 6521..=6524 - | 6529..=6532 - | 10447..=10450 - | 10455..=10458 - | 11822..=11823 - | 11830..=11831 - | 11842..=11843 - | 11850..=11851 - | 11872..=11873 - | 11876..=11877 - | 11880..=11881 - | 11884..=11887 - | 11894..=11895 - | 11906..=11907 - | 11914..=11915 - | 11936..=11937 - | 11940..=11941 - | 11944..=11945 - | 11948..=11951 - | 11958..=11959 - | 11970..=11971 - | 11978..=11979 - | 12000..=12001 - | 12004..=12005 - | 12008..=12009 - | 12012..=12015 - | 12022..=12023 - | 12034..=12035 - | 12042..=12043 - | 12064..=12065 - | 12068..=12069 - | 12072..=12073 - | 12076..=12079 - | 12086..=12087 - | 12098..=12099 - | 12106..=12107 - | 12128..=12129 - | 12132..=12133 - | 12136..=12137 - | 12140..=12143 - | 12150..=12151 - | 12162..=12163 - | 12170..=12171 - | 12192..=12193 - | 12196..=12197 - | 12200..=12201 - | 12204..=12207 - | 12214..=12215 - | 12226..=12227 - | 12234..=12235 - | 12256..=12257 - | 12260..=12261 - | 12264..=12265 - | 12268..=12271 - | 12278..=12279 - | 12290..=12291 - | 12298..=12299 - | 12320..=12321 - | 12324..=12325 - | 12328..=12329 - | 12332..=12333 - | 18796..=18799 - | 18804..=18807 - | 18860..=18863 - | 18868..=18871 - | 19148..=19149 - | 19156..=19157 - | 19168..=19169 - | 19176..=19177 - | 19198..=19199 - | 19202..=19203 - | 19206..=19207 - | 19210..=19213 - | 19220..=19221 - | 19232..=19233 - | 19240..=19241 - | 19262..=19263 - | 19266..=19267 - | 19270..=19271 - | 19274..=19275 - | 23652..=23653 - | 23660..=23661 - | 23672..=23673 - | 23680..=23681 - | 23702..=23703 - | 23706..=23707 - | 23710..=23711 - | 23714..=23717 - | 23724..=23725 - | 23736..=23737 - | 23744..=23745 - | 23766..=23767 - | 23770..=23771 - | 23774..=23775 - | 23778..=23781 - | 23788..=23789 - | 23800..=23801 - | 23808..=23809 - | 23830..=23831 - | 23834..=23835 - | 23838..=23839 - | 23842..=23845 - | 23852..=23853 - | 23864..=23865 - | 23872..=23873 - | 23894..=23895 - | 23898..=23899 - | 23902..=23903 - | 23906..=23909 - | 23916..=23917 - | 23928..=23929 - | 23936..=23937 - | 23958..=23959 - | 23962..=23963 - | 23966..=23967 - | 23970..=23973 - | 23980..=23981 - | 23992..=23993 - | 24000..=24001 - | 24022..=24023 - | 24026..=24027 - | 24030..=24031 - | 24034..=24037 - | 24044..=24045 - | 24056..=24057 - | 24064..=24065 - | 24086..=24087 - | 24090..=24091 - | 24094..=24095 - | 24098..=24101 - | 24108..=24109 - | 24120..=24121 - | 24128..=24129 - | 24150..=24151 - | 24154..=24155 - | 24158..=24159 - | 24162..=24163 - | 24212..=24215 - | 24220..=24223 - | 24276..=24279 - | 24284..=24287 - | 24340..=24343 - | 24348..=24351 - | 24404..=24407 - | 24412..=24415 - | 24468..=24471 - | 24476..=24479 - | 24532..=24535 - | 24540..=24543 - | 24596..=24599 - | 24604..=24607 - | 24660..=24663 - | 24668..=24671 => &SHAPE64, - 4592..=4593 - | 4596..=4597 - | 4600..=4601 - | 4604..=4605 - | 4622..=4623 - | 4630..=4631 - | 4642..=4643 - | 4650..=4651 - | 4654..=4655 - | 5654..=5655 - | 5658..=5659 - | 5662..=5663 - | 5666..=5667 - | 5684..=5685 - | 5692..=5693 - | 5704..=5705 - | 5712..=5713 - | 5961..=5964 - | 5969..=5972 - | 6025..=6028 - | 6033..=6036 - | 6089..=6092 - | 6097..=6100 - | 6153..=6156 - | 6161..=6164 - | 6217..=6220 - | 6225..=6228 - | 6281..=6284 - | 6289..=6292 - | 6345..=6348 - | 6353..=6356 - | 6409..=6412 - | 6417..=6420 - | 6473..=6476 - | 6481..=6484 - | 10399..=10402 - | 10407..=10410 - | 11824..=11825 - | 11828..=11829 - | 11832..=11833 - | 11836..=11837 - | 11854..=11855 - | 11862..=11863 - | 11874..=11875 - | 11882..=11883 - | 11888..=11889 - | 11892..=11893 - | 11896..=11897 - | 11900..=11901 - | 11918..=11919 - | 11926..=11927 - | 11938..=11939 - | 11946..=11947 - | 11952..=11953 - | 11956..=11957 - | 11960..=11961 - | 11964..=11965 - | 11982..=11983 - | 11990..=11991 - | 12002..=12003 - | 12010..=12011 - | 12016..=12017 - | 12020..=12021 - | 12024..=12025 - | 12028..=12029 - | 12046..=12047 - | 12054..=12055 - | 12066..=12067 - | 12074..=12075 - | 12080..=12081 - | 12084..=12085 - | 12088..=12089 - | 12092..=12093 - | 12110..=12111 - | 12118..=12119 - | 12130..=12131 - | 12138..=12139 - | 12144..=12145 - | 12148..=12149 - | 12152..=12153 - | 12156..=12157 - | 12174..=12175 - | 12182..=12183 - | 12194..=12195 - | 12202..=12203 - | 12208..=12209 - | 12212..=12213 - | 12216..=12217 - | 12220..=12221 - | 12238..=12239 - | 12246..=12247 - | 12258..=12259 - | 12266..=12267 - | 12272..=12273 - | 12276..=12277 - | 12280..=12281 - | 12284..=12285 - | 12302..=12303 - | 12310..=12311 - | 12322..=12323 - | 12330..=12331 - | 18748..=18751 - | 18756..=18759 - | 18812..=18815 - | 18820..=18823 - | 19150..=19151 - | 19154..=19155 - | 19158..=19159 - | 19162..=19163 - | 19180..=19181 - | 19188..=19189 - | 19200..=19201 - | 19208..=19209 - | 19214..=19215 - | 19218..=19219 - | 19222..=19223 - | 19226..=19227 - | 19244..=19245 - | 19252..=19253 - | 19264..=19265 - | 19272..=19273 - | 23654..=23655 - | 23658..=23659 - | 23662..=23663 - | 23666..=23667 - | 23684..=23685 - | 23692..=23693 - | 23704..=23705 - | 23712..=23713 - | 23718..=23719 - | 23722..=23723 - | 23726..=23727 - | 23730..=23731 - | 23748..=23749 - | 23756..=23757 - | 23768..=23769 - | 23776..=23777 - | 23782..=23783 - | 23786..=23787 - | 23790..=23791 - | 23794..=23795 - | 23812..=23813 - | 23820..=23821 - | 23832..=23833 - | 23840..=23841 - | 23846..=23847 - | 23850..=23851 - | 23854..=23855 - | 23858..=23859 - | 23876..=23877 - | 23884..=23885 - | 23896..=23897 - | 23904..=23905 - | 23910..=23911 - | 23914..=23915 - | 23918..=23919 - | 23922..=23923 - | 23940..=23941 - | 23948..=23949 - | 23960..=23961 - | 23968..=23969 - | 23974..=23975 - | 23978..=23979 - | 23982..=23983 - | 23986..=23987 - | 24004..=24005 - | 24012..=24013 - | 24024..=24025 - | 24032..=24033 - | 24038..=24039 - | 24042..=24043 - | 24046..=24047 - | 24050..=24051 - | 24068..=24069 - | 24076..=24077 - | 24088..=24089 - | 24096..=24097 - | 24102..=24103 - | 24106..=24107 - | 24110..=24111 - | 24114..=24115 - | 24132..=24133 - | 24140..=24141 - | 24152..=24153 - | 24160..=24161 - | 24164..=24167 - | 24172..=24175 - | 24228..=24231 - | 24236..=24239 - | 24292..=24295 - | 24300..=24303 - | 24356..=24359 - | 24364..=24367 - | 24420..=24423 - | 24428..=24431 - | 24484..=24487 - | 24492..=24495 - | 24548..=24551 - | 24556..=24559 - | 24612..=24615 - | 24620..=24623 => &SHAPE65, - 4594..=4595 - | 4602..=4603 - | 4606..=4607 - | 4614..=4615 - | 4624..=4625 - | 4628..=4629 - | 4632..=4633 - | 4636..=4637 - | 4658..=4659 - | 5656..=5657 - | 5664..=5665 - | 5668..=5669 - | 5676..=5677 - | 5686..=5687 - | 5690..=5691 - | 5694..=5695 - | 5698..=5699 - | 5993..=5996 - | 6001..=6004 - | 6057..=6060 - | 6065..=6068 - | 6121..=6124 - | 6129..=6132 - | 6185..=6188 - | 6193..=6196 - | 6249..=6252 - | 6257..=6260 - | 6313..=6316 - | 6321..=6324 - | 6377..=6380 - | 6385..=6388 - | 6441..=6444 - | 6449..=6452 - | 6505..=6508 - | 6513..=6516 - | 10431..=10434 - | 10439..=10442 - | 11826..=11827 - | 11834..=11835 - | 11838..=11839 - | 11846..=11847 - | 11856..=11857 - | 11860..=11861 - | 11864..=11865 - | 11868..=11869 - | 11890..=11891 - | 11898..=11899 - | 11902..=11903 - | 11910..=11911 - | 11920..=11921 - | 11924..=11925 - | 11928..=11929 - | 11932..=11933 - | 11954..=11955 - | 11962..=11963 - | 11966..=11967 - | 11974..=11975 - | 11984..=11985 - | 11988..=11989 - | 11992..=11993 - | 11996..=11997 - | 12018..=12019 - | 12026..=12027 - | 12030..=12031 - | 12038..=12039 - | 12048..=12049 - | 12052..=12053 - | 12056..=12057 - | 12060..=12061 - | 12082..=12083 - | 12090..=12091 - | 12094..=12095 - | 12102..=12103 - | 12112..=12113 - | 12116..=12117 - | 12120..=12121 - | 12124..=12125 - | 12146..=12147 - | 12154..=12155 - | 12158..=12159 - | 12166..=12167 - | 12176..=12177 - | 12180..=12181 - | 12184..=12185 - | 12188..=12189 - | 12210..=12211 - | 12218..=12219 - | 12222..=12223 - | 12230..=12231 - | 12240..=12241 - | 12244..=12245 - | 12248..=12249 - | 12252..=12253 - | 12274..=12275 - | 12282..=12283 - | 12286..=12287 - | 12294..=12295 - | 12304..=12305 - | 12308..=12309 - | 12312..=12313 - | 12316..=12317 - | 18780..=18783 - | 18788..=18791 - | 18844..=18847 - | 18852..=18855 - | 19152..=19153 - | 19160..=19161 - | 19164..=19165 - | 19172..=19173 - | 19182..=19183 - | 19186..=19187 - | 19190..=19191 - | 19194..=19195 - | 19216..=19217 - | 19224..=19225 - | 19228..=19229 - | 19236..=19237 - | 19246..=19247 - | 19250..=19251 - | 19254..=19255 - | 19258..=19259 - | 23656..=23657 - | 23664..=23665 - | 23668..=23669 - | 23676..=23677 - | 23686..=23687 - | 23690..=23691 - | 23694..=23695 - | 23698..=23699 - | 23720..=23721 - | 23728..=23729 - | 23732..=23733 - | 23740..=23741 - | 23750..=23751 - | 23754..=23755 - | 23758..=23759 - | 23762..=23763 - | 23784..=23785 - | 23792..=23793 - | 23796..=23797 - | 23804..=23805 - | 23814..=23815 - | 23818..=23819 - | 23822..=23823 - | 23826..=23827 - | 23848..=23849 - | 23856..=23857 - | 23860..=23861 - | 23868..=23869 - | 23878..=23879 - | 23882..=23883 - | 23886..=23887 - | 23890..=23891 - | 23912..=23913 - | 23920..=23921 - | 23924..=23925 - | 23932..=23933 - | 23942..=23943 - | 23946..=23947 - | 23950..=23951 - | 23954..=23955 - | 23976..=23977 - | 23984..=23985 - | 23988..=23989 - | 23996..=23997 - | 24006..=24007 - | 24010..=24011 - | 24014..=24015 - | 24018..=24019 - | 24040..=24041 - | 24048..=24049 - | 24052..=24053 - | 24060..=24061 - | 24070..=24071 - | 24074..=24075 - | 24078..=24079 - | 24082..=24083 - | 24104..=24105 - | 24112..=24113 - | 24116..=24117 - | 24124..=24125 - | 24134..=24135 - | 24138..=24139 - | 24142..=24143 - | 24146..=24147 - | 24196..=24199 - | 24204..=24207 - | 24260..=24263 - | 24268..=24271 - | 24324..=24327 - | 24332..=24335 - | 24388..=24391 - | 24396..=24399 - | 24452..=24455 - | 24460..=24463 - | 24516..=24519 - | 24524..=24527 - | 24580..=24583 - | 24588..=24591 - | 24644..=24647 - | 24652..=24655 => &SHAPE66, - 4608..=4609 - | 4612..=4613 - | 4616..=4617 - | 4620..=4621 - | 4626..=4627 - | 4634..=4635 - | 4638..=4639 - | 4646..=4647 - | 4656..=4657 - | 5670..=5671 - | 5674..=5675 - | 5678..=5679 - | 5682..=5683 - | 5688..=5689 - | 5696..=5697 - | 5700..=5701 - | 5708..=5709 - | 5977..=5980 - | 5985..=5988 - | 6041..=6044 - | 6049..=6052 - | 6105..=6108 - | 6113..=6116 - | 6169..=6172 - | 6177..=6180 - | 6233..=6236 - | 6241..=6244 - | 6297..=6300 - | 6305..=6308 - | 6361..=6364 - | 6369..=6372 - | 6425..=6428 - | 6433..=6436 - | 6489..=6492 - | 6497..=6500 - | 10415..=10418 - | 10423..=10426 - | 11840..=11841 - | 11844..=11845 - | 11848..=11849 - | 11852..=11853 - | 11858..=11859 - | 11866..=11867 - | 11870..=11871 - | 11878..=11879 - | 11904..=11905 - | 11908..=11909 - | 11912..=11913 - | 11916..=11917 - | 11922..=11923 - | 11930..=11931 - | 11934..=11935 - | 11942..=11943 - | 11968..=11969 - | 11972..=11973 - | 11976..=11977 - | 11980..=11981 - | 11986..=11987 - | 11994..=11995 - | 11998..=11999 - | 12006..=12007 - | 12032..=12033 - | 12036..=12037 - | 12040..=12041 - | 12044..=12045 - | 12050..=12051 - | 12058..=12059 - | 12062..=12063 - | 12070..=12071 - | 12096..=12097 - | 12100..=12101 - | 12104..=12105 - | 12108..=12109 - | 12114..=12115 - | 12122..=12123 - | 12126..=12127 - | 12134..=12135 - | 12160..=12161 - | 12164..=12165 - | 12168..=12169 - | 12172..=12173 - | 12178..=12179 - | 12186..=12187 - | 12190..=12191 - | 12198..=12199 - | 12224..=12225 - | 12228..=12229 - | 12232..=12233 - | 12236..=12237 - | 12242..=12243 - | 12250..=12251 - | 12254..=12255 - | 12262..=12263 - | 12288..=12289 - | 12292..=12293 - | 12296..=12297 - | 12300..=12301 - | 12306..=12307 - | 12314..=12315 - | 12318..=12319 - | 12326..=12327 - | 18764..=18767 - | 18772..=18775 - | 18828..=18831 - | 18836..=18839 - | 19166..=19167 - | 19170..=19171 - | 19174..=19175 - | 19178..=19179 - | 19184..=19185 - | 19192..=19193 - | 19196..=19197 - | 19204..=19205 - | 19230..=19231 - | 19234..=19235 - | 19238..=19239 - | 19242..=19243 - | 19248..=19249 - | 19256..=19257 - | 19260..=19261 - | 19268..=19269 - | 23670..=23671 - | 23674..=23675 - | 23678..=23679 - | 23682..=23683 - | 23688..=23689 - | 23696..=23697 - | 23700..=23701 - | 23708..=23709 - | 23734..=23735 - | 23738..=23739 - | 23742..=23743 - | 23746..=23747 - | 23752..=23753 - | 23760..=23761 - | 23764..=23765 - | 23772..=23773 - | 23798..=23799 - | 23802..=23803 - | 23806..=23807 - | 23810..=23811 - | 23816..=23817 - | 23824..=23825 - | 23828..=23829 - | 23836..=23837 - | 23862..=23863 - | 23866..=23867 - | 23870..=23871 - | 23874..=23875 - | 23880..=23881 - | 23888..=23889 - | 23892..=23893 - | 23900..=23901 - | 23926..=23927 - | 23930..=23931 - | 23934..=23935 - | 23938..=23939 - | 23944..=23945 - | 23952..=23953 - | 23956..=23957 - | 23964..=23965 - | 23990..=23991 - | 23994..=23995 - | 23998..=23999 - | 24002..=24003 - | 24008..=24009 - | 24016..=24017 - | 24020..=24021 - | 24028..=24029 - | 24054..=24055 - | 24058..=24059 - | 24062..=24063 - | 24066..=24067 - | 24072..=24073 - | 24080..=24081 - | 24084..=24085 - | 24092..=24093 - | 24118..=24119 - | 24122..=24123 - | 24126..=24127 - | 24130..=24131 - | 24136..=24137 - | 24144..=24145 - | 24148..=24149 - | 24156..=24157 - | 24180..=24183 - | 24188..=24191 - | 24244..=24247 - | 24252..=24255 - | 24308..=24311 - | 24316..=24319 - | 24372..=24375 - | 24380..=24383 - | 24436..=24439 - | 24444..=24447 - | 24500..=24503 - | 24508..=24511 - | 24564..=24567 - | 24572..=24575 - | 24628..=24631 - | 24636..=24639 => &SHAPE67, - 5538..=5541 - | 5546..=5549 - | 5554..=5557 - | 5562..=5565 - | 5570..=5573 - | 5578..=5581 - | 5586..=5589 - | 5594..=5597 - | 5602..=5605 - | 5610..=5613 - | 5618..=5621 => &SHAPE69, - 5542..=5545 - | 5550..=5553 - | 5558..=5561 - | 5566..=5569 - | 5574..=5577 - | 5582..=5585 - | 5590..=5593 - | 5598..=5601 - | 5606..=5609 - | 5614..=5617 - | 5622..=5625 => &SHAPE70, - 5773 | 5881..=5944 | 9175..=9190 => &SHAPE7, - 5774 => &SHAPE58, - 5775 | 9191..=9222 => &SHAPE59, - 5776 - | 10708..=10709 - | 10714..=10715 - | 10720..=10721 - | 11164..=11165 - | 11170..=11171 - | 11176..=11177 - | 11182..=11183 - | 11188..=11189 - | 11194..=11195 - | 11200..=11201 - | 11206..=11207 - | 11212..=11213 - | 11218..=11219 - | 11224..=11225 - | 11230..=11231 - | 11236..=11237 - | 11242..=11243 - | 11248..=11249 - | 11254..=11255 - | 11260..=11261 - | 11266..=11267 - | 11272..=11273 - | 11278..=11279 - | 11284..=11285 - | 11290..=11291 - | 11296..=11297 - | 11302..=11303 - | 14084..=14085 - | 14090..=14091 - | 14096..=14097 - | 14102..=14103 - | 14108..=14109 - | 14114..=14115 - | 14120..=14121 - | 14126..=14127 - | 14132..=14133 - | 14138..=14139 - | 14144..=14145 - | 14150..=14151 - | 14156..=14157 - | 18670..=18671 - | 18676..=18677 - | 19867..=19868 - | 19877..=19878 - | 20368..=20369 - | 21084..=21085 - | 21495..=21496 - | 21907..=21908 - | 22319..=22798 - | 22930..=22937 - | 23278..=23279 - | 23284..=23285 - | 23290..=23291 - | 23296..=23297 - | 23630..=23631 - | 23636..=23637 - | 23642..=23643 - | 23648..=23649 - | 24990..=24991 - | 25401..=25402 - | 25812..=25813 - | 26223..=26224 => &SHAPE8, - 5777 => &SHAPE60, - 5779 | 5850 | 24903 => &SHAPE61, - 5782..=5797 | 19445 => &SHAPE71, - 5817 | 5819 | 7273 | 7275 | 11566 | 11568 | 11598 | 11600 | 11630 | 11632 | 11662 - | 11664 | 11694 | 11696 | 11726 | 11728 | 11758 | 11760 | 11790 | 11792 | 18684 - | 18686 | 18716 | 18718 => &SHAPE74, - 5818 | 5820 | 7274 | 7276 | 11567 | 11569 | 11599 | 11601 | 11631 | 11633 | 11663 - | 11665 | 11695 | 11697 | 11727 | 11729 | 11759 | 11761 | 11791 | 11793 | 18685 - | 18687 | 18717 | 18719 => &SHAPE75, - 5821 | 5823 | 7277 | 7279 | 11570 | 11572 | 11602 | 11604 | 11634 | 11636 | 11666 - | 11668 | 11698 | 11700 | 11730 | 11732 | 11762 | 11764 | 11794 | 11796 | 18688 - | 18690 | 18720 | 18722 => &SHAPE76, - 5822 | 5824 | 7278 | 7280 | 11571 | 11573 | 11603 | 11605 | 11635 | 11637 | 11667 - | 11669 | 11699 | 11701 | 11731 | 11733 | 11763 | 11765 | 11795 | 11797 | 18689 - | 18691 | 18721 | 18723 => &SHAPE77, - 5825 | 5827 | 7281 | 7283 | 11574 | 11576 | 11606 | 11608 | 11638 | 11640 | 11670 - | 11672 | 11702 | 11704 | 11734 | 11736 | 11766 | 11768 | 11798 | 11800 | 18692 - | 18694 | 18724 | 18726 => &SHAPE78, - 5826 | 5828 | 7282 | 7284 | 11575 | 11577 | 11607 | 11609 | 11639 | 11641 | 11671 - | 11673 | 11703 | 11705 | 11735 | 11737 | 11767 | 11769 | 11799 | 11801 | 18693 - | 18695 | 18725 | 18727 => &SHAPE79, - 5829 - | 5831 - | 6999..=7000 - | 7003..=7004 - | 7007..=7008 - | 7011..=7012 - | 7285 - | 7287 - | 11312..=11313 - | 11316..=11317 - | 11320..=11321 - | 11324..=11325 - | 11344..=11345 - | 11348..=11349 - | 11352..=11353 - | 11356..=11357 - | 11376..=11377 - | 11380..=11381 - | 11384..=11385 - | 11388..=11389 - | 11408..=11409 - | 11412..=11413 - | 11416..=11417 - | 11420..=11421 - | 11440..=11441 - | 11444..=11445 - | 11448..=11449 - | 11452..=11453 - | 11472..=11473 - | 11476..=11477 - | 11480..=11481 - | 11484..=11485 - | 11504..=11505 - | 11508..=11509 - | 11512..=11513 - | 11516..=11517 - | 11536..=11537 - | 11540..=11541 - | 11544..=11545 - | 11548..=11549 - | 11578 - | 11580 - | 11610 - | 11612 - | 11642 - | 11644 - | 11674 - | 11676 - | 11706 - | 11708 - | 11738 - | 11740 - | 11770 - | 11772 - | 11802 - | 11804 - | 18696 - | 18698 - | 18728 - | 18730 - | 18878..=18879 - | 18882..=18883 - | 18886..=18887 - | 18890..=18891 - | 18910..=18911 - | 18914..=18915 - | 18918..=18919 - | 18922..=18923 => &SHAPE80, - 5830 | 5832 | 7286 | 7288 | 11579 | 11581 | 11611 | 11613 | 11643 | 11645 | 11675 - | 11677 | 11707 | 11709 | 11739 | 11741 | 11771 | 11773 | 11803 | 11805 | 18697 - | 18699 | 18729 | 18731 => &SHAPE81, - 5833 | 5835 | 7289 | 7291 | 11582 | 11584 | 11614 | 11616 | 11646 | 11648 | 11678 - | 11680 | 11710 | 11712 | 11742 | 11744 | 11774 | 11776 | 11806 | 11808 | 18700 - | 18702 | 18732 | 18734 => &SHAPE82, - 5834 - | 5836 - | 7015..=7016 - | 7019..=7020 - | 7023..=7024 - | 7027..=7028 - | 7290 - | 7292 - | 11328..=11329 - | 11332..=11333 - | 11336..=11337 - | 11340..=11341 - | 11360..=11361 - | 11364..=11365 - | 11368..=11369 - | 11372..=11373 - | 11392..=11393 - | 11396..=11397 - | 11400..=11401 - | 11404..=11405 - | 11424..=11425 - | 11428..=11429 - | 11432..=11433 - | 11436..=11437 - | 11456..=11457 - | 11460..=11461 - | 11464..=11465 - | 11468..=11469 - | 11488..=11489 - | 11492..=11493 - | 11496..=11497 - | 11500..=11501 - | 11520..=11521 - | 11524..=11525 - | 11528..=11529 - | 11532..=11533 - | 11552..=11553 - | 11556..=11557 - | 11560..=11561 - | 11564..=11565 - | 11583 - | 11585 - | 11615 - | 11617 - | 11647 - | 11649 - | 11679 - | 11681 - | 11711 - | 11713 - | 11743 - | 11745 - | 11775 - | 11777 - | 11807 - | 11809 - | 18701 - | 18703 - | 18733 - | 18735 - | 18894..=18895 - | 18898..=18899 - | 18902..=18903 - | 18906..=18907 - | 18926..=18927 - | 18930..=18931 - | 18934..=18935 - | 18938..=18939 => &SHAPE83, - 5837 | 5839 | 7293 | 7295 | 11586 | 11588 | 11618 | 11620 | 11650 | 11652 | 11682 - | 11684 | 11714 | 11716 | 11746 | 11748 | 11778 | 11780 | 11810 | 11812 | 18704 - | 18706 | 18736 | 18738 => &SHAPE84, - 5838 | 5840 | 7294 | 7296 | 11587 | 11589 | 11619 | 11621 | 11651 | 11653 | 11683 - | 11685 | 11715 | 11717 | 11747 | 11749 | 11779 | 11781 | 11811 | 11813 | 18705 - | 18707 | 18737 | 18739 => &SHAPE85, - 5841 | 5843 | 7297 | 7299 | 11590 | 11592 | 11622 | 11624 | 11654 | 11656 | 11686 - | 11688 | 11718 | 11720 | 11750 | 11752 | 11782 | 11784 | 11814 | 11816 | 18708 - | 18710 | 18740 | 18742 => &SHAPE86, - 5842 | 5844 | 7298 | 7300 | 11591 | 11593 | 11623 | 11625 | 11655 | 11657 | 11687 - | 11689 | 11719 | 11721 | 11751 | 11753 | 11783 | 11785 | 11815 | 11817 | 18709 - | 18711 | 18741 | 18743 => &SHAPE87, - 5845 | 5847 | 7301 | 7303 | 11594 | 11596 | 11626 | 11628 | 11658 | 11660 | 11690 - | 11692 | 11722 | 11724 | 11754 | 11756 | 11786 | 11788 | 11818 | 11820 | 18712 - | 18714 | 18744 | 18746 => &SHAPE88, - 5846 | 5848 | 7302 | 7304 | 11595 | 11597 | 11627 | 11629 | 11659 | 11661 | 11691 - | 11693 | 11723 | 11725 | 11755 | 11757 | 11787 | 11789 | 11819 | 11821 | 18713 - | 18715 | 18745 | 18747 => &SHAPE89, - 5874 => &SHAPE91, - 5875 => &SHAPE92, - 5876 => &SHAPE93, - 5877 => &SHAPE94, - 5878 => &SHAPE95, - 5879 => &SHAPE96, - 5880 => &SHAPE97, - 5965..=5968 - | 5981..=5984 - | 5997..=6000 - | 6013..=6016 - | 6029..=6032 - | 6045..=6048 - | 6061..=6064 - | 6077..=6080 - | 6093..=6096 - | 6109..=6112 - | 6125..=6128 - | 6141..=6144 - | 6157..=6160 - | 6173..=6176 - | 6189..=6192 - | 6205..=6208 - | 6221..=6224 - | 6237..=6240 - | 6253..=6256 - | 6269..=6272 - | 6285..=6288 - | 6301..=6304 - | 6317..=6320 - | 6333..=6336 - | 6349..=6352 - | 6365..=6368 - | 6381..=6384 - | 6397..=6400 - | 6413..=6416 - | 6429..=6432 - | 6445..=6448 - | 6461..=6464 - | 6477..=6480 - | 6493..=6496 - | 6509..=6512 - | 6525..=6528 - | 10403..=10406 - | 10419..=10422 - | 10435..=10438 - | 10451..=10454 - | 18752..=18755 - | 18768..=18771 - | 18784..=18787 - | 18800..=18803 - | 18816..=18819 - | 18832..=18835 - | 18848..=18851 - | 18864..=18867 - | 24168..=24171 - | 24184..=24187 - | 24200..=24203 - | 24216..=24219 - | 24232..=24235 - | 24248..=24251 - | 24264..=24267 - | 24280..=24283 - | 24296..=24299 - | 24312..=24315 - | 24328..=24331 - | 24344..=24347 - | 24360..=24363 - | 24376..=24379 - | 24392..=24395 - | 24408..=24411 - | 24424..=24427 - | 24440..=24443 - | 24456..=24459 - | 24472..=24475 - | 24488..=24491 - | 24504..=24507 - | 24520..=24523 - | 24536..=24539 - | 24552..=24555 - | 24568..=24571 - | 24584..=24587 - | 24600..=24603 - | 24616..=24619 - | 24632..=24635 - | 24648..=24651 - | 24664..=24667 => &SHAPE98, - 5973..=5976 - | 5989..=5992 - | 6005..=6008 - | 6021..=6024 - | 6037..=6040 - | 6053..=6056 - | 6069..=6072 - | 6085..=6088 - | 6101..=6104 - | 6117..=6120 - | 6133..=6136 - | 6149..=6152 - | 6165..=6168 - | 6181..=6184 - | 6197..=6200 - | 6213..=6216 - | 6229..=6232 - | 6245..=6248 - | 6261..=6264 - | 6277..=6280 - | 6293..=6296 - | 6309..=6312 - | 6325..=6328 - | 6341..=6344 - | 6357..=6360 - | 6373..=6376 - | 6389..=6392 - | 6405..=6408 - | 6421..=6424 - | 6437..=6440 - | 6453..=6456 - | 6469..=6472 - | 6485..=6488 - | 6501..=6504 - | 6517..=6520 - | 6533..=6536 - | 10411..=10414 - | 10427..=10430 - | 10443..=10446 - | 10459..=10462 - | 18760..=18763 - | 18776..=18779 - | 18792..=18795 - | 18808..=18811 - | 18824..=18827 - | 18840..=18843 - | 18856..=18859 - | 18872..=18875 - | 24176..=24179 - | 24192..=24195 - | 24208..=24211 - | 24224..=24227 - | 24240..=24243 - | 24256..=24259 - | 24272..=24275 - | 24288..=24291 - | 24304..=24307 - | 24320..=24323 - | 24336..=24339 - | 24352..=24355 - | 24368..=24371 - | 24384..=24387 - | 24400..=24403 - | 24416..=24419 - | 24432..=24435 - | 24448..=24451 - | 24464..=24467 - | 24480..=24483 - | 24496..=24499 - | 24512..=24515 - | 24528..=24531 - | 24544..=24547 - | 24560..=24563 - | 24576..=24579 - | 24592..=24595 - | 24608..=24611 - | 24624..=24627 - | 24640..=24643 - | 24656..=24659 - | 24672..=24675 => &SHAPE99, - 6741 | 6743 | 6779 | 6781 | 9372 | 9374 | 9404 | 9406 | 9436 | 9438 | 9468 | 9470 - | 9500 | 9502 | 9532 | 9534 | 9564 | 9566 | 9596 | 9598 | 9628 | 9630 | 9660 | 9662 - | 9692 | 9694 | 9724 | 9726 | 9756 | 9758 | 9788 | 9790 | 9820 | 9822 | 9852 | 9854 => { - &SHAPE100 - } - 6742 | 6744 | 6780 | 6782 | 9373 | 9375 | 9405 | 9407 | 9437 | 9439 | 9469 | 9471 - | 9501 | 9503 | 9533 | 9535 | 9565 | 9567 | 9597 | 9599 | 9629 | 9631 | 9661 | 9663 - | 9693 | 9695 | 9725 | 9727 | 9757 | 9759 | 9789 | 9791 | 9821 | 9823 | 9853 | 9855 => { - &SHAPE101 - } - 6745 | 6747 | 6783 | 6785 | 9376 | 9378 | 9408 | 9410 | 9440 | 9442 | 9472 | 9474 - | 9504 | 9506 | 9536 | 9538 | 9568 | 9570 | 9600 | 9602 | 9632 | 9634 | 9664 | 9666 - | 9696 | 9698 | 9728 | 9730 | 9760 | 9762 | 9792 | 9794 | 9824 | 9826 | 9856 | 9858 => { - &SHAPE102 - } - 6746 | 6748 | 6784 | 6786 | 9377 | 9379 | 9409 | 9411 | 9441 | 9443 | 9473 | 9475 - | 9505 | 9507 | 9537 | 9539 | 9569 | 9571 | 9601 | 9603 | 9633 | 9635 | 9665 | 9667 - | 9697 | 9699 | 9729 | 9731 | 9761 | 9763 | 9793 | 9795 | 9825 | 9827 | 9857 | 9859 => { - &SHAPE103 - } - 6749 | 6751 | 6787 | 6789 | 9380 | 9382 | 9412 | 9414 | 9444 | 9446 | 9476 | 9478 - | 9508 | 9510 | 9540 | 9542 | 9572 | 9574 | 9604 | 9606 | 9636 | 9638 | 9668 | 9670 - | 9700 | 9702 | 9732 | 9734 | 9764 | 9766 | 9796 | 9798 | 9828 | 9830 | 9860 | 9862 => { - &SHAPE104 - } - 6750 | 6752 | 6788 | 6790 | 9381 | 9383 | 9413 | 9415 | 9445 | 9447 | 9477 | 9479 - | 9509 | 9511 | 9541 | 9543 | 9573 | 9575 | 9605 | 9607 | 9637 | 9639 | 9669 | 9671 - | 9701 | 9703 | 9733 | 9735 | 9765 | 9767 | 9797 | 9799 | 9829 | 9831 | 9861 | 9863 => { - &SHAPE105 - } - 6753 | 6755 | 6791 | 6793 | 9384 | 9386 | 9416 | 9418 | 9448 | 9450 | 9480 | 9482 - | 9512 | 9514 | 9544 | 9546 | 9576 | 9578 | 9608 | 9610 | 9640 | 9642 | 9672 | 9674 - | 9704 | 9706 | 9736 | 9738 | 9768 | 9770 | 9800 | 9802 | 9832 | 9834 | 9864 | 9866 => { - &SHAPE106 - } - 6754 | 6756 | 6792 | 6794 | 9385 | 9387 | 9417 | 9419 | 9449 | 9451 | 9481 | 9483 - | 9513 | 9515 | 9545 | 9547 | 9577 | 9579 | 9609 | 9611 | 9641 | 9643 | 9673 | 9675 - | 9705 | 9707 | 9737 | 9739 | 9769 | 9771 | 9801 | 9803 | 9833 | 9835 | 9865 | 9867 => { - &SHAPE107 - } - 6757 | 6759 | 6795 | 6797 | 9388 | 9390 | 9420 | 9422 | 9452 | 9454 | 9484 | 9486 - | 9516 | 9518 | 9548 | 9550 | 9580 | 9582 | 9612 | 9614 | 9644 | 9646 | 9676 | 9678 - | 9708 | 9710 | 9740 | 9742 | 9772 | 9774 | 9804 | 9806 | 9836 | 9838 | 9868 | 9870 => { - &SHAPE108 - } - 6758 | 6760 | 6796 | 6798 | 9389 | 9391 | 9421 | 9423 | 9453 | 9455 | 9485 | 9487 - | 9517 | 9519 | 9549 | 9551 | 9581 | 9583 | 9613 | 9615 | 9645 | 9647 | 9677 | 9679 - | 9709 | 9711 | 9741 | 9743 | 9773 | 9775 | 9805 | 9807 | 9837 | 9839 | 9869 | 9871 => { - &SHAPE109 - } - 6761 | 6763 | 6799 | 6801 | 9392 | 9394 | 9424 | 9426 | 9456 | 9458 | 9488 | 9490 - | 9520 | 9522 | 9552 | 9554 | 9584 | 9586 | 9616 | 9618 | 9648 | 9650 | 9680 | 9682 - | 9712 | 9714 | 9744 | 9746 | 9776 | 9778 | 9808 | 9810 | 9840 | 9842 | 9872 | 9874 => { - &SHAPE110 - } - 6762 | 6764 | 6800 | 6802 | 9393 | 9395 | 9425 | 9427 | 9457 | 9459 | 9489 | 9491 - | 9521 | 9523 | 9553 | 9555 | 9585 | 9587 | 9617 | 9619 | 9649 | 9651 | 9681 | 9683 - | 9713 | 9715 | 9745 | 9747 | 9777 | 9779 | 9809 | 9811 | 9841 | 9843 | 9873 | 9875 => { - &SHAPE111 - } - 6765 | 6767 | 6803 | 6805 | 9396 | 9398 | 9428 | 9430 | 9460 | 9462 | 9492 | 9494 - | 9524 | 9526 | 9556 | 9558 | 9588 | 9590 | 9620 | 9622 | 9652 | 9654 | 9684 | 9686 - | 9716 | 9718 | 9748 | 9750 | 9780 | 9782 | 9812 | 9814 | 9844 | 9846 | 9876 | 9878 => { - &SHAPE112 - } - 6766 | 6768 | 6804 | 6806 | 9397 | 9399 | 9429 | 9431 | 9461 | 9463 | 9493 | 9495 - | 9525 | 9527 | 9557 | 9559 | 9589 | 9591 | 9621 | 9623 | 9653 | 9655 | 9685 | 9687 - | 9717 | 9719 | 9749 | 9751 | 9781 | 9783 | 9813 | 9815 | 9845 | 9847 | 9877 | 9879 => { - &SHAPE113 - } - 6769 | 6771 | 6807 | 6809 | 9400 | 9402 | 9432 | 9434 | 9464 | 9466 | 9496 | 9498 - | 9528 | 9530 | 9560 | 9562 | 9592 | 9594 | 9624 | 9626 | 9656 | 9658 | 9688 | 9690 - | 9720 | 9722 | 9752 | 9754 | 9784 | 9786 | 9816 | 9818 | 9848 | 9850 | 9880 | 9882 => { - &SHAPE114 - } - 6770 | 6772 | 6808 | 6810 | 9401 | 9403 | 9433 | 9435 | 9465 | 9467 | 9497 | 9499 - | 9529 | 9531 | 9561 | 9563 | 9593 | 9595 | 9625 | 9627 | 9657 | 9659 | 9689 | 9691 - | 9721 | 9723 | 9753 | 9755 | 9785 | 9787 | 9817 | 9819 | 9849 | 9851 | 9881 | 9883 => { - &SHAPE2 - } - 6773..=6774 => &SHAPE115, - 6775..=6776 | 12945..=12956 => &SHAPE116, - 6777..=6778 => &SHAPE117, - 7271 => &SHAPE119, - 7390..=7397 => &SHAPE120, - 7398..=7405 => &SHAPE121, - 7407..=7410 => &SHAPE122, - 7411..=7414 => &SHAPE123, - 7416 | 26574..=26589 => &SHAPE72, - 7419 => &SHAPE124, - 7420 => &SHAPE125, - 7421 => &SHAPE126, - 7422 => &SHAPE127, - 7423 => &SHAPE128, - 7424 => &SHAPE129, - 7425 => &SHAPE130, - 7426 => &SHAPE131, - 7427 => &SHAPE132, - 7428 => &SHAPE133, - 7429 => &SHAPE134, - 7430 => &SHAPE135, - 7919 | 7922 | 8243 | 8246 | 14160 | 14163 | 14484 | 14487 | 14808 | 14811 | 15132 - | 15135 | 15456 | 15459 | 15780 | 15783 | 16104 | 16107 | 16428 | 16431 | 16752 - | 16755 | 17076 | 17079 | 17400 | 17403 | 17724 | 17727 | 18048 | 18051 | 19541 - | 19544 | 19961 | 19964 | 20398 | 20401 | 21168 | 21171 | 21579 | 21582 | 21991 - | 21994 | 24994 | 24997 | 25405 | 25408 | 25816 | 25819 | 26227 | 26230 => &SHAPE136, - 7920..=7921 - | 7923..=7924 - | 8244..=8245 - | 8247..=8248 - | 14161..=14162 - | 14164..=14165 - | 14485..=14486 - | 14488..=14489 - | 14809..=14810 - | 14812..=14813 - | 15133..=15134 - | 15136..=15137 - | 15457..=15458 - | 15460..=15461 - | 15781..=15782 - | 15784..=15785 - | 16105..=16106 - | 16108..=16109 - | 16429..=16430 - | 16432..=16433 - | 16753..=16754 - | 16756..=16757 - | 17077..=17078 - | 17080..=17081 - | 17401..=17402 - | 17404..=17405 - | 17725..=17726 - | 17728..=17729 - | 18049..=18050 - | 18052..=18053 - | 19542..=19543 - | 19545..=19546 - | 19962..=19963 - | 19965..=19966 - | 20399..=20400 - | 20402..=20403 - | 21169..=21170 - | 21172..=21173 - | 21580..=21581 - | 21583..=21584 - | 21992..=21993 - | 21995..=21996 - | 24995..=24996 - | 24998..=24999 - | 25406..=25407 - | 25409..=25410 - | 25817..=25818 - | 25820..=25821 - | 26228..=26229 - | 26231..=26232 => &SHAPE137, - 7926..=7927 - | 7929..=7930 - | 8250..=8251 - | 8253..=8254 - | 14167..=14168 - | 14170..=14171 - | 14491..=14492 - | 14494..=14495 - | 14815..=14816 - | 14818..=14819 - | 15139..=15140 - | 15142..=15143 - | 15463..=15464 - | 15466..=15467 - | 15787..=15788 - | 15790..=15791 - | 16111..=16112 - | 16114..=16115 - | 16435..=16436 - | 16438..=16439 - | 16759..=16760 - | 16762..=16763 - | 17083..=17084 - | 17086..=17087 - | 17407..=17408 - | 17410..=17411 - | 17731..=17732 - | 17734..=17735 - | 18055..=18056 - | 18058..=18059 - | 19548..=19549 - | 19551..=19552 - | 19968..=19969 - | 19971..=19972 - | 20405..=20406 - | 20408..=20409 - | 21175..=21176 - | 21178..=21179 - | 21586..=21587 - | 21589..=21590 - | 21998..=21999 - | 22001..=22002 - | 25001..=25002 - | 25004..=25005 - | 25412..=25413 - | 25415..=25416 - | 25823..=25824 - | 25826..=25827 - | 26234..=26235 - | 26237..=26238 => &SHAPE138, - 7931 | 7934 | 7943 | 7946 | 8255 | 8258 | 8267 | 8270 | 14172 | 14175 | 14184 - | 14187 | 14496 | 14499 | 14508 | 14511 | 14820 | 14823 | 14832 | 14835 | 15144 - | 15147 | 15156 | 15159 | 15468 | 15471 | 15480 | 15483 | 15792 | 15795 | 15804 - | 15807 | 16116 | 16119 | 16128 | 16131 | 16440 | 16443 | 16452 | 16455 | 16764 - | 16767 | 16776 | 16779 | 17088 | 17091 | 17100 | 17103 | 17412 | 17415 | 17424 - | 17427 | 17736 | 17739 | 17748 | 17751 | 18060 | 18063 | 18072 | 18075 | 19553 - | 19556 | 19565 | 19568 | 19973 | 19976 | 19985 | 19988 | 20410 | 20413 | 20422 - | 20425 | 21180 | 21183 | 21192 | 21195 | 21591 | 21594 | 21603 | 21606 | 22003 - | 22006 | 22015 | 22018 | 25006 | 25009 | 25018 | 25021 | 25417 | 25420 | 25429 - | 25432 | 25828 | 25831 | 25840 | 25843 | 26239 | 26242 | 26251 | 26254 => &SHAPE139, - 7932..=7933 - | 7935..=7936 - | 7944..=7945 - | 7947..=7948 - | 8256..=8257 - | 8259..=8260 - | 8268..=8269 - | 8271..=8272 - | 14173..=14174 - | 14176..=14177 - | 14185..=14186 - | 14188..=14189 - | 14497..=14498 - | 14500..=14501 - | 14509..=14510 - | 14512..=14513 - | 14821..=14822 - | 14824..=14825 - | 14833..=14834 - | 14836..=14837 - | 15145..=15146 - | 15148..=15149 - | 15157..=15158 - | 15160..=15161 - | 15469..=15470 - | 15472..=15473 - | 15481..=15482 - | 15484..=15485 - | 15793..=15794 - | 15796..=15797 - | 15805..=15806 - | 15808..=15809 - | 16117..=16118 - | 16120..=16121 - | 16129..=16130 - | 16132..=16133 - | 16441..=16442 - | 16444..=16445 - | 16453..=16454 - | 16456..=16457 - | 16765..=16766 - | 16768..=16769 - | 16777..=16778 - | 16780..=16781 - | 17089..=17090 - | 17092..=17093 - | 17101..=17102 - | 17104..=17105 - | 17413..=17414 - | 17416..=17417 - | 17425..=17426 - | 17428..=17429 - | 17737..=17738 - | 17740..=17741 - | 17749..=17750 - | 17752..=17753 - | 18061..=18062 - | 18064..=18065 - | 18073..=18074 - | 18076..=18077 - | 19554..=19555 - | 19557..=19558 - | 19566..=19567 - | 19569..=19570 - | 19974..=19975 - | 19977..=19978 - | 19986..=19987 - | 19989..=19990 - | 20411..=20412 - | 20414..=20415 - | 20423..=20424 - | 20426..=20427 - | 21181..=21182 - | 21184..=21185 - | 21193..=21194 - | 21196..=21197 - | 21592..=21593 - | 21595..=21596 - | 21604..=21605 - | 21607..=21608 - | 22004..=22005 - | 22007..=22008 - | 22016..=22017 - | 22019..=22020 - | 25007..=25008 - | 25010..=25011 - | 25019..=25020 - | 25022..=25023 - | 25418..=25419 - | 25421..=25422 - | 25430..=25431 - | 25433..=25434 - | 25829..=25830 - | 25832..=25833 - | 25841..=25842 - | 25844..=25845 - | 26240..=26241 - | 26243..=26244 - | 26252..=26253 - | 26255..=26256 => &SHAPE140, - 7937 | 7940 | 7949 | 7952 | 8261 | 8264 | 8273 | 8276 | 14178 | 14181 | 14190 - | 14193 | 14502 | 14505 | 14514 | 14517 | 14826 | 14829 | 14838 | 14841 | 15150 - | 15153 | 15162 | 15165 | 15474 | 15477 | 15486 | 15489 | 15798 | 15801 | 15810 - | 15813 | 16122 | 16125 | 16134 | 16137 | 16446 | 16449 | 16458 | 16461 | 16770 - | 16773 | 16782 | 16785 | 17094 | 17097 | 17106 | 17109 | 17418 | 17421 | 17430 - | 17433 | 17742 | 17745 | 17754 | 17757 | 18066 | 18069 | 18078 | 18081 | 19559 - | 19562 | 19571 | 19574 | 19979 | 19982 | 19991 | 19994 | 20416 | 20419 | 20428 - | 20431 | 21186 | 21189 | 21198 | 21201 | 21597 | 21600 | 21609 | 21612 | 22009 - | 22012 | 22021 | 22024 | 25012 | 25015 | 25024 | 25027 | 25423 | 25426 | 25435 - | 25438 | 25834 | 25837 | 25846 | 25849 | 26245 | 26248 | 26257 | 26260 => &SHAPE141, - 7938..=7939 - | 7941..=7942 - | 7950..=7951 - | 7953..=7954 - | 8262..=8263 - | 8265..=8266 - | 8274..=8275 - | 8277..=8278 - | 14179..=14180 - | 14182..=14183 - | 14191..=14192 - | 14194..=14195 - | 14503..=14504 - | 14506..=14507 - | 14515..=14516 - | 14518..=14519 - | 14827..=14828 - | 14830..=14831 - | 14839..=14840 - | 14842..=14843 - | 15151..=15152 - | 15154..=15155 - | 15163..=15164 - | 15166..=15167 - | 15475..=15476 - | 15478..=15479 - | 15487..=15488 - | 15490..=15491 - | 15799..=15800 - | 15802..=15803 - | 15811..=15812 - | 15814..=15815 - | 16123..=16124 - | 16126..=16127 - | 16135..=16136 - | 16138..=16139 - | 16447..=16448 - | 16450..=16451 - | 16459..=16460 - | 16462..=16463 - | 16771..=16772 - | 16774..=16775 - | 16783..=16784 - | 16786..=16787 - | 17095..=17096 - | 17098..=17099 - | 17107..=17108 - | 17110..=17111 - | 17419..=17420 - | 17422..=17423 - | 17431..=17432 - | 17434..=17435 - | 17743..=17744 - | 17746..=17747 - | 17755..=17756 - | 17758..=17759 - | 18067..=18068 - | 18070..=18071 - | 18079..=18080 - | 18082..=18083 - | 19560..=19561 - | 19563..=19564 - | 19572..=19573 - | 19575..=19576 - | 19980..=19981 - | 19983..=19984 - | 19992..=19993 - | 19995..=19996 - | 20417..=20418 - | 20420..=20421 - | 20429..=20430 - | 20432..=20433 - | 21187..=21188 - | 21190..=21191 - | 21199..=21200 - | 21202..=21203 - | 21598..=21599 - | 21601..=21602 - | 21610..=21611 - | 21613..=21614 - | 22010..=22011 - | 22013..=22014 - | 22022..=22023 - | 22025..=22026 - | 25013..=25014 - | 25016..=25017 - | 25025..=25026 - | 25028..=25029 - | 25424..=25425 - | 25427..=25428 - | 25436..=25437 - | 25439..=25440 - | 25835..=25836 - | 25838..=25839 - | 25847..=25848 - | 25850..=25851 - | 26246..=26247 - | 26249..=26250 - | 26258..=26259 - | 26261..=26262 => &SHAPE142, - 7955 | 7958 | 7991 | 7994 | 8279 | 8282 | 8315 | 8318 | 14196 | 14199 | 14232 - | 14235 | 14520 | 14523 | 14556 | 14559 | 14844 | 14847 | 14880 | 14883 | 15168 - | 15171 | 15204 | 15207 | 15492 | 15495 | 15528 | 15531 | 15816 | 15819 | 15852 - | 15855 | 16140 | 16143 | 16176 | 16179 | 16464 | 16467 | 16500 | 16503 | 16788 - | 16791 | 16824 | 16827 | 17112 | 17115 | 17148 | 17151 | 17436 | 17439 | 17472 - | 17475 | 17760 | 17763 | 17796 | 17799 | 18084 | 18087 | 18120 | 18123 | 19577 - | 19580 | 19613 | 19616 | 19997 | 20000 | 20033 | 20036 | 20434 | 20437 | 20470 - | 20473 | 21204 | 21207 | 21240 | 21243 | 21615 | 21618 | 21651 | 21654 | 22027 - | 22030 | 22063 | 22066 | 25030 | 25033 | 25066 | 25069 | 25441 | 25444 | 25477 - | 25480 | 25852 | 25855 | 25888 | 25891 | 26263 | 26266 | 26299 | 26302 => &SHAPE143, - 7956..=7957 - | 7959..=7960 - | 7992..=7993 - | 7995..=7996 - | 8280..=8281 - | 8283..=8284 - | 8316..=8317 - | 8319..=8320 - | 14197..=14198 - | 14200..=14201 - | 14233..=14234 - | 14236..=14237 - | 14521..=14522 - | 14524..=14525 - | 14557..=14558 - | 14560..=14561 - | 14845..=14846 - | 14848..=14849 - | 14881..=14882 - | 14884..=14885 - | 15169..=15170 - | 15172..=15173 - | 15205..=15206 - | 15208..=15209 - | 15493..=15494 - | 15496..=15497 - | 15529..=15530 - | 15532..=15533 - | 15817..=15818 - | 15820..=15821 - | 15853..=15854 - | 15856..=15857 - | 16141..=16142 - | 16144..=16145 - | 16177..=16178 - | 16180..=16181 - | 16465..=16466 - | 16468..=16469 - | 16501..=16502 - | 16504..=16505 - | 16789..=16790 - | 16792..=16793 - | 16825..=16826 - | 16828..=16829 - | 17113..=17114 - | 17116..=17117 - | 17149..=17150 - | 17152..=17153 - | 17437..=17438 - | 17440..=17441 - | 17473..=17474 - | 17476..=17477 - | 17761..=17762 - | 17764..=17765 - | 17797..=17798 - | 17800..=17801 - | 18085..=18086 - | 18088..=18089 - | 18121..=18122 - | 18124..=18125 - | 19578..=19579 - | 19581..=19582 - | 19614..=19615 - | 19617..=19618 - | 19998..=19999 - | 20001..=20002 - | 20034..=20035 - | 20037..=20038 - | 20435..=20436 - | 20438..=20439 - | 20471..=20472 - | 20474..=20475 - | 21205..=21206 - | 21208..=21209 - | 21241..=21242 - | 21244..=21245 - | 21616..=21617 - | 21619..=21620 - | 21652..=21653 - | 21655..=21656 - | 22028..=22029 - | 22031..=22032 - | 22064..=22065 - | 22067..=22068 - | 25031..=25032 - | 25034..=25035 - | 25067..=25068 - | 25070..=25071 - | 25442..=25443 - | 25445..=25446 - | 25478..=25479 - | 25481..=25482 - | 25853..=25854 - | 25856..=25857 - | 25889..=25890 - | 25892..=25893 - | 26264..=26265 - | 26267..=26268 - | 26300..=26301 - | 26303..=26304 => &SHAPE144, - 7961 | 7964 | 7997 | 8000 | 8285 | 8288 | 8321 | 8324 | 14202 | 14205 | 14238 - | 14241 | 14526 | 14529 | 14562 | 14565 | 14850 | 14853 | 14886 | 14889 | 15174 - | 15177 | 15210 | 15213 | 15498 | 15501 | 15534 | 15537 | 15822 | 15825 | 15858 - | 15861 | 16146 | 16149 | 16182 | 16185 | 16470 | 16473 | 16506 | 16509 | 16794 - | 16797 | 16830 | 16833 | 17118 | 17121 | 17154 | 17157 | 17442 | 17445 | 17478 - | 17481 | 17766 | 17769 | 17802 | 17805 | 18090 | 18093 | 18126 | 18129 | 19583 - | 19586 | 19619 | 19622 | 20003 | 20006 | 20039 | 20042 | 20440 | 20443 | 20476 - | 20479 | 21210 | 21213 | 21246 | 21249 | 21621 | 21624 | 21657 | 21660 | 22033 - | 22036 | 22069 | 22072 | 25036 | 25039 | 25072 | 25075 | 25447 | 25450 | 25483 - | 25486 | 25858 | 25861 | 25894 | 25897 | 26269 | 26272 | 26305 | 26308 => &SHAPE145, - 7962..=7963 - | 7965..=7966 - | 7998..=7999 - | 8001..=8002 - | 8286..=8287 - | 8289..=8290 - | 8322..=8323 - | 8325..=8326 - | 14203..=14204 - | 14206..=14207 - | 14239..=14240 - | 14242..=14243 - | 14527..=14528 - | 14530..=14531 - | 14563..=14564 - | 14566..=14567 - | 14851..=14852 - | 14854..=14855 - | 14887..=14888 - | 14890..=14891 - | 15175..=15176 - | 15178..=15179 - | 15211..=15212 - | 15214..=15215 - | 15499..=15500 - | 15502..=15503 - | 15535..=15536 - | 15538..=15539 - | 15823..=15824 - | 15826..=15827 - | 15859..=15860 - | 15862..=15863 - | 16147..=16148 - | 16150..=16151 - | 16183..=16184 - | 16186..=16187 - | 16471..=16472 - | 16474..=16475 - | 16507..=16508 - | 16510..=16511 - | 16795..=16796 - | 16798..=16799 - | 16831..=16832 - | 16834..=16835 - | 17119..=17120 - | 17122..=17123 - | 17155..=17156 - | 17158..=17159 - | 17443..=17444 - | 17446..=17447 - | 17479..=17480 - | 17482..=17483 - | 17767..=17768 - | 17770..=17771 - | 17803..=17804 - | 17806..=17807 - | 18091..=18092 - | 18094..=18095 - | 18127..=18128 - | 18130..=18131 - | 19584..=19585 - | 19587..=19588 - | 19620..=19621 - | 19623..=19624 - | 20004..=20005 - | 20007..=20008 - | 20040..=20041 - | 20043..=20044 - | 20441..=20442 - | 20444..=20445 - | 20477..=20478 - | 20480..=20481 - | 21211..=21212 - | 21214..=21215 - | 21247..=21248 - | 21250..=21251 - | 21622..=21623 - | 21625..=21626 - | 21658..=21659 - | 21661..=21662 - | 22034..=22035 - | 22037..=22038 - | 22070..=22071 - | 22073..=22074 - | 25037..=25038 - | 25040..=25041 - | 25073..=25074 - | 25076..=25077 - | 25448..=25449 - | 25451..=25452 - | 25484..=25485 - | 25487..=25488 - | 25859..=25860 - | 25862..=25863 - | 25895..=25896 - | 25898..=25899 - | 26270..=26271 - | 26273..=26274 - | 26306..=26307 - | 26309..=26310 => &SHAPE146, - 7967 | 7970 | 7979 | 7982 | 8003 | 8006 | 8015 | 8018 | 8291 | 8294 | 8303 | 8306 - | 8327 | 8330 | 8339 | 8342 | 14208 | 14211 | 14220 | 14223 | 14244 | 14247 | 14256 - | 14259 | 14532 | 14535 | 14544 | 14547 | 14568 | 14571 | 14580 | 14583 | 14856 - | 14859 | 14868 | 14871 | 14892 | 14895 | 14904 | 14907 | 15180 | 15183 | 15192 - | 15195 | 15216 | 15219 | 15228 | 15231 | 15504 | 15507 | 15516 | 15519 | 15540 - | 15543 | 15552 | 15555 | 15828 | 15831 | 15840 | 15843 | 15864 | 15867 | 15876 - | 15879 | 16152 | 16155 | 16164 | 16167 | 16188 | 16191 | 16200 | 16203 | 16476 - | 16479 | 16488 | 16491 | 16512 | 16515 | 16524 | 16527 | 16800 | 16803 | 16812 - | 16815 | 16836 | 16839 | 16848 | 16851 | 17124 | 17127 | 17136 | 17139 | 17160 - | 17163 | 17172 | 17175 | 17448 | 17451 | 17460 | 17463 | 17484 | 17487 | 17496 - | 17499 | 17772 | 17775 | 17784 | 17787 | 17808 | 17811 | 17820 | 17823 | 18096 - | 18099 | 18108 | 18111 | 18132 | 18135 | 18144 | 18147 | 19589 | 19592 | 19601 - | 19604 | 19625 | 19628 | 19637 | 19640 | 20009 | 20012 | 20021 | 20024 | 20045 - | 20048 | 20057 | 20060 | 20446 | 20449 | 20458 | 20461 | 20482 | 20485 | 20494 - | 20497 | 21216 | 21219 | 21228 | 21231 | 21252 | 21255 | 21264 | 21267 | 21627 - | 21630 | 21639 | 21642 | 21663 | 21666 | 21675 | 21678 | 22039 | 22042 | 22051 - | 22054 | 22075 | 22078 | 22087 | 22090 | 25042 | 25045 | 25054 | 25057 | 25078 - | 25081 | 25090 | 25093 | 25453 | 25456 | 25465 | 25468 | 25489 | 25492 | 25501 - | 25504 | 25864 | 25867 | 25876 | 25879 | 25900 | 25903 | 25912 | 25915 | 26275 - | 26278 | 26287 | 26290 | 26311 | 26314 | 26323 | 26326 => &SHAPE147, - 7968..=7969 - | 7971..=7972 - | 7980..=7981 - | 7983..=7984 - | 8004..=8005 - | 8007..=8008 - | 8016..=8017 - | 8019..=8020 - | 8292..=8293 - | 8295..=8296 - | 8304..=8305 - | 8307..=8308 - | 8328..=8329 - | 8331..=8332 - | 8340..=8341 - | 8343..=8344 - | 14209..=14210 - | 14212..=14213 - | 14221..=14222 - | 14224..=14225 - | 14245..=14246 - | 14248..=14249 - | 14257..=14258 - | 14260..=14261 - | 14533..=14534 - | 14536..=14537 - | 14545..=14546 - | 14548..=14549 - | 14569..=14570 - | 14572..=14573 - | 14581..=14582 - | 14584..=14585 - | 14857..=14858 - | 14860..=14861 - | 14869..=14870 - | 14872..=14873 - | 14893..=14894 - | 14896..=14897 - | 14905..=14906 - | 14908..=14909 - | 15181..=15182 - | 15184..=15185 - | 15193..=15194 - | 15196..=15197 - | 15217..=15218 - | 15220..=15221 - | 15229..=15230 - | 15232..=15233 - | 15505..=15506 - | 15508..=15509 - | 15517..=15518 - | 15520..=15521 - | 15541..=15542 - | 15544..=15545 - | 15553..=15554 - | 15556..=15557 - | 15829..=15830 - | 15832..=15833 - | 15841..=15842 - | 15844..=15845 - | 15865..=15866 - | 15868..=15869 - | 15877..=15878 - | 15880..=15881 - | 16153..=16154 - | 16156..=16157 - | 16165..=16166 - | 16168..=16169 - | 16189..=16190 - | 16192..=16193 - | 16201..=16202 - | 16204..=16205 - | 16477..=16478 - | 16480..=16481 - | 16489..=16490 - | 16492..=16493 - | 16513..=16514 - | 16516..=16517 - | 16525..=16526 - | 16528..=16529 - | 16801..=16802 - | 16804..=16805 - | 16813..=16814 - | 16816..=16817 - | 16837..=16838 - | 16840..=16841 - | 16849..=16850 - | 16852..=16853 - | 17125..=17126 - | 17128..=17129 - | 17137..=17138 - | 17140..=17141 - | 17161..=17162 - | 17164..=17165 - | 17173..=17174 - | 17176..=17177 - | 17449..=17450 - | 17452..=17453 - | 17461..=17462 - | 17464..=17465 - | 17485..=17486 - | 17488..=17489 - | 17497..=17498 - | 17500..=17501 - | 17773..=17774 - | 17776..=17777 - | 17785..=17786 - | 17788..=17789 - | 17809..=17810 - | 17812..=17813 - | 17821..=17822 - | 17824..=17825 - | 18097..=18098 - | 18100..=18101 - | 18109..=18110 - | 18112..=18113 - | 18133..=18134 - | 18136..=18137 - | 18145..=18146 - | 18148..=18149 - | 19590..=19591 - | 19593..=19594 - | 19602..=19603 - | 19605..=19606 - | 19626..=19627 - | 19629..=19630 - | 19638..=19639 - | 19641..=19642 - | 20010..=20011 - | 20013..=20014 - | 20022..=20023 - | 20025..=20026 - | 20046..=20047 - | 20049..=20050 - | 20058..=20059 - | 20061..=20062 - | 20447..=20448 - | 20450..=20451 - | 20459..=20460 - | 20462..=20463 - | 20483..=20484 - | 20486..=20487 - | 20495..=20496 - | 20498..=20499 - | 21217..=21218 - | 21220..=21221 - | 21229..=21230 - | 21232..=21233 - | 21253..=21254 - | 21256..=21257 - | 21265..=21266 - | 21268..=21269 - | 21628..=21629 - | 21631..=21632 - | 21640..=21641 - | 21643..=21644 - | 21664..=21665 - | 21667..=21668 - | 21676..=21677 - | 21679..=21680 - | 22040..=22041 - | 22043..=22044 - | 22052..=22053 - | 22055..=22056 - | 22076..=22077 - | 22079..=22080 - | 22088..=22089 - | 22091..=22092 - | 25043..=25044 - | 25046..=25047 - | 25055..=25056 - | 25058..=25059 - | 25079..=25080 - | 25082..=25083 - | 25091..=25092 - | 25094..=25095 - | 25454..=25455 - | 25457..=25458 - | 25466..=25467 - | 25469..=25470 - | 25490..=25491 - | 25493..=25494 - | 25502..=25503 - | 25505..=25506 - | 25865..=25866 - | 25868..=25869 - | 25877..=25878 - | 25880..=25881 - | 25901..=25902 - | 25904..=25905 - | 25913..=25914 - | 25916..=25917 - | 26276..=26277 - | 26279..=26280 - | 26288..=26289 - | 26291..=26292 - | 26312..=26313 - | 26315..=26316 - | 26324..=26325 - | 26327..=26328 => &SHAPE148, - 7973 | 7976 | 7985 | 7988 | 8009 | 8012 | 8021 | 8024 | 8297 | 8300 | 8309 | 8312 - | 8333 | 8336 | 8345 | 8348 | 14214 | 14217 | 14226 | 14229 | 14250 | 14253 | 14262 - | 14265 | 14538 | 14541 | 14550 | 14553 | 14574 | 14577 | 14586 | 14589 | 14862 - | 14865 | 14874 | 14877 | 14898 | 14901 | 14910 | 14913 | 15186 | 15189 | 15198 - | 15201 | 15222 | 15225 | 15234 | 15237 | 15510 | 15513 | 15522 | 15525 | 15546 - | 15549 | 15558 | 15561 | 15834 | 15837 | 15846 | 15849 | 15870 | 15873 | 15882 - | 15885 | 16158 | 16161 | 16170 | 16173 | 16194 | 16197 | 16206 | 16209 | 16482 - | 16485 | 16494 | 16497 | 16518 | 16521 | 16530 | 16533 | 16806 | 16809 | 16818 - | 16821 | 16842 | 16845 | 16854 | 16857 | 17130 | 17133 | 17142 | 17145 | 17166 - | 17169 | 17178 | 17181 | 17454 | 17457 | 17466 | 17469 | 17490 | 17493 | 17502 - | 17505 | 17778 | 17781 | 17790 | 17793 | 17814 | 17817 | 17826 | 17829 | 18102 - | 18105 | 18114 | 18117 | 18138 | 18141 | 18150 | 18153 | 19595 | 19598 | 19607 - | 19610 | 19631 | 19634 | 19643 | 19646 | 20015 | 20018 | 20027 | 20030 | 20051 - | 20054 | 20063 | 20066 | 20452 | 20455 | 20464 | 20467 | 20488 | 20491 | 20500 - | 20503 | 21222 | 21225 | 21234 | 21237 | 21258 | 21261 | 21270 | 21273 | 21633 - | 21636 | 21645 | 21648 | 21669 | 21672 | 21681 | 21684 | 22045 | 22048 | 22057 - | 22060 | 22081 | 22084 | 22093 | 22096 | 25048 | 25051 | 25060 | 25063 | 25084 - | 25087 | 25096 | 25099 | 25459 | 25462 | 25471 | 25474 | 25495 | 25498 | 25507 - | 25510 | 25870 | 25873 | 25882 | 25885 | 25906 | 25909 | 25918 | 25921 | 26281 - | 26284 | 26293 | 26296 | 26317 | 26320 | 26329 | 26332 => &SHAPE149, - 7974..=7975 - | 7977..=7978 - | 7986..=7987 - | 7989..=7990 - | 8010..=8011 - | 8013..=8014 - | 8022..=8023 - | 8025..=8026 - | 8298..=8299 - | 8301..=8302 - | 8310..=8311 - | 8313..=8314 - | 8334..=8335 - | 8337..=8338 - | 8346..=8347 - | 8349..=8350 - | 14215..=14216 - | 14218..=14219 - | 14227..=14228 - | 14230..=14231 - | 14251..=14252 - | 14254..=14255 - | 14263..=14264 - | 14266..=14267 - | 14539..=14540 - | 14542..=14543 - | 14551..=14552 - | 14554..=14555 - | 14575..=14576 - | 14578..=14579 - | 14587..=14588 - | 14590..=14591 - | 14863..=14864 - | 14866..=14867 - | 14875..=14876 - | 14878..=14879 - | 14899..=14900 - | 14902..=14903 - | 14911..=14912 - | 14914..=14915 - | 15187..=15188 - | 15190..=15191 - | 15199..=15200 - | 15202..=15203 - | 15223..=15224 - | 15226..=15227 - | 15235..=15236 - | 15238..=15239 - | 15511..=15512 - | 15514..=15515 - | 15523..=15524 - | 15526..=15527 - | 15547..=15548 - | 15550..=15551 - | 15559..=15560 - | 15562..=15563 - | 15835..=15836 - | 15838..=15839 - | 15847..=15848 - | 15850..=15851 - | 15871..=15872 - | 15874..=15875 - | 15883..=15884 - | 15886..=15887 - | 16159..=16160 - | 16162..=16163 - | 16171..=16172 - | 16174..=16175 - | 16195..=16196 - | 16198..=16199 - | 16207..=16208 - | 16210..=16211 - | 16483..=16484 - | 16486..=16487 - | 16495..=16496 - | 16498..=16499 - | 16519..=16520 - | 16522..=16523 - | 16531..=16532 - | 16534..=16535 - | 16807..=16808 - | 16810..=16811 - | 16819..=16820 - | 16822..=16823 - | 16843..=16844 - | 16846..=16847 - | 16855..=16856 - | 16858..=16859 - | 17131..=17132 - | 17134..=17135 - | 17143..=17144 - | 17146..=17147 - | 17167..=17168 - | 17170..=17171 - | 17179..=17180 - | 17182..=17183 - | 17455..=17456 - | 17458..=17459 - | 17467..=17468 - | 17470..=17471 - | 17491..=17492 - | 17494..=17495 - | 17503..=17504 - | 17506..=17507 - | 17779..=17780 - | 17782..=17783 - | 17791..=17792 - | 17794..=17795 - | 17815..=17816 - | 17818..=17819 - | 17827..=17828 - | 17830..=17831 - | 18103..=18104 - | 18106..=18107 - | 18115..=18116 - | 18118..=18119 - | 18139..=18140 - | 18142..=18143 - | 18151..=18152 - | 18154..=18155 - | 19596..=19597 - | 19599..=19600 - | 19608..=19609 - | 19611..=19612 - | 19632..=19633 - | 19635..=19636 - | 19644..=19645 - | 19647..=19648 - | 20016..=20017 - | 20019..=20020 - | 20028..=20029 - | 20031..=20032 - | 20052..=20053 - | 20055..=20056 - | 20064..=20065 - | 20067..=20068 - | 20453..=20454 - | 20456..=20457 - | 20465..=20466 - | 20468..=20469 - | 20489..=20490 - | 20492..=20493 - | 20501..=20502 - | 20504..=20505 - | 21223..=21224 - | 21226..=21227 - | 21235..=21236 - | 21238..=21239 - | 21259..=21260 - | 21262..=21263 - | 21271..=21272 - | 21274..=21275 - | 21634..=21635 - | 21637..=21638 - | 21646..=21647 - | 21649..=21650 - | 21670..=21671 - | 21673..=21674 - | 21682..=21683 - | 21685..=21686 - | 22046..=22047 - | 22049..=22050 - | 22058..=22059 - | 22061..=22062 - | 22082..=22083 - | 22085..=22086 - | 22094..=22095 - | 22097..=22098 - | 25049..=25050 - | 25052..=25053 - | 25061..=25062 - | 25064..=25065 - | 25085..=25086 - | 25088..=25089 - | 25097..=25098 - | 25100..=25101 - | 25460..=25461 - | 25463..=25464 - | 25472..=25473 - | 25475..=25476 - | 25496..=25497 - | 25499..=25500 - | 25508..=25509 - | 25511..=25512 - | 25871..=25872 - | 25874..=25875 - | 25883..=25884 - | 25886..=25887 - | 25907..=25908 - | 25910..=25911 - | 25919..=25920 - | 25922..=25923 - | 26282..=26283 - | 26285..=26286 - | 26294..=26295 - | 26297..=26298 - | 26318..=26319 - | 26321..=26322 - | 26330..=26331 - | 26333..=26334 => &SHAPE150, - 8027 | 8030 | 8135 | 8138 | 8351 | 8354 | 8459 | 8462 | 14268 | 14271 | 14376 - | 14379 | 14592 | 14595 | 14700 | 14703 | 14916 | 14919 | 15024 | 15027 | 15240 - | 15243 | 15348 | 15351 | 15564 | 15567 | 15672 | 15675 | 15888 | 15891 | 15996 - | 15999 | 16212 | 16215 | 16320 | 16323 | 16536 | 16539 | 16644 | 16647 | 16860 - | 16863 | 16968 | 16971 | 17184 | 17187 | 17292 | 17295 | 17508 | 17511 | 17616 - | 17619 | 17832 | 17835 | 17940 | 17943 | 18156 | 18159 | 18264 | 18267 | 19649 - | 19652 | 19757 | 19760 | 20069 | 20072 | 20177 | 20180 | 20506 | 20509 | 20614 - | 20617 | 21276 | 21279 | 21384 | 21387 | 21687 | 21690 | 21795 | 21798 | 22099 - | 22102 | 22207 | 22210 | 25102 | 25105 | 25210 | 25213 | 25513 | 25516 | 25621 - | 25624 | 25924 | 25927 | 26032 | 26035 | 26335 | 26338 | 26443 | 26446 => &SHAPE151, - 8028..=8029 - | 8031..=8032 - | 8136..=8137 - | 8139..=8140 - | 8352..=8353 - | 8355..=8356 - | 8460..=8461 - | 8463..=8464 - | 14269..=14270 - | 14272..=14273 - | 14377..=14378 - | 14380..=14381 - | 14593..=14594 - | 14596..=14597 - | 14701..=14702 - | 14704..=14705 - | 14917..=14918 - | 14920..=14921 - | 15025..=15026 - | 15028..=15029 - | 15241..=15242 - | 15244..=15245 - | 15349..=15350 - | 15352..=15353 - | 15565..=15566 - | 15568..=15569 - | 15673..=15674 - | 15676..=15677 - | 15889..=15890 - | 15892..=15893 - | 15997..=15998 - | 16000..=16001 - | 16213..=16214 - | 16216..=16217 - | 16321..=16322 - | 16324..=16325 - | 16537..=16538 - | 16540..=16541 - | 16645..=16646 - | 16648..=16649 - | 16861..=16862 - | 16864..=16865 - | 16969..=16970 - | 16972..=16973 - | 17185..=17186 - | 17188..=17189 - | 17293..=17294 - | 17296..=17297 - | 17509..=17510 - | 17512..=17513 - | 17617..=17618 - | 17620..=17621 - | 17833..=17834 - | 17836..=17837 - | 17941..=17942 - | 17944..=17945 - | 18157..=18158 - | 18160..=18161 - | 18265..=18266 - | 18268..=18269 - | 19650..=19651 - | 19653..=19654 - | 19758..=19759 - | 19761..=19762 - | 20070..=20071 - | 20073..=20074 - | 20178..=20179 - | 20181..=20182 - | 20507..=20508 - | 20510..=20511 - | 20615..=20616 - | 20618..=20619 - | 21277..=21278 - | 21280..=21281 - | 21385..=21386 - | 21388..=21389 - | 21688..=21689 - | 21691..=21692 - | 21796..=21797 - | 21799..=21800 - | 22100..=22101 - | 22103..=22104 - | 22208..=22209 - | 22211..=22212 - | 25103..=25104 - | 25106..=25107 - | 25211..=25212 - | 25214..=25215 - | 25514..=25515 - | 25517..=25518 - | 25622..=25623 - | 25625..=25626 - | 25925..=25926 - | 25928..=25929 - | 26033..=26034 - | 26036..=26037 - | 26336..=26337 - | 26339..=26340 - | 26444..=26445 - | 26447..=26448 => &SHAPE152, - 8033 | 8036 | 8141 | 8144 | 8357 | 8360 | 8465 | 8468 | 14274 | 14277 | 14382 - | 14385 | 14598 | 14601 | 14706 | 14709 | 14922 | 14925 | 15030 | 15033 | 15246 - | 15249 | 15354 | 15357 | 15570 | 15573 | 15678 | 15681 | 15894 | 15897 | 16002 - | 16005 | 16218 | 16221 | 16326 | 16329 | 16542 | 16545 | 16650 | 16653 | 16866 - | 16869 | 16974 | 16977 | 17190 | 17193 | 17298 | 17301 | 17514 | 17517 | 17622 - | 17625 | 17838 | 17841 | 17946 | 17949 | 18162 | 18165 | 18270 | 18273 | 19655 - | 19658 | 19763 | 19766 | 20075 | 20078 | 20183 | 20186 | 20512 | 20515 | 20620 - | 20623 | 21282 | 21285 | 21390 | 21393 | 21693 | 21696 | 21801 | 21804 | 22105 - | 22108 | 22213 | 22216 | 25108 | 25111 | 25216 | 25219 | 25519 | 25522 | 25627 - | 25630 | 25930 | 25933 | 26038 | 26041 | 26341 | 26344 | 26449 | 26452 => &SHAPE153, - 8034..=8035 - | 8037..=8038 - | 8142..=8143 - | 8145..=8146 - | 8358..=8359 - | 8361..=8362 - | 8466..=8467 - | 8469..=8470 - | 14275..=14276 - | 14278..=14279 - | 14383..=14384 - | 14386..=14387 - | 14599..=14600 - | 14602..=14603 - | 14707..=14708 - | 14710..=14711 - | 14923..=14924 - | 14926..=14927 - | 15031..=15032 - | 15034..=15035 - | 15247..=15248 - | 15250..=15251 - | 15355..=15356 - | 15358..=15359 - | 15571..=15572 - | 15574..=15575 - | 15679..=15680 - | 15682..=15683 - | 15895..=15896 - | 15898..=15899 - | 16003..=16004 - | 16006..=16007 - | 16219..=16220 - | 16222..=16223 - | 16327..=16328 - | 16330..=16331 - | 16543..=16544 - | 16546..=16547 - | 16651..=16652 - | 16654..=16655 - | 16867..=16868 - | 16870..=16871 - | 16975..=16976 - | 16978..=16979 - | 17191..=17192 - | 17194..=17195 - | 17299..=17300 - | 17302..=17303 - | 17515..=17516 - | 17518..=17519 - | 17623..=17624 - | 17626..=17627 - | 17839..=17840 - | 17842..=17843 - | 17947..=17948 - | 17950..=17951 - | 18163..=18164 - | 18166..=18167 - | 18271..=18272 - | 18274..=18275 - | 19656..=19657 - | 19659..=19660 - | 19764..=19765 - | 19767..=19768 - | 20076..=20077 - | 20079..=20080 - | 20184..=20185 - | 20187..=20188 - | 20513..=20514 - | 20516..=20517 - | 20621..=20622 - | 20624..=20625 - | 21283..=21284 - | 21286..=21287 - | 21391..=21392 - | 21394..=21395 - | 21694..=21695 - | 21697..=21698 - | 21802..=21803 - | 21805..=21806 - | 22106..=22107 - | 22109..=22110 - | 22214..=22215 - | 22217..=22218 - | 25109..=25110 - | 25112..=25113 - | 25217..=25218 - | 25220..=25221 - | 25520..=25521 - | 25523..=25524 - | 25628..=25629 - | 25631..=25632 - | 25931..=25932 - | 25934..=25935 - | 26039..=26040 - | 26042..=26043 - | 26342..=26343 - | 26345..=26346 - | 26450..=26451 - | 26453..=26454 => &SHAPE154, - 8039 | 8042 | 8051 | 8054 | 8147 | 8150 | 8159 | 8162 | 8363 | 8366 | 8375 | 8378 - | 8471 | 8474 | 8483 | 8486 | 14280 | 14283 | 14292 | 14295 | 14388 | 14391 | 14400 - | 14403 | 14604 | 14607 | 14616 | 14619 | 14712 | 14715 | 14724 | 14727 | 14928 - | 14931 | 14940 | 14943 | 15036 | 15039 | 15048 | 15051 | 15252 | 15255 | 15264 - | 15267 | 15360 | 15363 | 15372 | 15375 | 15576 | 15579 | 15588 | 15591 | 15684 - | 15687 | 15696 | 15699 | 15900 | 15903 | 15912 | 15915 | 16008 | 16011 | 16020 - | 16023 | 16224 | 16227 | 16236 | 16239 | 16332 | 16335 | 16344 | 16347 | 16548 - | 16551 | 16560 | 16563 | 16656 | 16659 | 16668 | 16671 | 16872 | 16875 | 16884 - | 16887 | 16980 | 16983 | 16992 | 16995 | 17196 | 17199 | 17208 | 17211 | 17304 - | 17307 | 17316 | 17319 | 17520 | 17523 | 17532 | 17535 | 17628 | 17631 | 17640 - | 17643 | 17844 | 17847 | 17856 | 17859 | 17952 | 17955 | 17964 | 17967 | 18168 - | 18171 | 18180 | 18183 | 18276 | 18279 | 18288 | 18291 | 19661 | 19664 | 19673 - | 19676 | 19769 | 19772 | 19781 | 19784 | 20081 | 20084 | 20093 | 20096 | 20189 - | 20192 | 20201 | 20204 | 20518 | 20521 | 20530 | 20533 | 20626 | 20629 | 20638 - | 20641 | 21288 | 21291 | 21300 | 21303 | 21396 | 21399 | 21408 | 21411 | 21699 - | 21702 | 21711 | 21714 | 21807 | 21810 | 21819 | 21822 | 22111 | 22114 | 22123 - | 22126 | 22219 | 22222 | 22231 | 22234 | 25114 | 25117 | 25126 | 25129 | 25222 - | 25225 | 25234 | 25237 | 25525 | 25528 | 25537 | 25540 | 25633 | 25636 | 25645 - | 25648 | 25936 | 25939 | 25948 | 25951 | 26044 | 26047 | 26056 | 26059 | 26347 - | 26350 | 26359 | 26362 | 26455 | 26458 | 26467 | 26470 => &SHAPE155, - 8040..=8041 - | 8043..=8044 - | 8052..=8053 - | 8055..=8056 - | 8148..=8149 - | 8151..=8152 - | 8160..=8161 - | 8163..=8164 - | 8364..=8365 - | 8367..=8368 - | 8376..=8377 - | 8379..=8380 - | 8472..=8473 - | 8475..=8476 - | 8484..=8485 - | 8487..=8488 - | 14281..=14282 - | 14284..=14285 - | 14293..=14294 - | 14296..=14297 - | 14389..=14390 - | 14392..=14393 - | 14401..=14402 - | 14404..=14405 - | 14605..=14606 - | 14608..=14609 - | 14617..=14618 - | 14620..=14621 - | 14713..=14714 - | 14716..=14717 - | 14725..=14726 - | 14728..=14729 - | 14929..=14930 - | 14932..=14933 - | 14941..=14942 - | 14944..=14945 - | 15037..=15038 - | 15040..=15041 - | 15049..=15050 - | 15052..=15053 - | 15253..=15254 - | 15256..=15257 - | 15265..=15266 - | 15268..=15269 - | 15361..=15362 - | 15364..=15365 - | 15373..=15374 - | 15376..=15377 - | 15577..=15578 - | 15580..=15581 - | 15589..=15590 - | 15592..=15593 - | 15685..=15686 - | 15688..=15689 - | 15697..=15698 - | 15700..=15701 - | 15901..=15902 - | 15904..=15905 - | 15913..=15914 - | 15916..=15917 - | 16009..=16010 - | 16012..=16013 - | 16021..=16022 - | 16024..=16025 - | 16225..=16226 - | 16228..=16229 - | 16237..=16238 - | 16240..=16241 - | 16333..=16334 - | 16336..=16337 - | 16345..=16346 - | 16348..=16349 - | 16549..=16550 - | 16552..=16553 - | 16561..=16562 - | 16564..=16565 - | 16657..=16658 - | 16660..=16661 - | 16669..=16670 - | 16672..=16673 - | 16873..=16874 - | 16876..=16877 - | 16885..=16886 - | 16888..=16889 - | 16981..=16982 - | 16984..=16985 - | 16993..=16994 - | 16996..=16997 - | 17197..=17198 - | 17200..=17201 - | 17209..=17210 - | 17212..=17213 - | 17305..=17306 - | 17308..=17309 - | 17317..=17318 - | 17320..=17321 - | 17521..=17522 - | 17524..=17525 - | 17533..=17534 - | 17536..=17537 - | 17629..=17630 - | 17632..=17633 - | 17641..=17642 - | 17644..=17645 - | 17845..=17846 - | 17848..=17849 - | 17857..=17858 - | 17860..=17861 - | 17953..=17954 - | 17956..=17957 - | 17965..=17966 - | 17968..=17969 - | 18169..=18170 - | 18172..=18173 - | 18181..=18182 - | 18184..=18185 - | 18277..=18278 - | 18280..=18281 - | 18289..=18290 - | 18292..=18293 - | 19662..=19663 - | 19665..=19666 - | 19674..=19675 - | 19677..=19678 - | 19770..=19771 - | 19773..=19774 - | 19782..=19783 - | 19785..=19786 - | 20082..=20083 - | 20085..=20086 - | 20094..=20095 - | 20097..=20098 - | 20190..=20191 - | 20193..=20194 - | 20202..=20203 - | 20205..=20206 - | 20519..=20520 - | 20522..=20523 - | 20531..=20532 - | 20534..=20535 - | 20627..=20628 - | 20630..=20631 - | 20639..=20640 - | 20642..=20643 - | 21289..=21290 - | 21292..=21293 - | 21301..=21302 - | 21304..=21305 - | 21397..=21398 - | 21400..=21401 - | 21409..=21410 - | 21412..=21413 - | 21700..=21701 - | 21703..=21704 - | 21712..=21713 - | 21715..=21716 - | 21808..=21809 - | 21811..=21812 - | 21820..=21821 - | 21823..=21824 - | 22112..=22113 - | 22115..=22116 - | 22124..=22125 - | 22127..=22128 - | 22220..=22221 - | 22223..=22224 - | 22232..=22233 - | 22235..=22236 - | 25115..=25116 - | 25118..=25119 - | 25127..=25128 - | 25130..=25131 - | 25223..=25224 - | 25226..=25227 - | 25235..=25236 - | 25238..=25239 - | 25526..=25527 - | 25529..=25530 - | 25538..=25539 - | 25541..=25542 - | 25634..=25635 - | 25637..=25638 - | 25646..=25647 - | 25649..=25650 - | 25937..=25938 - | 25940..=25941 - | 25949..=25950 - | 25952..=25953 - | 26045..=26046 - | 26048..=26049 - | 26057..=26058 - | 26060..=26061 - | 26348..=26349 - | 26351..=26352 - | 26360..=26361 - | 26363..=26364 - | 26456..=26457 - | 26459..=26460 - | 26468..=26469 - | 26471..=26472 => &SHAPE156, - 8045 | 8048 | 8057 | 8060 | 8153 | 8156 | 8165 | 8168 | 8369 | 8372 | 8381 | 8384 - | 8477 | 8480 | 8489 | 8492 | 14286 | 14289 | 14298 | 14301 | 14394 | 14397 | 14406 - | 14409 | 14610 | 14613 | 14622 | 14625 | 14718 | 14721 | 14730 | 14733 | 14934 - | 14937 | 14946 | 14949 | 15042 | 15045 | 15054 | 15057 | 15258 | 15261 | 15270 - | 15273 | 15366 | 15369 | 15378 | 15381 | 15582 | 15585 | 15594 | 15597 | 15690 - | 15693 | 15702 | 15705 | 15906 | 15909 | 15918 | 15921 | 16014 | 16017 | 16026 - | 16029 | 16230 | 16233 | 16242 | 16245 | 16338 | 16341 | 16350 | 16353 | 16554 - | 16557 | 16566 | 16569 | 16662 | 16665 | 16674 | 16677 | 16878 | 16881 | 16890 - | 16893 | 16986 | 16989 | 16998 | 17001 | 17202 | 17205 | 17214 | 17217 | 17310 - | 17313 | 17322 | 17325 | 17526 | 17529 | 17538 | 17541 | 17634 | 17637 | 17646 - | 17649 | 17850 | 17853 | 17862 | 17865 | 17958 | 17961 | 17970 | 17973 | 18174 - | 18177 | 18186 | 18189 | 18282 | 18285 | 18294 | 18297 | 19667 | 19670 | 19679 - | 19682 | 19775 | 19778 | 19787 | 19790 | 20087 | 20090 | 20099 | 20102 | 20195 - | 20198 | 20207 | 20210 | 20524 | 20527 | 20536 | 20539 | 20632 | 20635 | 20644 - | 20647 | 21294 | 21297 | 21306 | 21309 | 21402 | 21405 | 21414 | 21417 | 21705 - | 21708 | 21717 | 21720 | 21813 | 21816 | 21825 | 21828 | 22117 | 22120 | 22129 - | 22132 | 22225 | 22228 | 22237 | 22240 | 25120 | 25123 | 25132 | 25135 | 25228 - | 25231 | 25240 | 25243 | 25531 | 25534 | 25543 | 25546 | 25639 | 25642 | 25651 - | 25654 | 25942 | 25945 | 25954 | 25957 | 26050 | 26053 | 26062 | 26065 | 26353 - | 26356 | 26365 | 26368 | 26461 | 26464 | 26473 | 26476 => &SHAPE157, - 8046..=8047 - | 8049..=8050 - | 8058..=8059 - | 8061..=8062 - | 8154..=8155 - | 8157..=8158 - | 8166..=8167 - | 8169..=8170 - | 8370..=8371 - | 8373..=8374 - | 8382..=8383 - | 8385..=8386 - | 8478..=8479 - | 8481..=8482 - | 8490..=8491 - | 8493..=8494 - | 14287..=14288 - | 14290..=14291 - | 14299..=14300 - | 14302..=14303 - | 14395..=14396 - | 14398..=14399 - | 14407..=14408 - | 14410..=14411 - | 14611..=14612 - | 14614..=14615 - | 14623..=14624 - | 14626..=14627 - | 14719..=14720 - | 14722..=14723 - | 14731..=14732 - | 14734..=14735 - | 14935..=14936 - | 14938..=14939 - | 14947..=14948 - | 14950..=14951 - | 15043..=15044 - | 15046..=15047 - | 15055..=15056 - | 15058..=15059 - | 15259..=15260 - | 15262..=15263 - | 15271..=15272 - | 15274..=15275 - | 15367..=15368 - | 15370..=15371 - | 15379..=15380 - | 15382..=15383 - | 15583..=15584 - | 15586..=15587 - | 15595..=15596 - | 15598..=15599 - | 15691..=15692 - | 15694..=15695 - | 15703..=15704 - | 15706..=15707 - | 15907..=15908 - | 15910..=15911 - | 15919..=15920 - | 15922..=15923 - | 16015..=16016 - | 16018..=16019 - | 16027..=16028 - | 16030..=16031 - | 16231..=16232 - | 16234..=16235 - | 16243..=16244 - | 16246..=16247 - | 16339..=16340 - | 16342..=16343 - | 16351..=16352 - | 16354..=16355 - | 16555..=16556 - | 16558..=16559 - | 16567..=16568 - | 16570..=16571 - | 16663..=16664 - | 16666..=16667 - | 16675..=16676 - | 16678..=16679 - | 16879..=16880 - | 16882..=16883 - | 16891..=16892 - | 16894..=16895 - | 16987..=16988 - | 16990..=16991 - | 16999..=17000 - | 17002..=17003 - | 17203..=17204 - | 17206..=17207 - | 17215..=17216 - | 17218..=17219 - | 17311..=17312 - | 17314..=17315 - | 17323..=17324 - | 17326..=17327 - | 17527..=17528 - | 17530..=17531 - | 17539..=17540 - | 17542..=17543 - | 17635..=17636 - | 17638..=17639 - | 17647..=17648 - | 17650..=17651 - | 17851..=17852 - | 17854..=17855 - | 17863..=17864 - | 17866..=17867 - | 17959..=17960 - | 17962..=17963 - | 17971..=17972 - | 17974..=17975 - | 18175..=18176 - | 18178..=18179 - | 18187..=18188 - | 18190..=18191 - | 18283..=18284 - | 18286..=18287 - | 18295..=18296 - | 18298..=18299 - | 19668..=19669 - | 19671..=19672 - | 19680..=19681 - | 19683..=19684 - | 19776..=19777 - | 19779..=19780 - | 19788..=19789 - | 19791..=19792 - | 20088..=20089 - | 20091..=20092 - | 20100..=20101 - | 20103..=20104 - | 20196..=20197 - | 20199..=20200 - | 20208..=20209 - | 20211..=20212 - | 20525..=20526 - | 20528..=20529 - | 20537..=20538 - | 20540..=20541 - | 20633..=20634 - | 20636..=20637 - | 20645..=20646 - | 20648..=20649 - | 21295..=21296 - | 21298..=21299 - | 21307..=21308 - | 21310..=21311 - | 21403..=21404 - | 21406..=21407 - | 21415..=21416 - | 21418..=21419 - | 21706..=21707 - | 21709..=21710 - | 21718..=21719 - | 21721..=21722 - | 21814..=21815 - | 21817..=21818 - | 21826..=21827 - | 21829..=21830 - | 22118..=22119 - | 22121..=22122 - | 22130..=22131 - | 22133..=22134 - | 22226..=22227 - | 22229..=22230 - | 22238..=22239 - | 22241..=22242 - | 25121..=25122 - | 25124..=25125 - | 25133..=25134 - | 25136..=25137 - | 25229..=25230 - | 25232..=25233 - | 25241..=25242 - | 25244..=25245 - | 25532..=25533 - | 25535..=25536 - | 25544..=25545 - | 25547..=25548 - | 25640..=25641 - | 25643..=25644 - | 25652..=25653 - | 25655..=25656 - | 25943..=25944 - | 25946..=25947 - | 25955..=25956 - | 25958..=25959 - | 26051..=26052 - | 26054..=26055 - | 26063..=26064 - | 26066..=26067 - | 26354..=26355 - | 26357..=26358 - | 26366..=26367 - | 26369..=26370 - | 26462..=26463 - | 26465..=26466 - | 26474..=26475 - | 26477..=26478 => &SHAPE158, - 8063 | 8066 | 8099 | 8102 | 8171 | 8174 | 8207 | 8210 | 8387 | 8390 | 8423 | 8426 - | 8495 | 8498 | 8531 | 8534 | 14304 | 14307 | 14340 | 14343 | 14412 | 14415 | 14448 - | 14451 | 14628 | 14631 | 14664 | 14667 | 14736 | 14739 | 14772 | 14775 | 14952 - | 14955 | 14988 | 14991 | 15060 | 15063 | 15096 | 15099 | 15276 | 15279 | 15312 - | 15315 | 15384 | 15387 | 15420 | 15423 | 15600 | 15603 | 15636 | 15639 | 15708 - | 15711 | 15744 | 15747 | 15924 | 15927 | 15960 | 15963 | 16032 | 16035 | 16068 - | 16071 | 16248 | 16251 | 16284 | 16287 | 16356 | 16359 | 16392 | 16395 | 16572 - | 16575 | 16608 | 16611 | 16680 | 16683 | 16716 | 16719 | 16896 | 16899 | 16932 - | 16935 | 17004 | 17007 | 17040 | 17043 | 17220 | 17223 | 17256 | 17259 | 17328 - | 17331 | 17364 | 17367 | 17544 | 17547 | 17580 | 17583 | 17652 | 17655 | 17688 - | 17691 | 17868 | 17871 | 17904 | 17907 | 17976 | 17979 | 18012 | 18015 | 18192 - | 18195 | 18228 | 18231 | 18300 | 18303 | 18336 | 18339 | 19685 | 19688 | 19721 - | 19724 | 19793 | 19796 | 19829 | 19832 | 20105 | 20108 | 20141 | 20144 | 20213 - | 20216 | 20249 | 20252 | 20542 | 20545 | 20578 | 20581 | 20650 | 20653 | 20686 - | 20689 | 21312 | 21315 | 21348 | 21351 | 21420 | 21423 | 21456 | 21459 | 21723 - | 21726 | 21759 | 21762 | 21831 | 21834 | 21867 | 21870 | 22135 | 22138 | 22171 - | 22174 | 22243 | 22246 | 22279 | 22282 | 25138 | 25141 | 25174 | 25177 | 25246 - | 25249 | 25282 | 25285 | 25549 | 25552 | 25585 | 25588 | 25657 | 25660 | 25693 - | 25696 | 25960 | 25963 | 25996 | 25999 | 26068 | 26071 | 26104 | 26107 | 26371 - | 26374 | 26407 | 26410 | 26479 | 26482 | 26515 | 26518 => &SHAPE159, - 8064..=8065 - | 8067..=8068 - | 8100..=8101 - | 8103..=8104 - | 8172..=8173 - | 8175..=8176 - | 8208..=8209 - | 8211..=8212 - | 8388..=8389 - | 8391..=8392 - | 8424..=8425 - | 8427..=8428 - | 8496..=8497 - | 8499..=8500 - | 8532..=8533 - | 8535..=8536 - | 14305..=14306 - | 14308..=14309 - | 14341..=14342 - | 14344..=14345 - | 14413..=14414 - | 14416..=14417 - | 14449..=14450 - | 14452..=14453 - | 14629..=14630 - | 14632..=14633 - | 14665..=14666 - | 14668..=14669 - | 14737..=14738 - | 14740..=14741 - | 14773..=14774 - | 14776..=14777 - | 14953..=14954 - | 14956..=14957 - | 14989..=14990 - | 14992..=14993 - | 15061..=15062 - | 15064..=15065 - | 15097..=15098 - | 15100..=15101 - | 15277..=15278 - | 15280..=15281 - | 15313..=15314 - | 15316..=15317 - | 15385..=15386 - | 15388..=15389 - | 15421..=15422 - | 15424..=15425 - | 15601..=15602 - | 15604..=15605 - | 15637..=15638 - | 15640..=15641 - | 15709..=15710 - | 15712..=15713 - | 15745..=15746 - | 15748..=15749 - | 15925..=15926 - | 15928..=15929 - | 15961..=15962 - | 15964..=15965 - | 16033..=16034 - | 16036..=16037 - | 16069..=16070 - | 16072..=16073 - | 16249..=16250 - | 16252..=16253 - | 16285..=16286 - | 16288..=16289 - | 16357..=16358 - | 16360..=16361 - | 16393..=16394 - | 16396..=16397 - | 16573..=16574 - | 16576..=16577 - | 16609..=16610 - | 16612..=16613 - | 16681..=16682 - | 16684..=16685 - | 16717..=16718 - | 16720..=16721 - | 16897..=16898 - | 16900..=16901 - | 16933..=16934 - | 16936..=16937 - | 17005..=17006 - | 17008..=17009 - | 17041..=17042 - | 17044..=17045 - | 17221..=17222 - | 17224..=17225 - | 17257..=17258 - | 17260..=17261 - | 17329..=17330 - | 17332..=17333 - | 17365..=17366 - | 17368..=17369 - | 17545..=17546 - | 17548..=17549 - | 17581..=17582 - | 17584..=17585 - | 17653..=17654 - | 17656..=17657 - | 17689..=17690 - | 17692..=17693 - | 17869..=17870 - | 17872..=17873 - | 17905..=17906 - | 17908..=17909 - | 17977..=17978 - | 17980..=17981 - | 18013..=18014 - | 18016..=18017 - | 18193..=18194 - | 18196..=18197 - | 18229..=18230 - | 18232..=18233 - | 18301..=18302 - | 18304..=18305 - | 18337..=18338 - | 18340..=18341 - | 19686..=19687 - | 19689..=19690 - | 19722..=19723 - | 19725..=19726 - | 19794..=19795 - | 19797..=19798 - | 19830..=19831 - | 19833..=19834 - | 20106..=20107 - | 20109..=20110 - | 20142..=20143 - | 20145..=20146 - | 20214..=20215 - | 20217..=20218 - | 20250..=20251 - | 20253..=20254 - | 20543..=20544 - | 20546..=20547 - | 20579..=20580 - | 20582..=20583 - | 20651..=20652 - | 20654..=20655 - | 20687..=20688 - | 20690..=20691 - | 21313..=21314 - | 21316..=21317 - | 21349..=21350 - | 21352..=21353 - | 21421..=21422 - | 21424..=21425 - | 21457..=21458 - | 21460..=21461 - | 21724..=21725 - | 21727..=21728 - | 21760..=21761 - | 21763..=21764 - | 21832..=21833 - | 21835..=21836 - | 21868..=21869 - | 21871..=21872 - | 22136..=22137 - | 22139..=22140 - | 22172..=22173 - | 22175..=22176 - | 22244..=22245 - | 22247..=22248 - | 22280..=22281 - | 22283..=22284 - | 25139..=25140 - | 25142..=25143 - | 25175..=25176 - | 25178..=25179 - | 25247..=25248 - | 25250..=25251 - | 25283..=25284 - | 25286..=25287 - | 25550..=25551 - | 25553..=25554 - | 25586..=25587 - | 25589..=25590 - | 25658..=25659 - | 25661..=25662 - | 25694..=25695 - | 25697..=25698 - | 25961..=25962 - | 25964..=25965 - | 25997..=25998 - | 26000..=26001 - | 26069..=26070 - | 26072..=26073 - | 26105..=26106 - | 26108..=26109 - | 26372..=26373 - | 26375..=26376 - | 26408..=26409 - | 26411..=26412 - | 26480..=26481 - | 26483..=26484 - | 26516..=26517 - | 26519..=26520 => &SHAPE160, - 8069 | 8072 | 8105 | 8108 | 8177 | 8180 | 8213 | 8216 | 8393 | 8396 | 8429 | 8432 - | 8501 | 8504 | 8537 | 8540 | 14310 | 14313 | 14346 | 14349 | 14418 | 14421 | 14454 - | 14457 | 14634 | 14637 | 14670 | 14673 | 14742 | 14745 | 14778 | 14781 | 14958 - | 14961 | 14994 | 14997 | 15066 | 15069 | 15102 | 15105 | 15282 | 15285 | 15318 - | 15321 | 15390 | 15393 | 15426 | 15429 | 15606 | 15609 | 15642 | 15645 | 15714 - | 15717 | 15750 | 15753 | 15930 | 15933 | 15966 | 15969 | 16038 | 16041 | 16074 - | 16077 | 16254 | 16257 | 16290 | 16293 | 16362 | 16365 | 16398 | 16401 | 16578 - | 16581 | 16614 | 16617 | 16686 | 16689 | 16722 | 16725 | 16902 | 16905 | 16938 - | 16941 | 17010 | 17013 | 17046 | 17049 | 17226 | 17229 | 17262 | 17265 | 17334 - | 17337 | 17370 | 17373 | 17550 | 17553 | 17586 | 17589 | 17658 | 17661 | 17694 - | 17697 | 17874 | 17877 | 17910 | 17913 | 17982 | 17985 | 18018 | 18021 | 18198 - | 18201 | 18234 | 18237 | 18306 | 18309 | 18342 | 18345 | 19691 | 19694 | 19727 - | 19730 | 19799 | 19802 | 19835 | 19838 | 20111 | 20114 | 20147 | 20150 | 20219 - | 20222 | 20255 | 20258 | 20548 | 20551 | 20584 | 20587 | 20656 | 20659 | 20692 - | 20695 | 21318 | 21321 | 21354 | 21357 | 21426 | 21429 | 21462 | 21465 | 21729 - | 21732 | 21765 | 21768 | 21837 | 21840 | 21873 | 21876 | 22141 | 22144 | 22177 - | 22180 | 22249 | 22252 | 22285 | 22288 | 25144 | 25147 | 25180 | 25183 | 25252 - | 25255 | 25288 | 25291 | 25555 | 25558 | 25591 | 25594 | 25663 | 25666 | 25699 - | 25702 | 25966 | 25969 | 26002 | 26005 | 26074 | 26077 | 26110 | 26113 | 26377 - | 26380 | 26413 | 26416 | 26485 | 26488 | 26521 | 26524 => &SHAPE161, - 8070..=8071 - | 8073..=8074 - | 8106..=8107 - | 8109..=8110 - | 8178..=8179 - | 8181..=8182 - | 8214..=8215 - | 8217..=8218 - | 8394..=8395 - | 8397..=8398 - | 8430..=8431 - | 8433..=8434 - | 8502..=8503 - | 8505..=8506 - | 8538..=8539 - | 8541..=8542 - | 14311..=14312 - | 14314..=14315 - | 14347..=14348 - | 14350..=14351 - | 14419..=14420 - | 14422..=14423 - | 14455..=14456 - | 14458..=14459 - | 14635..=14636 - | 14638..=14639 - | 14671..=14672 - | 14674..=14675 - | 14743..=14744 - | 14746..=14747 - | 14779..=14780 - | 14782..=14783 - | 14959..=14960 - | 14962..=14963 - | 14995..=14996 - | 14998..=14999 - | 15067..=15068 - | 15070..=15071 - | 15103..=15104 - | 15106..=15107 - | 15283..=15284 - | 15286..=15287 - | 15319..=15320 - | 15322..=15323 - | 15391..=15392 - | 15394..=15395 - | 15427..=15428 - | 15430..=15431 - | 15607..=15608 - | 15610..=15611 - | 15643..=15644 - | 15646..=15647 - | 15715..=15716 - | 15718..=15719 - | 15751..=15752 - | 15754..=15755 - | 15931..=15932 - | 15934..=15935 - | 15967..=15968 - | 15970..=15971 - | 16039..=16040 - | 16042..=16043 - | 16075..=16076 - | 16078..=16079 - | 16255..=16256 - | 16258..=16259 - | 16291..=16292 - | 16294..=16295 - | 16363..=16364 - | 16366..=16367 - | 16399..=16400 - | 16402..=16403 - | 16579..=16580 - | 16582..=16583 - | 16615..=16616 - | 16618..=16619 - | 16687..=16688 - | 16690..=16691 - | 16723..=16724 - | 16726..=16727 - | 16903..=16904 - | 16906..=16907 - | 16939..=16940 - | 16942..=16943 - | 17011..=17012 - | 17014..=17015 - | 17047..=17048 - | 17050..=17051 - | 17227..=17228 - | 17230..=17231 - | 17263..=17264 - | 17266..=17267 - | 17335..=17336 - | 17338..=17339 - | 17371..=17372 - | 17374..=17375 - | 17551..=17552 - | 17554..=17555 - | 17587..=17588 - | 17590..=17591 - | 17659..=17660 - | 17662..=17663 - | 17695..=17696 - | 17698..=17699 - | 17875..=17876 - | 17878..=17879 - | 17911..=17912 - | 17914..=17915 - | 17983..=17984 - | 17986..=17987 - | 18019..=18020 - | 18022..=18023 - | 18199..=18200 - | 18202..=18203 - | 18235..=18236 - | 18238..=18239 - | 18307..=18308 - | 18310..=18311 - | 18343..=18344 - | 18346..=18347 - | 19692..=19693 - | 19695..=19696 - | 19728..=19729 - | 19731..=19732 - | 19800..=19801 - | 19803..=19804 - | 19836..=19837 - | 19839..=19840 - | 20112..=20113 - | 20115..=20116 - | 20148..=20149 - | 20151..=20152 - | 20220..=20221 - | 20223..=20224 - | 20256..=20257 - | 20259..=20260 - | 20549..=20550 - | 20552..=20553 - | 20585..=20586 - | 20588..=20589 - | 20657..=20658 - | 20660..=20661 - | 20693..=20694 - | 20696..=20697 - | 21319..=21320 - | 21322..=21323 - | 21355..=21356 - | 21358..=21359 - | 21427..=21428 - | 21430..=21431 - | 21463..=21464 - | 21466..=21467 - | 21730..=21731 - | 21733..=21734 - | 21766..=21767 - | 21769..=21770 - | 21838..=21839 - | 21841..=21842 - | 21874..=21875 - | 21877..=21878 - | 22142..=22143 - | 22145..=22146 - | 22178..=22179 - | 22181..=22182 - | 22250..=22251 - | 22253..=22254 - | 22286..=22287 - | 22289..=22290 - | 25145..=25146 - | 25148..=25149 - | 25181..=25182 - | 25184..=25185 - | 25253..=25254 - | 25256..=25257 - | 25289..=25290 - | 25292..=25293 - | 25556..=25557 - | 25559..=25560 - | 25592..=25593 - | 25595..=25596 - | 25664..=25665 - | 25667..=25668 - | 25700..=25701 - | 25703..=25704 - | 25967..=25968 - | 25970..=25971 - | 26003..=26004 - | 26006..=26007 - | 26075..=26076 - | 26078..=26079 - | 26111..=26112 - | 26114..=26115 - | 26378..=26379 - | 26381..=26382 - | 26414..=26415 - | 26417..=26418 - | 26486..=26487 - | 26489..=26490 - | 26522..=26523 - | 26525..=26526 => &SHAPE162, - 8075 | 8078 | 8087 | 8090 | 8111 | 8114 | 8123 | 8126 | 8183 | 8186 | 8195 | 8198 - | 8219 | 8222 | 8231 | 8234 | 8399 | 8402 | 8411 | 8414 | 8435 | 8438 | 8447 | 8450 - | 8507 | 8510 | 8519 | 8522 | 8543 | 8546 | 8555 | 8558 | 14316 | 14319 | 14328 - | 14331 | 14352 | 14355 | 14364 | 14367 | 14424 | 14427 | 14436 | 14439 | 14460 - | 14463 | 14472 | 14475 | 14640 | 14643 | 14652 | 14655 | 14676 | 14679 | 14688 - | 14691 | 14748 | 14751 | 14760 | 14763 | 14784 | 14787 | 14796 | 14799 | 14964 - | 14967 | 14976 | 14979 | 15000 | 15003 | 15012 | 15015 | 15072 | 15075 | 15084 - | 15087 | 15108 | 15111 | 15120 | 15123 | 15288 | 15291 | 15300 | 15303 | 15324 - | 15327 | 15336 | 15339 | 15396 | 15399 | 15408 | 15411 | 15432 | 15435 | 15444 - | 15447 | 15612 | 15615 | 15624 | 15627 | 15648 | 15651 | 15660 | 15663 | 15720 - | 15723 | 15732 | 15735 | 15756 | 15759 | 15768 | 15771 | 15936 | 15939 | 15948 - | 15951 | 15972 | 15975 | 15984 | 15987 | 16044 | 16047 | 16056 | 16059 | 16080 - | 16083 | 16092 | 16095 | 16260 | 16263 | 16272 | 16275 | 16296 | 16299 | 16308 - | 16311 | 16368 | 16371 | 16380 | 16383 | 16404 | 16407 | 16416 | 16419 | 16584 - | 16587 | 16596 | 16599 | 16620 | 16623 | 16632 | 16635 | 16692 | 16695 | 16704 - | 16707 | 16728 | 16731 | 16740 | 16743 | 16908 | 16911 | 16920 | 16923 | 16944 - | 16947 | 16956 | 16959 | 17016 | 17019 | 17028 | 17031 | 17052 | 17055 | 17064 - | 17067 | 17232 | 17235 | 17244 | 17247 | 17268 | 17271 | 17280 | 17283 | 17340 - | 17343 | 17352 | 17355 | 17376 | 17379 | 17388 | 17391 | 17556 | 17559 | 17568 - | 17571 | 17592 | 17595 | 17604 | 17607 | 17664 | 17667 | 17676 | 17679 | 17700 - | 17703 | 17712 | 17715 | 17880 | 17883 | 17892 | 17895 | 17916 | 17919 | 17928 - | 17931 | 17988 | 17991 | 18000 | 18003 | 18024 | 18027 | 18036 | 18039 | 18204 - | 18207 | 18216 | 18219 | 18240 | 18243 | 18252 | 18255 | 18312 | 18315 | 18324 - | 18327 | 18348 | 18351 | 18360 | 18363 | 19697 | 19700 | 19709 | 19712 | 19733 - | 19736 | 19745 | 19748 | 19805 | 19808 | 19817 | 19820 | 19841 | 19844 | 19853 - | 19856 | 20117 | 20120 | 20129 | 20132 | 20153 | 20156 | 20165 | 20168 | 20225 - | 20228 | 20237 | 20240 | 20261 | 20264 | 20273 | 20276 | 20554 | 20557 | 20566 - | 20569 | 20590 | 20593 | 20602 | 20605 | 20662 | 20665 | 20674 | 20677 | 20698 - | 20701 | 20710 | 20713 | 21324 | 21327 | 21336 | 21339 | 21360 | 21363 | 21372 - | 21375 | 21432 | 21435 | 21444 | 21447 | 21468 | 21471 | 21480 | 21483 | 21735 - | 21738 | 21747 | 21750 | 21771 | 21774 | 21783 | 21786 | 21843 | 21846 | 21855 - | 21858 | 21879 | 21882 | 21891 | 21894 | 22147 | 22150 | 22159 | 22162 | 22183 - | 22186 | 22195 | 22198 | 22255 | 22258 | 22267 | 22270 | 22291 | 22294 | 22303 - | 22306 | 25150 | 25153 | 25162 | 25165 | 25186 | 25189 | 25198 | 25201 | 25258 - | 25261 | 25270 | 25273 | 25294 | 25297 | 25306 | 25309 | 25561 | 25564 | 25573 - | 25576 | 25597 | 25600 | 25609 | 25612 | 25669 | 25672 | 25681 | 25684 | 25705 - | 25708 | 25717 | 25720 | 25972 | 25975 | 25984 | 25987 | 26008 | 26011 | 26020 - | 26023 | 26080 | 26083 | 26092 | 26095 | 26116 | 26119 | 26128 | 26131 | 26383 - | 26386 | 26395 | 26398 | 26419 | 26422 | 26431 | 26434 | 26491 | 26494 | 26503 - | 26506 | 26527 | 26530 | 26539 | 26542 => &SHAPE163, - 8076..=8077 - | 8079..=8080 - | 8088..=8089 - | 8091..=8092 - | 8112..=8113 - | 8115..=8116 - | 8124..=8125 - | 8127..=8128 - | 8184..=8185 - | 8187..=8188 - | 8196..=8197 - | 8199..=8200 - | 8220..=8221 - | 8223..=8224 - | 8232..=8233 - | 8235..=8236 - | 8400..=8401 - | 8403..=8404 - | 8412..=8413 - | 8415..=8416 - | 8436..=8437 - | 8439..=8440 - | 8448..=8449 - | 8451..=8452 - | 8508..=8509 - | 8511..=8512 - | 8520..=8521 - | 8523..=8524 - | 8544..=8545 - | 8547..=8548 - | 8556..=8557 - | 8559..=8560 - | 14317..=14318 - | 14320..=14321 - | 14329..=14330 - | 14332..=14333 - | 14353..=14354 - | 14356..=14357 - | 14365..=14366 - | 14368..=14369 - | 14425..=14426 - | 14428..=14429 - | 14437..=14438 - | 14440..=14441 - | 14461..=14462 - | 14464..=14465 - | 14473..=14474 - | 14476..=14477 - | 14641..=14642 - | 14644..=14645 - | 14653..=14654 - | 14656..=14657 - | 14677..=14678 - | 14680..=14681 - | 14689..=14690 - | 14692..=14693 - | 14749..=14750 - | 14752..=14753 - | 14761..=14762 - | 14764..=14765 - | 14785..=14786 - | 14788..=14789 - | 14797..=14798 - | 14800..=14801 - | 14965..=14966 - | 14968..=14969 - | 14977..=14978 - | 14980..=14981 - | 15001..=15002 - | 15004..=15005 - | 15013..=15014 - | 15016..=15017 - | 15073..=15074 - | 15076..=15077 - | 15085..=15086 - | 15088..=15089 - | 15109..=15110 - | 15112..=15113 - | 15121..=15122 - | 15124..=15125 - | 15289..=15290 - | 15292..=15293 - | 15301..=15302 - | 15304..=15305 - | 15325..=15326 - | 15328..=15329 - | 15337..=15338 - | 15340..=15341 - | 15397..=15398 - | 15400..=15401 - | 15409..=15410 - | 15412..=15413 - | 15433..=15434 - | 15436..=15437 - | 15445..=15446 - | 15448..=15449 - | 15613..=15614 - | 15616..=15617 - | 15625..=15626 - | 15628..=15629 - | 15649..=15650 - | 15652..=15653 - | 15661..=15662 - | 15664..=15665 - | 15721..=15722 - | 15724..=15725 - | 15733..=15734 - | 15736..=15737 - | 15757..=15758 - | 15760..=15761 - | 15769..=15770 - | 15772..=15773 - | 15937..=15938 - | 15940..=15941 - | 15949..=15950 - | 15952..=15953 - | 15973..=15974 - | 15976..=15977 - | 15985..=15986 - | 15988..=15989 - | 16045..=16046 - | 16048..=16049 - | 16057..=16058 - | 16060..=16061 - | 16081..=16082 - | 16084..=16085 - | 16093..=16094 - | 16096..=16097 - | 16261..=16262 - | 16264..=16265 - | 16273..=16274 - | 16276..=16277 - | 16297..=16298 - | 16300..=16301 - | 16309..=16310 - | 16312..=16313 - | 16369..=16370 - | 16372..=16373 - | 16381..=16382 - | 16384..=16385 - | 16405..=16406 - | 16408..=16409 - | 16417..=16418 - | 16420..=16421 - | 16585..=16586 - | 16588..=16589 - | 16597..=16598 - | 16600..=16601 - | 16621..=16622 - | 16624..=16625 - | 16633..=16634 - | 16636..=16637 - | 16693..=16694 - | 16696..=16697 - | 16705..=16706 - | 16708..=16709 - | 16729..=16730 - | 16732..=16733 - | 16741..=16742 - | 16744..=16745 - | 16909..=16910 - | 16912..=16913 - | 16921..=16922 - | 16924..=16925 - | 16945..=16946 - | 16948..=16949 - | 16957..=16958 - | 16960..=16961 - | 17017..=17018 - | 17020..=17021 - | 17029..=17030 - | 17032..=17033 - | 17053..=17054 - | 17056..=17057 - | 17065..=17066 - | 17068..=17069 - | 17233..=17234 - | 17236..=17237 - | 17245..=17246 - | 17248..=17249 - | 17269..=17270 - | 17272..=17273 - | 17281..=17282 - | 17284..=17285 - | 17341..=17342 - | 17344..=17345 - | 17353..=17354 - | 17356..=17357 - | 17377..=17378 - | 17380..=17381 - | 17389..=17390 - | 17392..=17393 - | 17557..=17558 - | 17560..=17561 - | 17569..=17570 - | 17572..=17573 - | 17593..=17594 - | 17596..=17597 - | 17605..=17606 - | 17608..=17609 - | 17665..=17666 - | 17668..=17669 - | 17677..=17678 - | 17680..=17681 - | 17701..=17702 - | 17704..=17705 - | 17713..=17714 - | 17716..=17717 - | 17881..=17882 - | 17884..=17885 - | 17893..=17894 - | 17896..=17897 - | 17917..=17918 - | 17920..=17921 - | 17929..=17930 - | 17932..=17933 - | 17989..=17990 - | 17992..=17993 - | 18001..=18002 - | 18004..=18005 - | 18025..=18026 - | 18028..=18029 - | 18037..=18038 - | 18040..=18041 - | 18205..=18206 - | 18208..=18209 - | 18217..=18218 - | 18220..=18221 - | 18241..=18242 - | 18244..=18245 - | 18253..=18254 - | 18256..=18257 - | 18313..=18314 - | 18316..=18317 - | 18325..=18326 - | 18328..=18329 - | 18349..=18350 - | 18352..=18353 - | 18361..=18362 - | 18364..=18365 - | 19698..=19699 - | 19701..=19702 - | 19710..=19711 - | 19713..=19714 - | 19734..=19735 - | 19737..=19738 - | 19746..=19747 - | 19749..=19750 - | 19806..=19807 - | 19809..=19810 - | 19818..=19819 - | 19821..=19822 - | 19842..=19843 - | 19845..=19846 - | 19854..=19855 - | 19857..=19858 - | 20118..=20119 - | 20121..=20122 - | 20130..=20131 - | 20133..=20134 - | 20154..=20155 - | 20157..=20158 - | 20166..=20167 - | 20169..=20170 - | 20226..=20227 - | 20229..=20230 - | 20238..=20239 - | 20241..=20242 - | 20262..=20263 - | 20265..=20266 - | 20274..=20275 - | 20277..=20278 - | 20555..=20556 - | 20558..=20559 - | 20567..=20568 - | 20570..=20571 - | 20591..=20592 - | 20594..=20595 - | 20603..=20604 - | 20606..=20607 - | 20663..=20664 - | 20666..=20667 - | 20675..=20676 - | 20678..=20679 - | 20699..=20700 - | 20702..=20703 - | 20711..=20712 - | 20714..=20715 - | 21325..=21326 - | 21328..=21329 - | 21337..=21338 - | 21340..=21341 - | 21361..=21362 - | 21364..=21365 - | 21373..=21374 - | 21376..=21377 - | 21433..=21434 - | 21436..=21437 - | 21445..=21446 - | 21448..=21449 - | 21469..=21470 - | 21472..=21473 - | 21481..=21482 - | 21484..=21485 - | 21736..=21737 - | 21739..=21740 - | 21748..=21749 - | 21751..=21752 - | 21772..=21773 - | 21775..=21776 - | 21784..=21785 - | 21787..=21788 - | 21844..=21845 - | 21847..=21848 - | 21856..=21857 - | 21859..=21860 - | 21880..=21881 - | 21883..=21884 - | 21892..=21893 - | 21895..=21896 - | 22148..=22149 - | 22151..=22152 - | 22160..=22161 - | 22163..=22164 - | 22184..=22185 - | 22187..=22188 - | 22196..=22197 - | 22199..=22200 - | 22256..=22257 - | 22259..=22260 - | 22268..=22269 - | 22271..=22272 - | 22292..=22293 - | 22295..=22296 - | 22304..=22305 - | 22307..=22308 - | 25151..=25152 - | 25154..=25155 - | 25163..=25164 - | 25166..=25167 - | 25187..=25188 - | 25190..=25191 - | 25199..=25200 - | 25202..=25203 - | 25259..=25260 - | 25262..=25263 - | 25271..=25272 - | 25274..=25275 - | 25295..=25296 - | 25298..=25299 - | 25307..=25308 - | 25310..=25311 - | 25562..=25563 - | 25565..=25566 - | 25574..=25575 - | 25577..=25578 - | 25598..=25599 - | 25601..=25602 - | 25610..=25611 - | 25613..=25614 - | 25670..=25671 - | 25673..=25674 - | 25682..=25683 - | 25685..=25686 - | 25706..=25707 - | 25709..=25710 - | 25718..=25719 - | 25721..=25722 - | 25973..=25974 - | 25976..=25977 - | 25985..=25986 - | 25988..=25989 - | 26009..=26010 - | 26012..=26013 - | 26021..=26022 - | 26024..=26025 - | 26081..=26082 - | 26084..=26085 - | 26093..=26094 - | 26096..=26097 - | 26117..=26118 - | 26120..=26121 - | 26129..=26130 - | 26132..=26133 - | 26384..=26385 - | 26387..=26388 - | 26396..=26397 - | 26399..=26400 - | 26420..=26421 - | 26423..=26424 - | 26432..=26433 - | 26435..=26436 - | 26492..=26493 - | 26495..=26496 - | 26504..=26505 - | 26507..=26508 - | 26528..=26529 - | 26531..=26532 - | 26540..=26541 - | 26543..=26544 => &SHAPE164, - 8081 | 8084 | 8093 | 8096 | 8117 | 8120 | 8129 | 8132 | 8189 | 8192 | 8201 | 8204 - | 8225 | 8228 | 8237 | 8240 | 8405 | 8408 | 8417 | 8420 | 8441 | 8444 | 8453 | 8456 - | 8513 | 8516 | 8525 | 8528 | 8549 | 8552 | 8561 | 8564 | 14322 | 14325 | 14334 - | 14337 | 14358 | 14361 | 14370 | 14373 | 14430 | 14433 | 14442 | 14445 | 14466 - | 14469 | 14478 | 14481 | 14646 | 14649 | 14658 | 14661 | 14682 | 14685 | 14694 - | 14697 | 14754 | 14757 | 14766 | 14769 | 14790 | 14793 | 14802 | 14805 | 14970 - | 14973 | 14982 | 14985 | 15006 | 15009 | 15018 | 15021 | 15078 | 15081 | 15090 - | 15093 | 15114 | 15117 | 15126 | 15129 | 15294 | 15297 | 15306 | 15309 | 15330 - | 15333 | 15342 | 15345 | 15402 | 15405 | 15414 | 15417 | 15438 | 15441 | 15450 - | 15453 | 15618 | 15621 | 15630 | 15633 | 15654 | 15657 | 15666 | 15669 | 15726 - | 15729 | 15738 | 15741 | 15762 | 15765 | 15774 | 15777 | 15942 | 15945 | 15954 - | 15957 | 15978 | 15981 | 15990 | 15993 | 16050 | 16053 | 16062 | 16065 | 16086 - | 16089 | 16098 | 16101 | 16266 | 16269 | 16278 | 16281 | 16302 | 16305 | 16314 - | 16317 | 16374 | 16377 | 16386 | 16389 | 16410 | 16413 | 16422 | 16425 | 16590 - | 16593 | 16602 | 16605 | 16626 | 16629 | 16638 | 16641 | 16698 | 16701 | 16710 - | 16713 | 16734 | 16737 | 16746 | 16749 | 16914 | 16917 | 16926 | 16929 | 16950 - | 16953 | 16962 | 16965 | 17022 | 17025 | 17034 | 17037 | 17058 | 17061 | 17070 - | 17073 | 17238 | 17241 | 17250 | 17253 | 17274 | 17277 | 17286 | 17289 | 17346 - | 17349 | 17358 | 17361 | 17382 | 17385 | 17394 | 17397 | 17562 | 17565 | 17574 - | 17577 | 17598 | 17601 | 17610 | 17613 | 17670 | 17673 | 17682 | 17685 | 17706 - | 17709 | 17718 | 17721 | 17886 | 17889 | 17898 | 17901 | 17922 | 17925 | 17934 - | 17937 | 17994 | 17997 | 18006 | 18009 | 18030 | 18033 | 18042 | 18045 | 18210 - | 18213 | 18222 | 18225 | 18246 | 18249 | 18258 | 18261 | 18318 | 18321 | 18330 - | 18333 | 18354 | 18357 | 18366 | 18369 | 19703 | 19706 | 19715 | 19718 | 19739 - | 19742 | 19751 | 19754 | 19811 | 19814 | 19823 | 19826 | 19847 | 19850 | 19859 - | 19862 | 20123 | 20126 | 20135 | 20138 | 20159 | 20162 | 20171 | 20174 | 20231 - | 20234 | 20243 | 20246 | 20267 | 20270 | 20279 | 20282 | 20560 | 20563 | 20572 - | 20575 | 20596 | 20599 | 20608 | 20611 | 20668 | 20671 | 20680 | 20683 | 20704 - | 20707 | 20716 | 20719 | 21330 | 21333 | 21342 | 21345 | 21366 | 21369 | 21378 - | 21381 | 21438 | 21441 | 21450 | 21453 | 21474 | 21477 | 21486 | 21489 | 21741 - | 21744 | 21753 | 21756 | 21777 | 21780 | 21789 | 21792 | 21849 | 21852 | 21861 - | 21864 | 21885 | 21888 | 21897 | 21900 | 22153 | 22156 | 22165 | 22168 | 22189 - | 22192 | 22201 | 22204 | 22261 | 22264 | 22273 | 22276 | 22297 | 22300 | 22309 - | 22312 | 25156 | 25159 | 25168 | 25171 | 25192 | 25195 | 25204 | 25207 | 25264 - | 25267 | 25276 | 25279 | 25300 | 25303 | 25312 | 25315 | 25567 | 25570 | 25579 - | 25582 | 25603 | 25606 | 25615 | 25618 | 25675 | 25678 | 25687 | 25690 | 25711 - | 25714 | 25723 | 25726 | 25978 | 25981 | 25990 | 25993 | 26014 | 26017 | 26026 - | 26029 | 26086 | 26089 | 26098 | 26101 | 26122 | 26125 | 26134 | 26137 | 26389 - | 26392 | 26401 | 26404 | 26425 | 26428 | 26437 | 26440 | 26497 | 26500 | 26509 - | 26512 | 26533 | 26536 | 26545 | 26548 => &SHAPE165, - 8082..=8083 - | 8085..=8086 - | 8094..=8095 - | 8097..=8098 - | 8118..=8119 - | 8121..=8122 - | 8130..=8131 - | 8133..=8134 - | 8190..=8191 - | 8193..=8194 - | 8202..=8203 - | 8205..=8206 - | 8226..=8227 - | 8229..=8230 - | 8238..=8239 - | 8241..=8242 - | 8406..=8407 - | 8409..=8410 - | 8418..=8419 - | 8421..=8422 - | 8442..=8443 - | 8445..=8446 - | 8454..=8455 - | 8457..=8458 - | 8514..=8515 - | 8517..=8518 - | 8526..=8527 - | 8529..=8530 - | 8550..=8551 - | 8553..=8554 - | 8562..=8563 - | 8565..=8566 - | 14323..=14324 - | 14326..=14327 - | 14335..=14336 - | 14338..=14339 - | 14359..=14360 - | 14362..=14363 - | 14371..=14372 - | 14374..=14375 - | 14431..=14432 - | 14434..=14435 - | 14443..=14444 - | 14446..=14447 - | 14467..=14468 - | 14470..=14471 - | 14479..=14480 - | 14482..=14483 - | 14647..=14648 - | 14650..=14651 - | 14659..=14660 - | 14662..=14663 - | 14683..=14684 - | 14686..=14687 - | 14695..=14696 - | 14698..=14699 - | 14755..=14756 - | 14758..=14759 - | 14767..=14768 - | 14770..=14771 - | 14791..=14792 - | 14794..=14795 - | 14803..=14804 - | 14806..=14807 - | 14971..=14972 - | 14974..=14975 - | 14983..=14984 - | 14986..=14987 - | 15007..=15008 - | 15010..=15011 - | 15019..=15020 - | 15022..=15023 - | 15079..=15080 - | 15082..=15083 - | 15091..=15092 - | 15094..=15095 - | 15115..=15116 - | 15118..=15119 - | 15127..=15128 - | 15130..=15131 - | 15295..=15296 - | 15298..=15299 - | 15307..=15308 - | 15310..=15311 - | 15331..=15332 - | 15334..=15335 - | 15343..=15344 - | 15346..=15347 - | 15403..=15404 - | 15406..=15407 - | 15415..=15416 - | 15418..=15419 - | 15439..=15440 - | 15442..=15443 - | 15451..=15452 - | 15454..=15455 - | 15619..=15620 - | 15622..=15623 - | 15631..=15632 - | 15634..=15635 - | 15655..=15656 - | 15658..=15659 - | 15667..=15668 - | 15670..=15671 - | 15727..=15728 - | 15730..=15731 - | 15739..=15740 - | 15742..=15743 - | 15763..=15764 - | 15766..=15767 - | 15775..=15776 - | 15778..=15779 - | 15943..=15944 - | 15946..=15947 - | 15955..=15956 - | 15958..=15959 - | 15979..=15980 - | 15982..=15983 - | 15991..=15992 - | 15994..=15995 - | 16051..=16052 - | 16054..=16055 - | 16063..=16064 - | 16066..=16067 - | 16087..=16088 - | 16090..=16091 - | 16099..=16100 - | 16102..=16103 - | 16267..=16268 - | 16270..=16271 - | 16279..=16280 - | 16282..=16283 - | 16303..=16304 - | 16306..=16307 - | 16315..=16316 - | 16318..=16319 - | 16375..=16376 - | 16378..=16379 - | 16387..=16388 - | 16390..=16391 - | 16411..=16412 - | 16414..=16415 - | 16423..=16424 - | 16426..=16427 - | 16591..=16592 - | 16594..=16595 - | 16603..=16604 - | 16606..=16607 - | 16627..=16628 - | 16630..=16631 - | 16639..=16640 - | 16642..=16643 - | 16699..=16700 - | 16702..=16703 - | 16711..=16712 - | 16714..=16715 - | 16735..=16736 - | 16738..=16739 - | 16747..=16748 - | 16750..=16751 - | 16915..=16916 - | 16918..=16919 - | 16927..=16928 - | 16930..=16931 - | 16951..=16952 - | 16954..=16955 - | 16963..=16964 - | 16966..=16967 - | 17023..=17024 - | 17026..=17027 - | 17035..=17036 - | 17038..=17039 - | 17059..=17060 - | 17062..=17063 - | 17071..=17072 - | 17074..=17075 - | 17239..=17240 - | 17242..=17243 - | 17251..=17252 - | 17254..=17255 - | 17275..=17276 - | 17278..=17279 - | 17287..=17288 - | 17290..=17291 - | 17347..=17348 - | 17350..=17351 - | 17359..=17360 - | 17362..=17363 - | 17383..=17384 - | 17386..=17387 - | 17395..=17396 - | 17398..=17399 - | 17563..=17564 - | 17566..=17567 - | 17575..=17576 - | 17578..=17579 - | 17599..=17600 - | 17602..=17603 - | 17611..=17612 - | 17614..=17615 - | 17671..=17672 - | 17674..=17675 - | 17683..=17684 - | 17686..=17687 - | 17707..=17708 - | 17710..=17711 - | 17719..=17720 - | 17722..=17723 - | 17887..=17888 - | 17890..=17891 - | 17899..=17900 - | 17902..=17903 - | 17923..=17924 - | 17926..=17927 - | 17935..=17936 - | 17938..=17939 - | 17995..=17996 - | 17998..=17999 - | 18007..=18008 - | 18010..=18011 - | 18031..=18032 - | 18034..=18035 - | 18043..=18044 - | 18046..=18047 - | 18211..=18212 - | 18214..=18215 - | 18223..=18224 - | 18226..=18227 - | 18247..=18248 - | 18250..=18251 - | 18259..=18260 - | 18262..=18263 - | 18319..=18320 - | 18322..=18323 - | 18331..=18332 - | 18334..=18335 - | 18355..=18356 - | 18358..=18359 - | 18367..=18368 - | 18370..=18371 - | 19704..=19705 - | 19707..=19708 - | 19716..=19717 - | 19719..=19720 - | 19740..=19741 - | 19743..=19744 - | 19752..=19753 - | 19755..=19756 - | 19812..=19813 - | 19815..=19816 - | 19824..=19825 - | 19827..=19828 - | 19848..=19849 - | 19851..=19852 - | 19860..=19861 - | 19863..=19864 - | 20124..=20125 - | 20127..=20128 - | 20136..=20137 - | 20139..=20140 - | 20160..=20161 - | 20163..=20164 - | 20172..=20173 - | 20175..=20176 - | 20232..=20233 - | 20235..=20236 - | 20244..=20245 - | 20247..=20248 - | 20268..=20269 - | 20271..=20272 - | 20280..=20281 - | 20283..=20284 - | 20561..=20562 - | 20564..=20565 - | 20573..=20574 - | 20576..=20577 - | 20597..=20598 - | 20600..=20601 - | 20609..=20610 - | 20612..=20613 - | 20669..=20670 - | 20672..=20673 - | 20681..=20682 - | 20684..=20685 - | 20705..=20706 - | 20708..=20709 - | 20717..=20718 - | 20720..=20721 - | 21331..=21332 - | 21334..=21335 - | 21343..=21344 - | 21346..=21347 - | 21367..=21368 - | 21370..=21371 - | 21379..=21380 - | 21382..=21383 - | 21439..=21440 - | 21442..=21443 - | 21451..=21452 - | 21454..=21455 - | 21475..=21476 - | 21478..=21479 - | 21487..=21488 - | 21490..=21491 - | 21742..=21743 - | 21745..=21746 - | 21754..=21755 - | 21757..=21758 - | 21778..=21779 - | 21781..=21782 - | 21790..=21791 - | 21793..=21794 - | 21850..=21851 - | 21853..=21854 - | 21862..=21863 - | 21865..=21866 - | 21886..=21887 - | 21889..=21890 - | 21898..=21899 - | 21901..=21902 - | 22154..=22155 - | 22157..=22158 - | 22166..=22167 - | 22169..=22170 - | 22190..=22191 - | 22193..=22194 - | 22202..=22203 - | 22205..=22206 - | 22262..=22263 - | 22265..=22266 - | 22274..=22275 - | 22277..=22278 - | 22298..=22299 - | 22301..=22302 - | 22310..=22311 - | 22313..=22314 - | 25157..=25158 - | 25160..=25161 - | 25169..=25170 - | 25172..=25173 - | 25193..=25194 - | 25196..=25197 - | 25205..=25206 - | 25208..=25209 - | 25265..=25266 - | 25268..=25269 - | 25277..=25278 - | 25280..=25281 - | 25301..=25302 - | 25304..=25305 - | 25313..=25314 - | 25316..=25317 - | 25568..=25569 - | 25571..=25572 - | 25580..=25581 - | 25583..=25584 - | 25604..=25605 - | 25607..=25608 - | 25616..=25617 - | 25619..=25620 - | 25676..=25677 - | 25679..=25680 - | 25688..=25689 - | 25691..=25692 - | 25712..=25713 - | 25715..=25716 - | 25724..=25725 - | 25727..=25728 - | 25979..=25980 - | 25982..=25983 - | 25991..=25992 - | 25994..=25995 - | 26015..=26016 - | 26018..=26019 - | 26027..=26028 - | 26030..=26031 - | 26087..=26088 - | 26090..=26091 - | 26099..=26100 - | 26102..=26103 - | 26123..=26124 - | 26126..=26127 - | 26135..=26136 - | 26138..=26139 - | 26390..=26391 - | 26393..=26394 - | 26402..=26403 - | 26405..=26406 - | 26426..=26427 - | 26429..=26430 - | 26438..=26439 - | 26441..=26442 - | 26498..=26499 - | 26501..=26502 - | 26510..=26511 - | 26513..=26514 - | 26534..=26535 - | 26537..=26538 - | 26546..=26547 - | 26549..=26550 => &SHAPE166, - 8567..=8594 | 12957 | 19455..=19458 | 26561..=26562 => &SHAPE27, - 8827..=8858 | 8867..=8898 | 8907..=8938 | 8947..=8978 | 8987..=9018 | 9027..=9058 => { - &SHAPE169 - } - 8859..=8860 | 8899..=8900 | 8939..=8940 | 8979..=8980 | 9019..=9020 | 9059..=9060 => { - &SHAPE170 - } - 8861..=8862 | 8901..=8902 | 8941..=8942 | 8981..=8982 | 9021..=9022 | 9061..=9062 => { - &SHAPE171 - } - 8863..=8864 | 8903..=8904 | 8943..=8944 | 8983..=8984 | 9023..=9024 | 9063..=9064 => { - &SHAPE172 - } - 8865..=8866 | 8905..=8906 | 8945..=8946 | 8985..=8986 | 9025..=9026 | 9065..=9066 => { - &SHAPE173 - } - 9067..=9098 => &SHAPE174, - 9099..=9100 => &SHAPE175, - 9101..=9102 => &SHAPE176, - 9103..=9104 => &SHAPE177, - 9105..=9106 => &SHAPE178, - 9107..=9108 | 9111..=9112 | 9115..=9116 => &SHAPE179, - 9109..=9110 | 9113..=9114 | 9117..=9118 => &SHAPE180, - 9225 | 9230 => &SHAPE181, - 9226 | 9231 => &SHAPE182, - 9227 | 9232 => &SHAPE183, - 9228 | 9233 => &SHAPE184, - 9229 | 9234 => &SHAPE185, - 10706..=10707 - | 10712..=10713 - | 10718..=10719 - | 11162..=11163 - | 11168..=11169 - | 11174..=11175 - | 11180..=11181 - | 11186..=11187 - | 11192..=11193 - | 11198..=11199 - | 11204..=11205 - | 11210..=11211 - | 11216..=11217 - | 11222..=11223 - | 11228..=11229 - | 11234..=11235 - | 11240..=11241 - | 11246..=11247 - | 11252..=11253 - | 11258..=11259 - | 11264..=11265 - | 11270..=11271 - | 11276..=11277 - | 11282..=11283 - | 11288..=11289 - | 11294..=11295 - | 11300..=11301 - | 14082..=14083 - | 14088..=14089 - | 14094..=14095 - | 14100..=14101 - | 14106..=14107 - | 14112..=14113 - | 14118..=14119 - | 14124..=14125 - | 14130..=14131 - | 14136..=14137 - | 14142..=14143 - | 14148..=14149 - | 14154..=14155 - | 18668..=18669 - | 18674..=18675 - | 19865..=19866 - | 19875..=19876 - | 20366..=20367 - | 21082..=21083 - | 21493..=21494 - | 21905..=21906 - | 23276..=23277 - | 23282..=23283 - | 23288..=23289 - | 23294..=23295 - | 23628..=23629 - | 23634..=23635 - | 23640..=23641 - | 23646..=23647 - | 24988..=24989 - | 25399..=25400 - | 25810..=25811 - | 26221..=26222 => &SHAPE186, - 10728..=10743 | 24826 => &SHAPE28, - 12334 | 12336 | 24724..=24727 | 24732..=24735 => &SHAPE187, - 12335 | 12337 | 24728..=24731 | 24736..=24739 => &SHAPE188, - 12338..=12339 | 24740..=24747 => &SHAPE90, - 12340 => &SHAPE189, - 12341 => &SHAPE190, - 12342 => &SHAPE191, - 12343 => &SHAPE192, - 12344 => &SHAPE193, - 12345 => &SHAPE194, - 12346 => &SHAPE195, - 12347 => &SHAPE196, - 12348 => &SHAPE197, - 12349 => &SHAPE198, - 12350 => &SHAPE199, - 12351 => &SHAPE200, - 12352 => &SHAPE201, - 12353 => &SHAPE202, - 12354 => &SHAPE203, - 12355 => &SHAPE204, - 12356 => &SHAPE205, - 12357 => &SHAPE206, - 12358 => &SHAPE207, - 12359 => &SHAPE208, - 12360 => &SHAPE209, - 12361 => &SHAPE210, - 12362 => &SHAPE211, - 12363 => &SHAPE212, - 12364 => &SHAPE213, - 12365 => &SHAPE214, - 12366 => &SHAPE215, - 12367 => &SHAPE216, - 12368 => &SHAPE217, - 12369 | 24760..=24763 => &SHAPE68, - 12370 => &SHAPE218, - 12371 => &SHAPE219, - 12372 => &SHAPE220, - 12373 => &SHAPE221, - 12374 => &SHAPE222, - 12375 => &SHAPE223, - 12376 => &SHAPE224, - 12377 => &SHAPE225, - 12378 => &SHAPE226, - 12379 => &SHAPE227, - 12380 => &SHAPE228, - 12381 => &SHAPE229, - 12382 => &SHAPE230, - 12383 => &SHAPE231, - 12384 => &SHAPE232, - 12385 => &SHAPE233, - 12386 => &SHAPE234, - 12387 => &SHAPE235, - 12388 => &SHAPE236, - 12389 => &SHAPE237, - 12390 => &SHAPE238, - 12391 => &SHAPE239, - 12392 => &SHAPE240, - 12393 => &SHAPE241, - 12394 => &SHAPE242, - 12395 => &SHAPE243, - 12396 => &SHAPE244, - 12397 => &SHAPE245, - 12398 => &SHAPE246, - 12399 => &SHAPE247, - 12400 => &SHAPE248, - 12401 => &SHAPE249, - 12402 => &SHAPE250, - 12403 => &SHAPE251, - 12497..=12498 => &SHAPE252, - 12500 | 12502 | 12504 | 12506 => &SHAPE253, - 12788..=12790 => &SHAPE255, - 12791..=12799 => &SHAPE256, - 12800..=12802 => &SHAPE257, - 12933..=12934 => &SHAPE258, - 12935..=12936 => &SHAPE259, - 12937..=12938 => &SHAPE260, - 12939..=12940 => &SHAPE261, - 12942..=12943 => &SHAPE254, - 18372..=18403 => &SHAPE263, - 18438..=18439 => &SHAPE264, - 18440..=18441 => &SHAPE265, - 18442 => &SHAPE266, - 18443 => &SHAPE267, - 18444 => &SHAPE268, - 18445 => &SHAPE269, - 18446..=18447 => &SHAPE270, - 18448..=18449 => &SHAPE271, - 18450..=18465 => &SHAPE272, - 18467..=18470 => &SHAPE168, - 18471..=18474 => &SHAPE273, - 18475..=18478 => &SHAPE274, - 18479..=18486 => &SHAPE275, - 18487..=18488 => &SHAPE276, - 18489..=18490 => &SHAPE277, - 18491..=18492 => &SHAPE278, - 18493..=18494 => &SHAPE279, - 18495..=18498 => &SHAPE280, - 18499..=18502 => &SHAPE281, - 18503..=18504 | 18507..=18508 => &SHAPE282, - 18505..=18506 | 18509..=18510 => &SHAPE283, - 18511..=18574 => &SHAPE167, - 19372..=19380 => &SHAPE284, - 20725..=20728 - | 20741..=20744 - | 20757..=20760 - | 20773..=20776 - | 20789..=20792 - | 20805..=20808 - | 20821..=20824 - | 20837..=20840 - | 20853..=20856 - | 20869..=20872 - | 20885..=20888 - | 20901..=20904 - | 20917..=20920 - | 20933..=20936 - | 20949..=20952 - | 20965..=20968 - | 20981..=20984 => &SHAPE118, - 20729..=20732 - | 20745..=20748 - | 20761..=20764 - | 20777..=20780 - | 20793..=20796 - | 20809..=20812 - | 20825..=20828 - | 20841..=20844 - | 20857..=20860 - | 20873..=20876 - | 20889..=20892 - | 20905..=20908 - | 20921..=20924 - | 20937..=20940 - | 20953..=20956 - | 20969..=20972 - | 20985..=20988 => &SHAPE285, - 20733..=20736 - | 20749..=20752 - | 20765..=20768 - | 20781..=20784 - | 20797..=20800 - | 20813..=20816 - | 20829..=20832 - | 20845..=20848 - | 20861..=20864 - | 20877..=20880 - | 20893..=20896 - | 20909..=20912 - | 20925..=20928 - | 20941..=20944 - | 20957..=20960 - | 20973..=20976 - | 20989..=20992 => &SHAPE286, - 20737..=20740 - | 20753..=20756 - | 20769..=20772 - | 20785..=20788 - | 20801..=20804 - | 20817..=20820 - | 20833..=20836 - | 20849..=20852 - | 20865..=20868 - | 20881..=20884 - | 20897..=20900 - | 20913..=20916 - | 20929..=20932 - | 20945..=20948 - | 20961..=20964 - | 20977..=20980 - | 20993..=20996 => &SHAPE287, - 20997..=21030 => &SHAPE288, - 21033..=21034 => &SHAPE289, - 21035..=21036 => &SHAPE290, - 21037..=21038 => &SHAPE291, - 21039..=21040 => &SHAPE292, - 21041..=21042 => &SHAPE293, - 21043..=21044 => &SHAPE294, - 21045..=21046 => &SHAPE295, - 21047..=21048 => &SHAPE296, - 21049..=21050 => &SHAPE297, - 21051..=21052 => &SHAPE298, - 21053..=21054 => &SHAPE299, - 21055..=21056 => &SHAPE300, - 21057..=21058 => &SHAPE301, - 21059..=21060 => &SHAPE302, - 21061..=21062 => &SHAPE303, - 21063..=21064 => &SHAPE304, - 21065..=21066 => &SHAPE305, - 21067..=21068 => &SHAPE306, - 21069..=21070 => &SHAPE307, - 21071..=21072 => &SHAPE308, - 21073..=21074 => &SHAPE309, - 21075..=21076 => &SHAPE310, - 21077..=21078 => &SHAPE311, - 21079..=21080 => &SHAPE312, - 24748..=24751 => &SHAPE262, - 24752..=24753 => &SHAPE313, - 24754..=24755 => &SHAPE314, - 24756..=24759 => &SHAPE63, - 24764..=24767 => &SHAPE73, - 24824..=24825 => &SHAPE315, - 24844..=24847 | 24852..=24855 | 24860..=24863 | 24868..=24871 => &SHAPE316, - 24848..=24849 | 24856..=24857 | 24864..=24865 | 24872..=24873 => &SHAPE317, - _ => &SHAPE1, - } + SHAPES_MAP.get(self.id as usize).unwrap_or(&&SHAPE1) } fn is_shape_empty(&self) -> bool { @@ -8904,3 +1746,2995 @@ impl BlockWithShape for BlockState { matches!(self.id, 1..=24|79|112..=1687|1998..=2003|2017..=2022|2047..=2062|2091..=2354|2873|4274..=4277|4294..=4301|5734..=5737|5780..=5781|5798|5815..=5816|5849|5851..=5857|5863|5866..=5873|5945..=5960|6537..=6740|6811..=6812|7269..=7270|7272|7415|7417..=7418|7511..=7512|7665|7906..=7918|9223..=9224|9235..=9239|9344..=9371|10364..=10366|10463..=10465|10710..=10711|10716..=10717|10722..=10727|10744..=10746|11079..=11081|11166..=11167|11172..=11173|11178..=11179|11184..=11185|11190..=11191|11196..=11197|11202..=11203|11208..=11209|11214..=11215|11220..=11221|11226..=11227|11232..=11233|11238..=11239|11244..=11245|11250..=11251|11256..=11257|11262..=11263|11268..=11269|11274..=11275|11280..=11281|11286..=11287|11292..=11293|11298..=11299|11304..=11309|12404..=12413|12494|12515..=12548|12550..=12759|12787|12803..=12812|12941|14086..=14087|14092..=14093|14098..=14099|14104..=14105|14110..=14111|14116..=14117|14122..=14123|14128..=14129|14134..=14135|14140..=14141|14146..=14147|14152..=14153|14158..=14159|18404..=18437|18466|18579..=18591|18593|18596..=18608|18610|18666..=18667|18672..=18673|18678..=18679|19356..=19371|19381..=19444|19446..=19454|19459..=19460|19869..=19874|19879..=19880|20285|20370..=20371|20722..=20724|21031..=21032|21081|21086..=21087|21492|21497..=21498|21903..=21904|21909..=21910|22315..=22317|22799|22928..=22929|22938..=22955|23280..=23281|23286..=23287|23292..=23293|23298..=23307|23632..=23633|23638..=23639|23644..=23645|23650..=23651|24676..=24723|24768|24843|24902|24904..=24907|24992..=24993|25318|25403..=25404|25729|25814..=25815|26140|26225..=26226|26551..=26560|26563..=26571|26573|26590..=26643) } } + +static SHAPES_MAP: [&Lazy; 26644] = [ + &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE3, &SHAPE4, + &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, + &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, + &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, + &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, + &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, + &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, + &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, + &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, + &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, + &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, + &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, + &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, + &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, + &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, + &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, + &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, + &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, + &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, + &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, + &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, + &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, + &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, + &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, + &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE3, &SHAPE4, + &SHAPE3, &SHAPE4, &SHAPE4, &SHAPE3, &SHAPE4, &SHAPE3, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE6, + &SHAPE6, &SHAPE5, &SHAPE6, &SHAPE5, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE9, &SHAPE10, &SHAPE11, &SHAPE12, &SHAPE13, &SHAPE14, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE9, &SHAPE10, &SHAPE11, &SHAPE12, &SHAPE13, &SHAPE14, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE15, &SHAPE15, &SHAPE16, &SHAPE16, &SHAPE17, &SHAPE17, + &SHAPE18, &SHAPE18, &SHAPE19, &SHAPE19, &SHAPE20, &SHAPE20, &SHAPE21, &SHAPE21, &SHAPE22, + &SHAPE22, &SHAPE23, &SHAPE23, &SHAPE24, &SHAPE24, &SHAPE25, &SHAPE25, &SHAPE26, &SHAPE26, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE53, &SHAPE53, &SHAPE54, &SHAPE54, + &SHAPE55, &SHAPE55, &SHAPE53, &SHAPE53, &SHAPE55, &SHAPE55, &SHAPE54, &SHAPE54, &SHAPE53, + &SHAPE53, &SHAPE56, &SHAPE56, &SHAPE57, &SHAPE57, &SHAPE53, &SHAPE53, &SHAPE57, &SHAPE57, + &SHAPE56, &SHAPE56, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE62, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, + &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, + &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, + &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, + &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, + &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, + &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, + &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, + &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, + &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE69, &SHAPE69, + &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, + &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, + &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, + &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, + &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, + &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, + &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, + &SHAPE69, &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, + &SHAPE69, &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE69, &SHAPE69, &SHAPE69, + &SHAPE69, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE70, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE64, &SHAPE64, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE7, + &SHAPE58, &SHAPE59, &SHAPE8, &SHAPE60, &SHAPE13, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE71, + &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, + &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE71, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, + &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, + &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, + &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, + &SHAPE1, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE91, &SHAPE92, &SHAPE93, &SHAPE94, &SHAPE95, + &SHAPE96, &SHAPE97, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE100, &SHAPE101, &SHAPE100, + &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, + &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, + &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, + &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE115, &SHAPE115, &SHAPE116, &SHAPE116, + &SHAPE117, &SHAPE117, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, + &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, + &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, + &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, + &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, + &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, + &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, + &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, + &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, + &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, + &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, + &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE1, &SHAPE119, + &SHAPE1, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, + &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, + &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, + &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE13, + &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, &SHAPE120, + &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, &SHAPE121, + &SHAPE0, &SHAPE122, &SHAPE122, &SHAPE122, &SHAPE122, &SHAPE123, &SHAPE123, &SHAPE123, + &SHAPE123, &SHAPE1, &SHAPE72, &SHAPE1, &SHAPE1, &SHAPE124, &SHAPE125, &SHAPE126, &SHAPE127, + &SHAPE128, &SHAPE129, &SHAPE130, &SHAPE131, &SHAPE132, &SHAPE133, &SHAPE134, &SHAPE135, + &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, + &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, + &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, + &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, + &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, + &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, + &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, + &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, + &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, + &SHAPE1, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, &SHAPE53, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, + &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, + &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, + &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, + &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, + &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, + &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, + &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, + &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, + &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, + &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, + &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, + &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, + &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, + &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, + &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, + &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, + &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, + &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, + &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, + &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, + &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, + &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, + &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, + &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, + &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, + &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, + &SHAPE47, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, + &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, + &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, + &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, + &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, + &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, + &SHAPE27, &SHAPE27, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172, + &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172, + &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172, + &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172, + &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172, + &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE169, + &SHAPE169, &SHAPE169, &SHAPE169, &SHAPE170, &SHAPE170, &SHAPE171, &SHAPE171, &SHAPE172, + &SHAPE172, &SHAPE173, &SHAPE173, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, + &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, + &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, + &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE174, + &SHAPE174, &SHAPE174, &SHAPE174, &SHAPE175, &SHAPE175, &SHAPE176, &SHAPE176, &SHAPE177, + &SHAPE177, &SHAPE178, &SHAPE178, &SHAPE179, &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE179, + &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE179, &SHAPE179, &SHAPE180, &SHAPE180, &SHAPE53, + &SHAPE53, &SHAPE54, &SHAPE54, &SHAPE55, &SHAPE55, &SHAPE53, &SHAPE53, &SHAPE55, &SHAPE55, + &SHAPE54, &SHAPE54, &SHAPE53, &SHAPE53, &SHAPE56, &SHAPE56, &SHAPE57, &SHAPE57, &SHAPE53, + &SHAPE53, &SHAPE57, &SHAPE57, &SHAPE56, &SHAPE56, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE7, + &SHAPE7, &SHAPE7, &SHAPE7, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, + &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, + &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, + &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE59, &SHAPE1, + &SHAPE1, &SHAPE181, &SHAPE182, &SHAPE183, &SHAPE184, &SHAPE185, &SHAPE181, &SHAPE182, + &SHAPE183, &SHAPE184, &SHAPE185, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, + &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, + &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, + &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE100, + &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, + &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, + &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, + &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, + &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, + &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, + &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, + &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, + &SHAPE101, &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, + &SHAPE105, &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, + &SHAPE109, &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, + &SHAPE113, &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, + &SHAPE102, &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, + &SHAPE106, &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, + &SHAPE110, &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, + &SHAPE114, &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, + &SHAPE103, &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, + &SHAPE107, &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, + &SHAPE111, &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, + &SHAPE2, &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE100, &SHAPE101, &SHAPE100, &SHAPE101, &SHAPE102, &SHAPE103, + &SHAPE102, &SHAPE103, &SHAPE104, &SHAPE105, &SHAPE104, &SHAPE105, &SHAPE106, &SHAPE107, + &SHAPE106, &SHAPE107, &SHAPE108, &SHAPE109, &SHAPE108, &SHAPE109, &SHAPE110, &SHAPE111, + &SHAPE110, &SHAPE111, &SHAPE112, &SHAPE113, &SHAPE112, &SHAPE113, &SHAPE114, &SHAPE2, + &SHAPE114, &SHAPE2, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, + &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, + &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, + &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, + &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, + &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, + &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, + &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, + &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, + &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, + &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, + &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, + &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, + &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, + &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, + &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, + &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, + &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, + &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, + &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, + &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, + &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, + &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, + &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, + &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, + &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, + &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, + &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, + &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, + &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, + &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, + &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, + &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, + &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, + &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, + &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, + &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, + &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, + &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, + &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, + &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, + &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, + &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, + &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, + &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, + &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, + &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, + &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, + &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, + &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, + &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, + &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, + &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, + &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, + &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, &SHAPE28, + &SHAPE28, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, + &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, + &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, + &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, + &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, + &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, + &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE74, &SHAPE75, + &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, + &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, + &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, + &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, + &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, + &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, + &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, + &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, + &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, + &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, + &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, + &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, + &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, + &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, + &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, + &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, + &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, + &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, + &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, + &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, + &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, + &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, + &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, + &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, + &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, &SHAPE75, &SHAPE74, + &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, + &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, + &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, + &SHAPE88, &SHAPE89, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, + &SHAPE64, &SHAPE187, &SHAPE188, &SHAPE187, &SHAPE188, &SHAPE90, &SHAPE90, &SHAPE189, &SHAPE190, + &SHAPE191, &SHAPE192, &SHAPE193, &SHAPE194, &SHAPE195, &SHAPE196, &SHAPE197, &SHAPE198, + &SHAPE199, &SHAPE200, &SHAPE201, &SHAPE202, &SHAPE203, &SHAPE204, &SHAPE205, &SHAPE206, + &SHAPE207, &SHAPE208, &SHAPE209, &SHAPE210, &SHAPE211, &SHAPE212, &SHAPE213, &SHAPE214, + &SHAPE215, &SHAPE216, &SHAPE217, &SHAPE68, &SHAPE218, &SHAPE219, &SHAPE220, &SHAPE221, + &SHAPE222, &SHAPE223, &SHAPE224, &SHAPE225, &SHAPE226, &SHAPE227, &SHAPE228, &SHAPE229, + &SHAPE230, &SHAPE231, &SHAPE232, &SHAPE233, &SHAPE234, &SHAPE235, &SHAPE236, &SHAPE237, + &SHAPE238, &SHAPE239, &SHAPE240, &SHAPE241, &SHAPE242, &SHAPE243, &SHAPE244, &SHAPE245, + &SHAPE246, &SHAPE247, &SHAPE248, &SHAPE249, &SHAPE250, &SHAPE251, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE252, + &SHAPE252, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253, &SHAPE0, &SHAPE253, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE62, &SHAPE0, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE1, &SHAPE255, &SHAPE255, &SHAPE255, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, + &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE256, &SHAPE257, &SHAPE257, &SHAPE257, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE258, &SHAPE258, &SHAPE259, &SHAPE259, &SHAPE260, &SHAPE260, &SHAPE261, &SHAPE261, + &SHAPE1, &SHAPE254, &SHAPE254, &SHAPE0, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, + &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE116, &SHAPE27, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, + &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, + &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, + &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, + &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, + &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, + &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, + &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, + &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, + &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, + &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, + &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, + &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, + &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, + &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, + &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, + &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, + &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, + &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, + &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, + &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, + &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, + &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, + &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, + &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, + &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, + &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, + &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, + &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, + &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, + &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, + &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, + &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, + &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, + &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, + &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, + &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, + &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, + &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, + &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, + &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, + &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, + &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, + &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, + &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, + &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, + &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, + &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, + &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, + &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, + &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, + &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, + &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, + &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, + &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, + &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, + &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, + &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, + &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, + &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, + &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, + &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, + &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, + &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, + &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, + &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, + &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, + &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, + &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, + &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, + &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, + &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, + &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, + &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, + &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, + &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, + &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, + &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, + &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, + &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, + &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, + &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, + &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, + &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, + &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, + &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, + &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, + &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, + &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, + &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, + &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, + &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, + &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, + &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, + &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, + &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, + &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, + &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, + &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, &SHAPE263, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE264, &SHAPE264, &SHAPE265, &SHAPE265, &SHAPE266, + &SHAPE267, &SHAPE268, &SHAPE269, &SHAPE270, &SHAPE270, &SHAPE271, &SHAPE271, &SHAPE272, + &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, + &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE272, &SHAPE1, + &SHAPE168, &SHAPE168, &SHAPE168, &SHAPE168, &SHAPE273, &SHAPE273, &SHAPE273, &SHAPE273, + &SHAPE274, &SHAPE274, &SHAPE274, &SHAPE274, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275, + &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE275, &SHAPE276, &SHAPE276, &SHAPE277, &SHAPE277, + &SHAPE278, &SHAPE278, &SHAPE279, &SHAPE279, &SHAPE280, &SHAPE280, &SHAPE280, &SHAPE280, + &SHAPE281, &SHAPE281, &SHAPE281, &SHAPE281, &SHAPE282, &SHAPE282, &SHAPE283, &SHAPE283, + &SHAPE282, &SHAPE282, &SHAPE283, &SHAPE283, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, + &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE167, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, + &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE74, &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, + &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, + &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, + &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE74, + &SHAPE75, &SHAPE74, &SHAPE75, &SHAPE76, &SHAPE77, &SHAPE76, &SHAPE77, &SHAPE78, &SHAPE79, + &SHAPE78, &SHAPE79, &SHAPE80, &SHAPE81, &SHAPE80, &SHAPE81, &SHAPE82, &SHAPE83, &SHAPE82, + &SHAPE83, &SHAPE84, &SHAPE85, &SHAPE84, &SHAPE85, &SHAPE86, &SHAPE87, &SHAPE86, &SHAPE87, + &SHAPE88, &SHAPE89, &SHAPE88, &SHAPE89, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, + &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE80, &SHAPE80, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, + &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, &SHAPE83, &SHAPE0, &SHAPE0, &SHAPE83, + &SHAPE83, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, + &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, + &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, + &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, + &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, + &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, + &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, + &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, + &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, + &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, + &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, + &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, + &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, + &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, + &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, + &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, + &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, + &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, + &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE284, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE71, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE27, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE186, + &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE186, + &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, + &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, + &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, + &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, + &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, + &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, + &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, + &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, + &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, + &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, + &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, + &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE118, &SHAPE118, &SHAPE118, &SHAPE118, + &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE285, &SHAPE286, &SHAPE286, &SHAPE286, &SHAPE286, + &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE287, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, + &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, + &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, + &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, + &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE288, &SHAPE1, &SHAPE1, &SHAPE289, + &SHAPE289, &SHAPE290, &SHAPE290, &SHAPE291, &SHAPE291, &SHAPE292, &SHAPE292, &SHAPE293, + &SHAPE293, &SHAPE294, &SHAPE294, &SHAPE295, &SHAPE295, &SHAPE296, &SHAPE296, &SHAPE297, + &SHAPE297, &SHAPE298, &SHAPE298, &SHAPE299, &SHAPE299, &SHAPE300, &SHAPE300, &SHAPE301, + &SHAPE301, &SHAPE302, &SHAPE302, &SHAPE303, &SHAPE303, &SHAPE304, &SHAPE304, &SHAPE305, + &SHAPE305, &SHAPE306, &SHAPE306, &SHAPE307, &SHAPE307, &SHAPE308, &SHAPE308, &SHAPE309, + &SHAPE309, &SHAPE310, &SHAPE310, &SHAPE311, &SHAPE311, &SHAPE312, &SHAPE312, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, + &SHAPE137, &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, + &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, + &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, + &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, + &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, + &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, + &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, + &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE0, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE1, &SHAPE1, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, + &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, + &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, + &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, + &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, + &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, + &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, + &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, + &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, + &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, + &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, + &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, + &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, + &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, + &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, + &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, + &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, + &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, + &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, + &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE29, &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, + &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, + &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, + &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, + &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, + &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, + &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, + &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, + &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, + &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, + &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, &SHAPE67, + &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE65, + &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE66, &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, + &SHAPE64, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, + &SHAPE67, &SHAPE67, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, + &SHAPE66, &SHAPE65, &SHAPE65, &SHAPE66, &SHAPE66, &SHAPE67, &SHAPE67, &SHAPE66, &SHAPE66, + &SHAPE67, &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE67, + &SHAPE67, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, &SHAPE64, &SHAPE64, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE67, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE66, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, + &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE65, &SHAPE99, + &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE98, &SHAPE98, + &SHAPE98, &SHAPE98, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE67, &SHAPE99, &SHAPE99, &SHAPE99, + &SHAPE99, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, + &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE66, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE64, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE98, &SHAPE64, &SHAPE64, + &SHAPE64, &SHAPE64, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE99, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE188, + &SHAPE188, &SHAPE188, &SHAPE188, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE187, &SHAPE188, + &SHAPE188, &SHAPE188, &SHAPE188, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, &SHAPE90, + &SHAPE90, &SHAPE90, &SHAPE262, &SHAPE262, &SHAPE262, &SHAPE262, &SHAPE313, &SHAPE313, + &SHAPE314, &SHAPE314, &SHAPE63, &SHAPE63, &SHAPE63, &SHAPE63, &SHAPE68, &SHAPE68, &SHAPE68, + &SHAPE68, &SHAPE73, &SHAPE73, &SHAPE73, &SHAPE73, &SHAPE1, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE315, &SHAPE315, &SHAPE28, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE1, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, + &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316, + &SHAPE316, &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE316, &SHAPE316, + &SHAPE316, &SHAPE316, &SHAPE317, &SHAPE317, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE0, + &SHAPE0, &SHAPE0, &SHAPE0, &SHAPE1, &SHAPE61, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE29, + &SHAPE29, &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, + &SHAPE34, &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, + &SHAPE38, &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, + &SHAPE43, &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, + &SHAPE47, &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, + &SHAPE43, &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, + &SHAPE35, &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, + &SHAPE40, &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, + &SHAPE36, &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, + &SHAPE8, &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, + &SHAPE137, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, + &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, + &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, + &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, + &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, + &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, + &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, + &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, + &SHAPE30, &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, + &SHAPE34, &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, + &SHAPE39, &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, + &SHAPE43, &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, + &SHAPE48, &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, + &SHAPE43, &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, + &SHAPE48, &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, + &SHAPE40, &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, + &SHAPE45, &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, + &SHAPE8, &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, + &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, + &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, + &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE29, &SHAPE29, &SHAPE30, + &SHAPE30, &SHAPE31, &SHAPE31, &SHAPE32, &SHAPE32, &SHAPE33, &SHAPE33, &SHAPE34, &SHAPE34, + &SHAPE35, &SHAPE35, &SHAPE36, &SHAPE36, &SHAPE37, &SHAPE37, &SHAPE38, &SHAPE38, &SHAPE39, + &SHAPE39, &SHAPE40, &SHAPE40, &SHAPE41, &SHAPE41, &SHAPE42, &SHAPE42, &SHAPE43, &SHAPE43, + &SHAPE44, &SHAPE44, &SHAPE45, &SHAPE45, &SHAPE46, &SHAPE46, &SHAPE47, &SHAPE47, &SHAPE48, + &SHAPE48, &SHAPE49, &SHAPE49, &SHAPE41, &SHAPE41, &SHAPE30, &SHAPE30, &SHAPE43, &SHAPE43, + &SHAPE32, &SHAPE32, &SHAPE50, &SHAPE50, &SHAPE46, &SHAPE46, &SHAPE35, &SHAPE35, &SHAPE48, + &SHAPE48, &SHAPE37, &SHAPE37, &SHAPE51, &SHAPE51, &SHAPE31, &SHAPE31, &SHAPE40, &SHAPE40, + &SHAPE33, &SHAPE33, &SHAPE42, &SHAPE42, &SHAPE52, &SHAPE52, &SHAPE36, &SHAPE36, &SHAPE45, + &SHAPE45, &SHAPE38, &SHAPE38, &SHAPE47, &SHAPE47, &SHAPE186, &SHAPE186, &SHAPE8, &SHAPE8, + &SHAPE1, &SHAPE1, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE136, &SHAPE137, &SHAPE137, &SHAPE0, + &SHAPE138, &SHAPE138, &SHAPE0, &SHAPE138, &SHAPE138, &SHAPE139, &SHAPE140, &SHAPE140, + &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, + &SHAPE142, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE139, &SHAPE140, &SHAPE140, &SHAPE141, + &SHAPE142, &SHAPE142, &SHAPE141, &SHAPE142, &SHAPE142, &SHAPE143, &SHAPE144, &SHAPE144, + &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, + &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE143, &SHAPE144, &SHAPE144, &SHAPE145, + &SHAPE146, &SHAPE146, &SHAPE145, &SHAPE146, &SHAPE146, &SHAPE147, &SHAPE148, &SHAPE148, + &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, + &SHAPE150, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE147, &SHAPE148, &SHAPE148, &SHAPE149, + &SHAPE150, &SHAPE150, &SHAPE149, &SHAPE150, &SHAPE150, &SHAPE151, &SHAPE152, &SHAPE152, + &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, + &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE151, &SHAPE152, &SHAPE152, &SHAPE153, + &SHAPE154, &SHAPE154, &SHAPE153, &SHAPE154, &SHAPE154, &SHAPE155, &SHAPE156, &SHAPE156, + &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, + &SHAPE158, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE155, &SHAPE156, &SHAPE156, &SHAPE157, + &SHAPE158, &SHAPE158, &SHAPE157, &SHAPE158, &SHAPE158, &SHAPE159, &SHAPE160, &SHAPE160, + &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, + &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE159, &SHAPE160, &SHAPE160, &SHAPE161, + &SHAPE162, &SHAPE162, &SHAPE161, &SHAPE162, &SHAPE162, &SHAPE163, &SHAPE164, &SHAPE164, + &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, + &SHAPE166, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE163, &SHAPE164, &SHAPE164, &SHAPE165, + &SHAPE166, &SHAPE166, &SHAPE165, &SHAPE166, &SHAPE166, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE27, &SHAPE27, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE0, &SHAPE1, &SHAPE72, + &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, + &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE72, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, + &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, &SHAPE1, +]; diff --git a/azalea-physics/src/collision/shape.rs b/azalea-physics/src/collision/shape.rs index 710074de2..edcfbf24d 100755 --- a/azalea-physics/src/collision/shape.rs +++ b/azalea-physics/src/collision/shape.rs @@ -323,7 +323,7 @@ impl Shapes { coords: coords1.to_vec(), } } else { - IndexMerger::new_indirect(&coords1, &coords2, var3, var4) + IndexMerger::new_indirect(coords1, coords2, var3, var4) } } } diff --git a/azalea-physics/src/collision/world_collisions.rs b/azalea-physics/src/collision/world_collisions.rs index 54493d622..9d25e9880 100644 --- a/azalea-physics/src/collision/world_collisions.rs +++ b/azalea-physics/src/collision/world_collisions.rs @@ -15,8 +15,8 @@ pub fn get_block_collisions(world: &Instance, aabb: AABB) -> Vec { let mut block_collisions = Vec::new(); let initial_chunk_pos = ChunkPos::from(state.cursor.origin()); - let initial_chunk = world.chunks.get(&initial_chunk_pos).unwrap(); - let initial_chunk = initial_chunk.read(); + let initial_chunk = world.chunks.get(&initial_chunk_pos); + let initial_chunk = initial_chunk.as_deref().map(RwLock::read); while let Some(item) = state.cursor.next() { if item.iteration_type == CursorIterationType::Corner { @@ -25,9 +25,13 @@ pub fn get_block_collisions(world: &Instance, aabb: AABB) -> Vec { let item_chunk_pos = ChunkPos::from(item.pos); let block_state: BlockState = if item_chunk_pos == initial_chunk_pos { - initial_chunk - .get(&ChunkBlockPos::from(item.pos), state.world.chunks.min_y) - .unwrap_or(BlockState::AIR) + if let Some(initial_chunk) = &initial_chunk { + initial_chunk + .get(&ChunkBlockPos::from(item.pos), state.world.chunks.min_y) + .unwrap_or(BlockState::AIR) + } else { + BlockState::AIR + } } else { state.get_block_state(item.pos) }; @@ -81,7 +85,6 @@ pub struct BlockCollisionsState<'a> { pub aabb: AABB, pub entity_shape: VoxelShape, pub cursor: Cursor3d, - pub only_suffocating_blocks: bool, cached_sections: Vec<(ChunkSectionPos, azalea_world::Section)>, cached_block_shapes: Vec<(BlockState, &'static VoxelShape)>, @@ -108,7 +111,6 @@ impl<'a> BlockCollisionsState<'a> { aabb, entity_shape: VoxelShape::from(aabb), cursor, - only_suffocating_blocks: false, cached_sections: Vec::new(), cached_block_shapes: Vec::new(), diff --git a/azalea-protocol/Cargo.toml b/azalea-protocol/Cargo.toml index d80255898..e3a02db49 100644 --- a/azalea-protocol/Cargo.toml +++ b/azalea-protocol/Cargo.toml @@ -4,58 +4,59 @@ edition = "2021" license = "MIT" name = "azalea-protocol" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-protocol" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -async-recursion = "1.0.5" -azalea-auth = { path = "../azalea-auth", version = "0.9.0" } -azalea-block = { path = "../azalea-block", default-features = false, version = "0.9.0" } -azalea-brigadier = { path = "../azalea-brigadier", version = "0.9.0", features = [ +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +async-recursion = "1.1.0" +azalea-auth = { path = "../azalea-auth", version = "0.10.0" } +azalea-block = { path = "../azalea-block", default-features = false, version = "0.10.0" } +azalea-brigadier = { path = "../azalea-brigadier", version = "0.10.0", features = [ "azalea-buf", ] } -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-chat = { path = "../azalea-chat", version = "0.9.0", features = [ +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-chat = { path = "../azalea-chat", version = "0.10.0", features = [ "numbers", + "azalea-buf", ] } -azalea-core = { path = "../azalea-core", optional = true, version = "0.9.0", features = [ +azalea-core = { path = "../azalea-core", optional = true, version = "0.10.0", features = [ "serde", ] } -azalea-crypto = { path = "../azalea-crypto", version = "0.9.0" } -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } -azalea-protocol-macros = { path = "./azalea-protocol-macros", version = "0.9.0" } -azalea-registry = { path = "../azalea-registry", version = "0.9.0" } -azalea-world = { path = "../azalea-world", version = "0.9.0" } -bevy_ecs = { version = "0.13.0", default-features = false } +azalea-crypto = { path = "../azalea-crypto", version = "0.10.0" } +azalea-protocol-macros = { path = "./azalea-protocol-macros", version = "0.10.0" } +azalea-registry = { path = "../azalea-registry", version = "0.10.0" } +azalea-world = { path = "../azalea-world", version = "0.10.0" } +bevy_ecs = { version = "0.13.2", default-features = false } byteorder = "^1.5.0" -bytes = "^1.5.0" +bytes = "^1.6.0" flate2 = "1.0.28" futures = "0.3.30" -futures-lite = "2.2.0" +futures-lite = "2.3.0" futures-util = "0.3.30" tracing = "0.1.40" serde = { version = "^1.0", features = ["serde_derive"] } -serde_json = "^1.0.113" -thiserror = "1.0.57" -tokio = { version = "^1.36.0", features = ["io-util", "net", "macros"] } +serde_json = "^1.0.116" +thiserror = "1.0.59" +tokio = { version = "^1.37.0", features = ["io-util", "net", "macros"] } tokio-util = { version = "0.7.10", features = ["codec"] } trust-dns-resolver = { version = "^0.23.2", default-features = false, features = [ "tokio-runtime", ] } -uuid = "1.7.0" -log = "0.4.20" +uuid = "1.8.0" +log = "0.4.21" +azalea-entity = { version = "0.10.0", path = "../azalea-entity" } +azalea-inventory = { version = "0.10.0", path = "../azalea-inventory" } +socks5-impl = "0.5.12" [features] connecting = [] default = ["packets"] packets = ["connecting", "dep:azalea-core"] -strict_registry = ["packets"] [dev-dependencies] -anyhow = "^1.0.79" +anyhow = "^1.0.82" tracing = "^0.1.40" tracing-subscriber = "^0.3.18" once_cell = "1.19.0" diff --git a/azalea-protocol/azalea-protocol-macros/Cargo.toml b/azalea-protocol/azalea-protocol-macros/Cargo.toml index f37ca2ab1..28dcf2ac0 100644 --- a/azalea-protocol/azalea-protocol-macros/Cargo.toml +++ b/azalea-protocol/azalea-protocol-macros/Cargo.toml @@ -3,7 +3,7 @@ description = "Macros internally used in azalea-protocol." edition = "2021" license = "MIT" name = "azalea-protocol-macros" -version = "0.9.0" +version = "0.10.0" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-protocol/azalea-protocol-macros" [lib] @@ -11,6 +11,6 @@ proc-macro = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -proc-macro2 = "^1.0.78" -quote = "^1.0.35" -syn = "^2.0.49" +proc-macro2 = "^1.0.81" +quote = "^1.0.36" +syn = "^2.0.60" diff --git a/azalea-protocol/azalea-protocol-macros/src/lib.rs b/azalea-protocol/azalea-protocol-macros/src/lib.rs index 0c072b849..756d0d825 100755 --- a/azalea-protocol/azalea-protocol-macros/src/lib.rs +++ b/azalea-protocol/azalea-protocol-macros/src/lib.rs @@ -12,7 +12,8 @@ fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> Toke let syn::Data::Struct(syn::DataStruct { fields, .. }) = &data else { panic!("#[derive(*Packet)] can only be used on structs") }; - let syn::Fields::Named(_) = fields else { + + let (syn::Fields::Named(_) | syn::Fields::Unit) = fields else { panic!("#[derive(*Packet)] can only be used on structs with named fields") }; let variant_name = variant_name_from(&ident); diff --git a/azalea-protocol/examples/handshake_proxy.rs b/azalea-protocol/examples/handshake_proxy.rs index a7ac67c74..442db3869 100644 --- a/azalea-protocol/examples/handshake_proxy.rs +++ b/azalea-protocol/examples/handshake_proxy.rs @@ -16,7 +16,7 @@ use azalea_protocol::{ }, ServerboundStatusPacket, }, - ConnectionProtocol, PROTOCOL_VERSION, + ClientIntention, PROTOCOL_VERSION, }, read::ReadPacketError, }; @@ -95,7 +95,7 @@ async fn handle_connection(stream: TcpStream) -> anyhow::Result<()> { match intent.intention { // If the client is pinging the proxy, // reply with the information below. - ConnectionProtocol::Status => { + ClientIntention::Status => { let mut conn = conn.status(); loop { match conn.read().await { @@ -135,7 +135,7 @@ async fn handle_connection(stream: TcpStream) -> anyhow::Result<()> { // wait for them to send the `Hello` packet to // log their username and uuid, then forward the // connection along to the proxy target. - ConnectionProtocol::Login => { + ClientIntention::Login => { let mut conn = conn.login(); loop { match conn.read().await { @@ -169,8 +169,8 @@ async fn handle_connection(stream: TcpStream) -> anyhow::Result<()> { } } } - _ => { - warn!("Client provided weird intent: {:?}", intent.intention); + ClientIntention::Transfer => { + warn!("Client attempted to join via transfer") } } diff --git a/azalea-protocol/src/connect.rs b/azalea-protocol/src/connect.rs index 86b926938..691d25c06 100755 --- a/azalea-protocol/src/connect.rs +++ b/azalea-protocol/src/connect.rs @@ -20,7 +20,7 @@ use std::io::Cursor; use std::marker::PhantomData; use std::net::SocketAddr; use thiserror::Error; -use tokio::io::AsyncWriteExt; +use tokio::io::{AsyncWriteExt, BufStream}; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf, ReuniteError}; use tokio::net::TcpStream; use tracing::{error, info}; @@ -61,7 +61,7 @@ pub struct WriteConnection { /// resolver, /// connect::Connection, /// packets::{ -/// ConnectionProtocol, PROTOCOL_VERSION, +/// ClientIntention, PROTOCOL_VERSION, /// login::{ /// ClientboundLoginPacket, /// serverbound_hello_packet::ServerboundHelloPacket, @@ -82,7 +82,7 @@ pub struct WriteConnection { /// protocol_version: PROTOCOL_VERSION, /// hostname: resolved_address.ip().to_string(), /// port: resolved_address.port(), -/// intention: ConnectionProtocol::Login, +/// intention: ClientIntention::Login, /// } /// .get(), /// ) @@ -104,12 +104,12 @@ pub struct WriteConnection { /// let packet = conn.read().await?; /// match packet { /// ClientboundLoginPacket::Hello(p) => { -/// let e = azalea_crypto::encrypt(&p.public_key, &p.nonce).unwrap(); +/// let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap(); /// /// conn.write( /// ServerboundKeyPacket { /// key_bytes: e.encrypted_public_key, -/// encrypted_challenge: e.encrypted_nonce, +/// encrypted_challenge: e.encrypted_challenge, /// } /// .get(), /// ) @@ -127,6 +127,7 @@ pub struct WriteConnection { /// return Err("login disconnect".into()); /// } /// ClientboundLoginPacket::CustomQuery(p) => {} +/// ClientboundLoginPacket::CookieRequest(_) => {} /// } /// }; /// @@ -257,6 +258,20 @@ pub enum ConnectionError { Io(#[from] std::io::Error), } +use socks5_impl::protocol::UserKey; + +#[derive(Debug, Clone)] +pub struct Proxy { + pub addr: SocketAddr, + pub auth: Option, +} + +impl Proxy { + pub fn new(addr: SocketAddr, auth: Option) -> Self { + Self { addr, auth } + } +} + impl Connection { /// Create a new connection to the given address. pub async fn new(address: &SocketAddr) -> Result { @@ -265,6 +280,28 @@ impl Connection { // enable tcp_nodelay stream.set_nodelay(true)?; + Self::new_from_stream(stream).await + } + + /// Create a new connection to the given address and Socks5 proxy. If you're + /// not using a proxy, use [`Self::new`] instead. + pub async fn new_with_proxy( + address: &SocketAddr, + proxy: Proxy, + ) -> Result { + let proxy_stream = TcpStream::connect(proxy.addr).await?; + let mut stream = BufStream::new(proxy_stream); + + let _ = socks5_impl::client::connect(&mut stream, address, proxy.auth) + .await + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?; + + Self::new_from_stream(stream.into_inner()).await + } + + /// Create a new connection from an existing stream. Useful if you want to + /// set custom options on the stream. Otherwise, just use [`Self::new`]. + pub async fn new_from_stream(stream: TcpStream) -> Result { let (read_stream, write_stream) = stream.into_split(); Ok(Connection { @@ -368,7 +405,7 @@ impl Connection { /// match conn.read().await? { /// ClientboundLoginPacket::Hello(p) => { /// // tell Mojang we're joining the server & enable encryption - /// let e = azalea_crypto::encrypt(&p.public_key, &p.nonce).unwrap(); + /// let e = azalea_crypto::encrypt(&p.public_key, &p.challenge).unwrap(); /// conn.authenticate( /// &access_token, /// &profile.id, @@ -378,7 +415,7 @@ impl Connection { /// conn.write( /// ServerboundKeyPacket { /// key_bytes: e.encrypted_public_key, - /// encrypted_challenge: e.encrypted_nonce, + /// encrypted_challenge: e.encrypted_challenge, /// }.get() /// ).await?; /// conn.set_encryption_key(e.secret_key); diff --git a/azalea-protocol/src/packets/common.rs b/azalea-protocol/src/packets/common.rs index 8ad0b753d..82f6be70d 100644 --- a/azalea-protocol/src/packets/common.rs +++ b/azalea-protocol/src/packets/common.rs @@ -7,7 +7,7 @@ use azalea_core::{ #[derive(Clone, Debug, McBuf)] pub struct CommonPlayerSpawnInfo { - pub dimension_type: ResourceLocation, + pub dimension_type: azalea_registry::DimensionType, pub dimension: ResourceLocation, pub seed: i64, pub game_type: GameMode, diff --git a/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs new file mode 100644 index 000000000..38566564a --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_cookie_request_packet.rs @@ -0,0 +1,8 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundCookieRequestPacket { + pub key: ResourceLocation, +} diff --git a/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs index 0e782092f..8bada6cad 100644 --- a/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs +++ b/azalea-protocol/src/packets/configuration/clientbound_registry_data_packet.rs @@ -1,8 +1,12 @@ +use std::collections::HashMap; + use azalea_buf::McBuf; -use azalea_core::registry_holder::RegistryHolder; +use azalea_core::resource_location::ResourceLocation; use azalea_protocol_macros::ClientboundConfigurationPacket; +use simdnbt::owned::NbtCompound; #[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] pub struct ClientboundRegistryDataPacket { - pub registry_holder: RegistryHolder, + pub registry_id: ResourceLocation, + pub entries: HashMap>, } diff --git a/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs new file mode 100644 index 000000000..75afa8c12 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_reset_chat_packet.rs @@ -0,0 +1,5 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundResetChatPacket; diff --git a/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs new file mode 100644 index 000000000..0f22b0547 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_select_known_packs_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +use super::serverbound_select_known_packs_packet::KnownPack; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundSelectKnownPacksPacket { + pub known_packs: Vec, +} diff --git a/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs new file mode 100644 index 000000000..fda166896 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_store_cookie_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundStoreCookiePacket { + pub key: ResourceLocation, + pub payload: Vec, +} diff --git a/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs b/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs new file mode 100644 index 000000000..88f0054a8 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/clientbound_transfer_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ClientboundConfigurationPacket)] +pub struct ClientboundTransferPacket { + pub host: String, + #[var] + pub port: u32, +} diff --git a/azalea-protocol/src/packets/configuration/mod.rs b/azalea-protocol/src/packets/configuration/mod.rs index 9516935f2..757c496c2 100755 --- a/azalea-protocol/src/packets/configuration/mod.rs +++ b/azalea-protocol/src/packets/configuration/mod.rs @@ -1,41 +1,56 @@ +pub mod clientbound_cookie_request_packet; pub mod clientbound_custom_payload_packet; pub mod clientbound_disconnect_packet; pub mod clientbound_finish_configuration_packet; pub mod clientbound_keep_alive_packet; pub mod clientbound_ping_packet; pub mod clientbound_registry_data_packet; +pub mod clientbound_reset_chat_packet; pub mod clientbound_resource_pack_pop_packet; pub mod clientbound_resource_pack_push_packet; +pub mod clientbound_select_known_packs_packet; +pub mod clientbound_store_cookie_packet; +pub mod clientbound_transfer_packet; pub mod clientbound_update_enabled_features_packet; pub mod clientbound_update_tags_packet; pub mod serverbound_client_information_packet; +pub mod serverbound_cookie_response_packet; pub mod serverbound_custom_payload_packet; pub mod serverbound_finish_configuration_packet; pub mod serverbound_keep_alive_packet; pub mod serverbound_pong_packet; pub mod serverbound_resource_pack_packet; +pub mod serverbound_select_known_packs_packet; + use azalea_protocol_macros::declare_state_packets; declare_state_packets!( ConfigurationPacket, Serverbound => { 0x00: serverbound_client_information_packet::ServerboundClientInformationPacket, - 0x01: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, - 0x02: serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket, - 0x03: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, - 0x04: serverbound_pong_packet::ServerboundPongPacket, - 0x05: serverbound_resource_pack_packet::ServerboundResourcePackPacket, + 0x01: serverbound_cookie_response_packet::ServerboundCookieResponsePacket, + 0x02: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, + 0x03: serverbound_finish_configuration_packet::ServerboundFinishConfigurationPacket, + 0x04: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, + 0x05: serverbound_pong_packet::ServerboundPongPacket, + 0x06: serverbound_resource_pack_packet::ServerboundResourcePackPacket, + 0x07: serverbound_select_known_packs_packet::ServerboundSelectKnownPacksPacket, }, Clientbound => { - 0x00: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, - 0x01: clientbound_disconnect_packet::ClientboundDisconnectPacket, - 0x02: clientbound_finish_configuration_packet::ClientboundFinishConfigurationPacket, - 0x03: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, - 0x04: clientbound_ping_packet::ClientboundPingPacket, - 0x05: clientbound_registry_data_packet::ClientboundRegistryDataPacket, - 0x06: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, - 0x07: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, - 0x08: clientbound_update_enabled_features_packet::ClientboundUpdateEnabledFeaturesPacket, - 0x09: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, + 0x00: clientbound_cookie_request_packet::ClientboundCookieRequestPacket, + 0x01: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, + 0x02: clientbound_disconnect_packet::ClientboundDisconnectPacket, + 0x03: clientbound_finish_configuration_packet::ClientboundFinishConfigurationPacket, + 0x04: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, + 0x05: clientbound_ping_packet::ClientboundPingPacket, + 0x06: clientbound_reset_chat_packet::ClientboundResetChatPacket, + 0x07: clientbound_registry_data_packet::ClientboundRegistryDataPacket, + 0x08: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, + 0x09: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, + 0x0a: clientbound_store_cookie_packet::ClientboundStoreCookiePacket, + 0x0b: clientbound_transfer_packet::ClientboundTransferPacket, + 0x0c: clientbound_update_enabled_features_packet::ClientboundUpdateEnabledFeaturesPacket, + 0x0d: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, + 0x0e: clientbound_select_known_packs_packet::ClientboundSelectKnownPacksPacket, } ); diff --git a/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs new file mode 100644 index 000000000..6c62c1c8b --- /dev/null +++ b/azalea-protocol/src/packets/configuration/serverbound_cookie_response_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ServerboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)] +pub struct ServerboundCookieResponsePacket { + pub key: ResourceLocation, + pub payload: Option>, +} diff --git a/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs b/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs new file mode 100644 index 000000000..fe379a176 --- /dev/null +++ b/azalea-protocol/src/packets/configuration/serverbound_select_known_packs_packet.rs @@ -0,0 +1,14 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ServerboundConfigurationPacket; + +#[derive(Clone, Debug, McBuf, ServerboundConfigurationPacket)] +pub struct ServerboundSelectKnownPacksPacket { + pub known_packs: Vec, +} + +#[derive(Clone, Debug, McBuf)] +pub struct KnownPack { + pub namespace: String, + pub id: String, + pub version: String, +} diff --git a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs b/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs index 59676fe5d..9c8782d07 100755 --- a/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_add_entity_packet.rs @@ -22,21 +22,6 @@ pub struct ClientboundAddEntityPacket { pub z_vel: i16, } -// impl From<&ClientboundAddEntityPacket> for EntityData { -// fn from(p: &ClientboundAddEntityPacket) -> Self { -// Self::new( -// p.uuid, -// Vec3 { -// x: p.x, -// y: p.y, -// z: p.z, -// }, -// // default metadata for the entity type -// EntityMetadata::from(p.entity_type), -// ) -// } -// } - impl ClientboundAddEntityPacket { /// Make the entity into a bundle that can be inserted into the ECS. You /// must apply the metadata after inserting the bundle with diff --git a/azalea-protocol/src/packets/game/clientbound_commands_packet.rs b/azalea-protocol/src/packets/game/clientbound_commands_packet.rs index d55ed50f1..822f62df5 100755 --- a/azalea-protocol/src/packets/game/clientbound_commands_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_commands_packet.rs @@ -128,6 +128,7 @@ pub enum BrigadierParser { Swizzle, Team, ItemSlot, + ItemSlots, ResourceLocation, Function, EntityAnchor, @@ -143,6 +144,9 @@ pub enum BrigadierParser { TemplateMirror, TemplateRotation, Heightmap, + LootTable, + LootPredicate, + LootModifier, Uuid, } diff --git a/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs new file mode 100755 index 000000000..9f1c1d438 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_cookie_request_packet.rs @@ -0,0 +1,8 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundGamePacket; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundCookieRequestPacket { + pub key: ResourceLocation, +} diff --git a/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs b/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs new file mode 100755 index 000000000..641fd05e2 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_debug_sample_packet.rs @@ -0,0 +1,10 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundGamePacket; + +use super::serverbound_debug_sample_subscription::RemoteDebugSampleType; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundDebugSamplePacket { + pub sample: Vec, + pub debug_sample_type: RemoteDebugSampleType, +} diff --git a/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs b/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs index 7cae607e0..b543d4f0a 100755 --- a/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_level_particles_packet.rs @@ -1,12 +1,9 @@ -use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; -use azalea_core::particle::ParticleData; +use azalea_buf::McBuf; +use azalea_entity::particle::Particle; use azalea_protocol_macros::ClientboundGamePacket; -use std::io::{Cursor, Write}; -#[derive(Clone, Debug, ClientboundGamePacket)] +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundLevelParticlesPacket { - #[var] - pub particle_id: u32, pub override_limiter: bool, pub x: f64, pub y: f64, @@ -16,53 +13,5 @@ pub struct ClientboundLevelParticlesPacket { pub z_dist: f32, pub max_speed: f32, pub count: u32, - pub data: ParticleData, -} - -impl McBufReadable for ClientboundLevelParticlesPacket { - fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let particle_id = u32::var_read_from(buf)?; - let override_limiter = bool::read_from(buf)?; - let x = f64::read_from(buf)?; - let y = f64::read_from(buf)?; - let z = f64::read_from(buf)?; - let x_dist = f32::read_from(buf)?; - let y_dist = f32::read_from(buf)?; - let z_dist = f32::read_from(buf)?; - let max_speed = f32::read_from(buf)?; - let count = u32::read_from(buf)?; - - let data = ParticleData::read_from_id(buf, particle_id)?; - - Ok(Self { - particle_id, - override_limiter, - x, - y, - z, - x_dist, - y_dist, - z_dist, - max_speed, - count, - data, - }) - } -} - -impl McBufWritable for ClientboundLevelParticlesPacket { - fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - self.particle_id.var_write_into(buf)?; - self.override_limiter.write_into(buf)?; - self.x.write_into(buf)?; - self.y.write_into(buf)?; - self.z.write_into(buf)?; - self.x_dist.write_into(buf)?; - self.y_dist.write_into(buf)?; - self.z_dist.write_into(buf)?; - self.max_speed.write_into(buf)?; - self.count.write_into(buf)?; - self.data.write_without_id(buf)?; - Ok(()) - } + pub particle: Particle, } diff --git a/azalea-protocol/src/packets/game/clientbound_login_packet.rs b/azalea-protocol/src/packets/game/clientbound_login_packet.rs index 1b70cbb9b..20ed30f00 100755 --- a/azalea-protocol/src/packets/game/clientbound_login_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_login_packet.rs @@ -23,4 +23,5 @@ pub struct ClientboundLoginPacket { pub show_death_screen: bool, pub do_limited_crafting: bool, pub common: CommonPlayerSpawnInfo, + pub enforces_secure_chat: bool, } diff --git a/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs b/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs index 1a9d9ffc3..a70a0aec5 100755 --- a/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_server_data_packet.rs @@ -6,5 +6,4 @@ use azalea_protocol_macros::ClientboundGamePacket; pub struct ClientboundServerDataPacket { pub motd: FormattedText, pub icon_bytes: Option>, - pub enforces_secure_chat: bool, } diff --git a/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs b/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs index 0acdc6877..00f3980ae 100755 --- a/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_set_equipment_packet.rs @@ -7,7 +7,7 @@ use std::io::Cursor; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundSetEquipmentPacket { #[var] - pub entity: i32, + pub entity_id: u32, pub slots: EquipmentSlots, } diff --git a/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs b/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs index c74488004..2e9252ae7 100755 --- a/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_sound_entity_packet.rs @@ -1,15 +1,27 @@ -use super::clientbound_sound_packet::SoundSource; use azalea_buf::McBuf; use azalea_protocol_macros::ClientboundGamePacket; -use azalea_registry::OptionalRegistry; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundSoundEntityPacket { - pub sound: OptionalRegistry, pub source: SoundSource, #[var] pub id: u32, pub volume: f32, pub pitch: f32, + #[var] pub seed: u64, } + +#[derive(McBuf, Clone, Copy, Debug)] +pub enum SoundSource { + Master = 0, + Music = 1, + Records = 2, + Weather = 3, + Blocks = 4, + Hostile = 5, + Neutral = 6, + Players = 7, + Ambient = 8, + Voice = 9, +} diff --git a/azalea-protocol/src/packets/game/clientbound_sound_packet.rs b/azalea-protocol/src/packets/game/clientbound_sound_packet.rs index e60485a16..4d2493ede 100755 --- a/azalea-protocol/src/packets/game/clientbound_sound_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_sound_packet.rs @@ -1,10 +1,10 @@ use azalea_buf::McBuf; -use azalea_core::resource_location::ResourceLocation; use azalea_protocol_macros::ClientboundGamePacket; +use azalea_registry::SoundEvent; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundSoundPacket { - pub sound: azalea_registry::CustomRegistry, + pub sound: SoundEvent, pub source: SoundSource, pub x: i32, pub y: i32, @@ -14,12 +14,6 @@ pub struct ClientboundSoundPacket { pub seed: u64, } -#[derive(McBuf, Clone, Debug)] -pub struct CustomSoundEvent { - pub location: ResourceLocation, - pub range: Option, -} - #[derive(McBuf, Clone, Copy, Debug)] pub enum SoundSource { Master = 0, diff --git a/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs b/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs new file mode 100644 index 000000000..1c8ada282 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_store_cookie_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ClientboundGamePacket; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundStoreCookiePacket { + pub key: ResourceLocation, + pub payload: Vec, +} diff --git a/azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs b/azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs index 420dfd36f..691a62a15 100755 --- a/azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_system_chat_packet.rs @@ -29,4 +29,17 @@ mod tests { "[py5: Gave 1 [Diamond Pickaxe] to py5]".to_string() ); } + + #[test] + fn test_translate_with_string_array_clientbound_system_chat_packet() { + #[rustfmt::skip] + let bytes = [ + 10, 9, 0, 4, 119, 105, 116, 104, 8, 0, 0, 0, 1, 0, 14, 109, 105, 110, 101, 99, 114, 97, 102, 116, 58, 100, 117, 115, 116, 8, 0, 9, 116, 114, 97, 110, 115, 108, 97, 116, 101, 0, 25, 99, 111, 109, 109, 97, 110, 100, 115, 46, 112, 97, 114, 116, 105, 99, 108, 101, 46, 115, 117, 99, 99, 101, 115, 115, 0, 0 + ]; + let packet = ClientboundSystemChatPacket::read_from(&mut Cursor::new(&bytes)).unwrap(); + assert_eq!( + packet.content.to_string(), + "Displaying particle minecraft:dust".to_string() + ); + } } diff --git a/azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs b/azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs index 47dd1ab2f..03557f5aa 100755 --- a/azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_tab_list_packet.rs @@ -7,3 +7,22 @@ pub struct ClientboundTabListPacket { pub header: FormattedText, pub footer: FormattedText, } + +#[cfg(test)] +mod tests { + use std::io::Cursor; + + use azalea_buf::McBufReadable; + + use super::*; + + #[test] + fn test_packet_from_viaversion() { + #[rustfmt::skip] + let mut bytes = Cursor::new(&[ + 10, 9, 0, 5, 101, 120, 116, 114, 97, 10, 0, 0, 0, 3, 1, 0, 4, 98, 111, 108, 100, 1, 8, 0, 4, 116, 101, 120, 116, 0, 16, 50, 66, 85, 73, 76, 68, 69, 82, 83, 50, 84, 79, 79, 76, 83, 10, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 114, 97, 121, 0, 8, 0, 0, 0, 1, 10, 0, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 111, 108, 100, 8, 0, 4, 116, 101, 120, 116, 0, 27, 80, 101, 110, 100, 105, 110, 103, 32, 99, 111, 110, 110, 101, 99, 116, 105, 111, 110, 32, 116, 111, 32, 50, 98, 50, 116, 10, 0, 8, 0, 4, 116, 101, 120, 116, 0, 1, 10, 0, 10, 9, 0, 5, 101, 120, 116, 114, 97, 10, 0, 0, 0, 1, 8, 0, 5, 99, 111, 108, 111, 114, 0, 4, 103, 111, 108, 100, 8, 0, 4, 116, 101, 120, 116, 0, 72, 84, 104, 105, 115, 32, 97, 99, 99, 111, 117, 110, 116, 32, 104, 97, 115, 32, 112, 114, 105, 111, 114, 105, 116, 121, 32, 115, 116, 97, 116, 117, 115, 32, 97, 110, 100, 32, 119, 105, 108, 108, 32, 98, 101, 32, 112, 108, 97, 99, 101, 100, 32, 105, 110, 32, 97, 32, 115, 104, 111, 114, 116, 101, 114, 32, 113, 117, 101, 117, 101, 46, 10, 0, 8, 0, 4, 116, 101, 120, 116, 0, 1, 10, 0 + ][..]); + let _packet = ClientboundTabListPacket::read_from(&mut bytes).unwrap(); + assert!(bytes.get_ref()[bytes.position() as usize..].is_empty()); + } +} diff --git a/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs b/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs new file mode 100644 index 000000000..dbce36e04 --- /dev/null +++ b/azalea-protocol/src/packets/game/clientbound_transfer_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ClientboundGamePacket; + +#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] +pub struct ClientboundTransferPacket { + pub host: String, + #[var] + pub port: u32, +} diff --git a/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs index 147d36186..19d4a7159 100755 --- a/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_update_attributes_packet.rs @@ -1,18 +1,18 @@ use azalea_buf::McBuf; -use azalea_core::resource_location::ResourceLocation; use azalea_entity::attributes::AttributeModifier; use azalea_protocol_macros::ClientboundGamePacket; +use azalea_registry::Attribute; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundUpdateAttributesPacket { #[var] pub entity_id: u32, - pub attributes: Vec, + pub values: Vec, } #[derive(Clone, Debug, McBuf)] pub struct AttributeSnapshot { - pub attribute: ResourceLocation, + pub attribute: Attribute, pub base: f64, pub modifiers: Vec, } diff --git a/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs index 37ffd9ce8..5c7abf3ae 100755 --- a/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_update_mob_effect_packet.rs @@ -1,15 +1,15 @@ use azalea_buf::McBuf; use azalea_protocol_macros::ClientboundGamePacket; -use simdnbt::owned::NbtTag; +use azalea_registry::MobEffect; #[derive(Clone, Debug, McBuf, ClientboundGamePacket)] pub struct ClientboundUpdateMobEffectPacket { #[var] pub entity_id: u32, - pub effect: azalea_registry::MobEffect, - pub effect_amplifier: u8, + pub mob_effect: MobEffect, + #[var] + pub effect_amplifier: u32, #[var] pub effect_duration_ticks: u32, pub flags: u8, - pub factor_data: Option, } diff --git a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs b/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs index 291cb580c..99f4ab05f 100755 --- a/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_update_recipes_packet.rs @@ -4,19 +4,17 @@ use azalea_buf::{ use azalea_core::resource_location::ResourceLocation; use azalea_inventory::ItemSlot; use azalea_protocol_macros::ClientboundGamePacket; -use azalea_registry::RecipeSerializer; use std::io::{Cursor, Write}; -use std::str::FromStr; #[derive(Clone, Debug, McBuf, PartialEq, ClientboundGamePacket)] pub struct ClientboundUpdateRecipesPacket { - pub recipes: Vec, + pub recipes: Vec, } -#[derive(Clone, Debug, PartialEq)] -pub struct Recipe { - pub identifier: ResourceLocation, +#[derive(Clone, Debug, PartialEq, McBuf)] +pub struct RecipeHolder { + pub id: ResourceLocation, pub data: RecipeData, } @@ -156,147 +154,6 @@ pub struct Ingredient { pub allowed: Vec, } -impl McBufWritable for Recipe { - fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { - let recipe_serializer = match &self.data { - RecipeData::CraftingShapeless(_) => RecipeSerializer::CraftingShapeless, - RecipeData::CraftingShaped(_) => RecipeSerializer::CraftingShaped, - RecipeData::CraftingSpecialArmorDye(_) => RecipeSerializer::CraftingSpecialArmordye, - RecipeData::CraftingSpecialBookCloning(_) => { - RecipeSerializer::CraftingSpecialBookcloning - } - RecipeData::CraftingSpecialMapCloning(_) => RecipeSerializer::CraftingSpecialMapcloning, - RecipeData::CraftingSpecialMapExtending(_) => { - RecipeSerializer::CraftingSpecialMapextending - } - RecipeData::CraftingSpecialFireworkRocket(_) => { - RecipeSerializer::CraftingSpecialFireworkRocket - } - RecipeData::CraftingSpecialFireworkStar(_) => { - RecipeSerializer::CraftingSpecialFireworkStar - } - - RecipeData::CraftingSpecialFireworkStarFade(_) => { - RecipeSerializer::CraftingSpecialFireworkStarFade - } - RecipeData::CraftingSpecialRepairItem(_) => RecipeSerializer::CraftingSpecialRepairitem, - RecipeData::CraftingSpecialTippedArrow(_) => { - RecipeSerializer::CraftingSpecialTippedarrow - } - RecipeData::CraftingSpecialBannerDuplicate(_) => { - RecipeSerializer::CraftingSpecialBannerduplicate - } - RecipeData::CraftingSpecialShieldDecoration(_) => { - RecipeSerializer::CraftingSpecialShielddecoration - } - RecipeData::CraftingSpecialShulkerBoxColoring(_) => { - RecipeSerializer::CraftingSpecialShulkerboxcoloring - } - RecipeData::CraftingSpecialSuspiciousStew(_) => { - RecipeSerializer::CraftingSpecialSuspiciousstew - } - RecipeData::Smelting(_) => RecipeSerializer::Smelting, - RecipeData::Blasting(_) => RecipeSerializer::Blasting, - RecipeData::Smoking(_) => RecipeSerializer::Smoking, - RecipeData::CampfireCooking(_) => RecipeSerializer::CampfireCooking, - RecipeData::Stonecutting(_) => RecipeSerializer::Stonecutting, - RecipeData::SmithingTransform(_) => RecipeSerializer::SmithingTransform, - RecipeData::SmithingTrim(_) => RecipeSerializer::SmithingTrim, - RecipeData::CraftingDecoratedPot(_) => RecipeSerializer::CraftingDecoratedPot, - }; - let resource_location = ResourceLocation::new(&recipe_serializer.to_string()); - resource_location.write_into(buf)?; - self.identifier.write_into(buf)?; - self.data.write_without_id(buf)?; - Ok(()) - } -} - -impl McBufReadable for Recipe { - fn read_from(buf: &mut Cursor<&[u8]>) -> Result { - let recipe_serializer_name = ResourceLocation::read_from(buf)?; - let Ok(recipe_serializer) = RecipeSerializer::from_str(&recipe_serializer_name.to_string()) - else { - return Err(BufReadError::UnexpectedStringEnumVariant { - id: recipe_serializer_name.to_string(), - }); - }; - let identifier = ResourceLocation::read_from(buf)?; - - // rust doesn't let us match ResourceLocation so we have to do a big - // if-else chain :( - let data = match recipe_serializer { - RecipeSerializer::CraftingShaped => { - RecipeData::CraftingShaped(ShapedRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingShapeless => { - RecipeData::CraftingShapeless(ShapelessRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialArmordye => { - RecipeData::CraftingSpecialArmorDye(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialBookcloning => { - RecipeData::CraftingSpecialBookCloning(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialMapcloning => { - RecipeData::CraftingSpecialMapCloning(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialMapextending => { - RecipeData::CraftingSpecialMapExtending(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialFireworkRocket => { - RecipeData::CraftingSpecialFireworkRocket(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialFireworkStar => { - RecipeData::CraftingSpecialFireworkStar(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialFireworkStarFade => { - RecipeData::CraftingSpecialFireworkStarFade(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialRepairitem => { - RecipeData::CraftingSpecialRepairItem(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialTippedarrow => { - RecipeData::CraftingSpecialTippedArrow(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialBannerduplicate => { - RecipeData::CraftingSpecialBannerDuplicate(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialShielddecoration => { - RecipeData::CraftingSpecialShieldDecoration(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialShulkerboxcoloring => { - RecipeData::CraftingSpecialShulkerBoxColoring(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingSpecialSuspiciousstew => { - RecipeData::CraftingSpecialSuspiciousStew(SimpleRecipe::read_from(buf)?) - } - RecipeSerializer::Smelting => RecipeData::Smelting(CookingRecipe::read_from(buf)?), - RecipeSerializer::Blasting => RecipeData::Blasting(CookingRecipe::read_from(buf)?), - RecipeSerializer::Smoking => RecipeData::Smoking(CookingRecipe::read_from(buf)?), - RecipeSerializer::CampfireCooking => { - RecipeData::CampfireCooking(CookingRecipe::read_from(buf)?) - } - RecipeSerializer::Stonecutting => { - RecipeData::Stonecutting(StoneCutterRecipe::read_from(buf)?) - } - RecipeSerializer::SmithingTransform => { - RecipeData::SmithingTransform(SmithingTransformRecipe::read_from(buf)?) - } - RecipeSerializer::SmithingTrim => { - RecipeData::SmithingTrim(SmithingTrimRecipe::read_from(buf)?) - } - RecipeSerializer::CraftingDecoratedPot => { - RecipeData::CraftingDecoratedPot(SimpleRecipe::read_from(buf)?) - } - }; - - let recipe = Recipe { identifier, data }; - - Ok(recipe) - } -} - #[cfg(test)] mod tests { use super::*; @@ -304,8 +161,8 @@ mod tests { #[test] fn test_crafting_shaped() { let mut buf = Vec::new(); - let recipe = Recipe { - identifier: ResourceLocation::new("minecraft:crafting_shaped"), + let recipe = RecipeHolder { + id: ResourceLocation::new("minecraft:crafting_shaped"), data: RecipeData::CraftingShaped(ShapedRecipe { group: String::new(), category: CraftingBookCategory::Building, @@ -332,15 +189,15 @@ mod tests { }), }; recipe.write_into(&mut buf).unwrap(); - let decoded_recipe = Recipe::read_from(&mut Cursor::new(&buf[..])).unwrap(); + let decoded_recipe = RecipeHolder::read_from(&mut Cursor::new(&buf[..])).unwrap(); assert_eq!(recipe, decoded_recipe); } #[test] fn test_crafting_shapeless() { let mut buf = Vec::new(); - let recipe = Recipe { - identifier: ResourceLocation::new("minecraft:crafting_shapeless"), + let recipe = RecipeHolder { + id: ResourceLocation::new("minecraft:crafting_shapeless"), data: RecipeData::CraftingShapeless(ShapelessRecipe { group: String::new(), category: CraftingBookCategory::Building, @@ -362,21 +219,21 @@ mod tests { }), }; recipe.write_into(&mut buf).unwrap(); - let decoded_recipe = Recipe::read_from(&mut Cursor::new(&buf[..])).unwrap(); + let decoded_recipe = RecipeHolder::read_from(&mut Cursor::new(&buf[..])).unwrap(); assert_eq!(recipe, decoded_recipe); } #[test] fn test_crafting_special_armordye() { let mut buf = Vec::new(); - let recipe = Recipe { - identifier: ResourceLocation::new("minecraft:crafting_special_armordye"), + let recipe = RecipeHolder { + id: ResourceLocation::new("minecraft:crafting_special_armordye"), data: RecipeData::CraftingSpecialArmorDye(SimpleRecipe { category: CraftingBookCategory::Building, }), }; recipe.write_into(&mut buf).unwrap(); - let decoded_recipe = Recipe::read_from(&mut Cursor::new(&buf[..])).unwrap(); + let decoded_recipe = RecipeHolder::read_from(&mut Cursor::new(&buf[..])).unwrap(); assert_eq!(recipe, decoded_recipe); } } diff --git a/azalea-protocol/src/packets/game/mod.rs b/azalea-protocol/src/packets/game/mod.rs index d45ea7b14..533dec8bb 100755 --- a/azalea-protocol/src/packets/game/mod.rs +++ b/azalea-protocol/src/packets/game/mod.rs @@ -20,10 +20,12 @@ pub mod clientbound_container_close_packet; pub mod clientbound_container_set_content_packet; pub mod clientbound_container_set_data_packet; pub mod clientbound_container_set_slot_packet; +pub mod clientbound_cookie_request_packet; pub mod clientbound_cooldown_packet; pub mod clientbound_custom_chat_completions_packet; pub mod clientbound_custom_payload_packet; pub mod clientbound_damage_event_packet; +pub mod clientbound_debug_sample_packet; pub mod clientbound_delete_chat_packet; pub mod clientbound_disconnect_packet; pub mod clientbound_disguised_chat_packet; @@ -103,6 +105,7 @@ pub mod clientbound_sound_entity_packet; pub mod clientbound_sound_packet; pub mod clientbound_start_configuration_packet; pub mod clientbound_stop_sound_packet; +pub mod clientbound_store_cookie_packet; pub mod clientbound_system_chat_packet; pub mod clientbound_tab_list_packet; pub mod clientbound_tag_query_packet; @@ -110,16 +113,18 @@ pub mod clientbound_take_item_entity_packet; pub mod clientbound_teleport_entity_packet; pub mod clientbound_ticking_state_packet; pub mod clientbound_ticking_step_packet; +pub mod clientbound_transfer_packet; pub mod clientbound_update_advancements_packet; pub mod clientbound_update_attributes_packet; pub mod clientbound_update_mob_effect_packet; pub mod clientbound_update_recipes_packet; pub mod clientbound_update_tags_packet; pub mod serverbound_accept_teleportation_packet; -pub mod serverbound_block_entity_tag_query; +pub mod serverbound_block_entity_tag_query_packet; pub mod serverbound_change_difficulty_packet; pub mod serverbound_chat_ack_packet; pub mod serverbound_chat_command_packet; +pub mod serverbound_chat_command_signed_packet; pub mod serverbound_chat_packet; pub mod serverbound_chat_session_update_packet; pub mod serverbound_chunk_batch_received_packet; @@ -131,9 +136,11 @@ pub mod serverbound_container_button_click_packet; pub mod serverbound_container_click_packet; pub mod serverbound_container_close_packet; pub mod serverbound_container_slot_state_changed_packet; +pub mod serverbound_cookie_response_packet; pub mod serverbound_custom_payload_packet; +pub mod serverbound_debug_sample_subscription; pub mod serverbound_edit_book_packet; -pub mod serverbound_entity_tag_query; +pub mod serverbound_entity_tag_query_packet; pub mod serverbound_interact_packet; pub mod serverbound_jigsaw_generate_packet; pub mod serverbound_keep_alive_packet; @@ -177,60 +184,63 @@ declare_state_packets!( GamePacket, Serverbound => { 0x00: serverbound_accept_teleportation_packet::ServerboundAcceptTeleportationPacket, - 0x01: serverbound_block_entity_tag_query::ServerboundBlockEntityTagQuery, + 0x01: serverbound_block_entity_tag_query_packet::ServerboundBlockEntityTagQueryPacket, 0x02: serverbound_change_difficulty_packet::ServerboundChangeDifficultyPacket, 0x03: serverbound_chat_ack_packet::ServerboundChatAckPacket, 0x04: serverbound_chat_command_packet::ServerboundChatCommandPacket, - 0x05: serverbound_chat_packet::ServerboundChatPacket, - 0x06: serverbound_chat_session_update_packet::ServerboundChatSessionUpdatePacket, - 0x07: serverbound_chunk_batch_received_packet::ServerboundChunkBatchReceivedPacket, - 0x08: serverbound_client_command_packet::ServerboundClientCommandPacket, - 0x09: serverbound_client_information_packet::ServerboundClientInformationPacket, - 0x0a: serverbound_command_suggestion_packet::ServerboundCommandSuggestionPacket, - 0x0b: serverbound_configuration_acknowledged_packet::ServerboundConfigurationAcknowledgedPacket, - 0x0c: serverbound_container_button_click_packet::ServerboundContainerButtonClickPacket, - 0x0d: serverbound_container_click_packet::ServerboundContainerClickPacket, - 0x0e: serverbound_container_close_packet::ServerboundContainerClosePacket, - 0x0f: serverbound_container_slot_state_changed_packet::ServerboundContainerSlotStateChangedPacket, - 0x10: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, - 0x11: serverbound_edit_book_packet::ServerboundEditBookPacket, - 0x12: serverbound_entity_tag_query::ServerboundEntityTagQuery, - 0x13: serverbound_interact_packet::ServerboundInteractPacket, - 0x14: serverbound_jigsaw_generate_packet::ServerboundJigsawGeneratePacket, - 0x15: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, - 0x16: serverbound_lock_difficulty_packet::ServerboundLockDifficultyPacket, - 0x17: serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket, - 0x18: serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket, - 0x19: serverbound_move_player_rot_packet::ServerboundMovePlayerRotPacket, - 0x1a: serverbound_move_player_status_only_packet::ServerboundMovePlayerStatusOnlyPacket, - 0x1b: serverbound_move_vehicle_packet::ServerboundMoveVehiclePacket, - 0x1c: serverbound_paddle_boat_packet::ServerboundPaddleBoatPacket, - 0x1d: serverbound_pick_item_packet::ServerboundPickItemPacket, - 0x1e: serverbound_ping_request_packet::ServerboundPingRequestPacket, - 0x1f: serverbound_place_recipe_packet::ServerboundPlaceRecipePacket, - 0x20: serverbound_player_abilities_packet::ServerboundPlayerAbilitiesPacket, - 0x21: serverbound_player_action_packet::ServerboundPlayerActionPacket, - 0x22: serverbound_player_command_packet::ServerboundPlayerCommandPacket, - 0x23: serverbound_player_input_packet::ServerboundPlayerInputPacket, - 0x24: serverbound_pong_packet::ServerboundPongPacket, - 0x25: serverbound_recipe_book_change_settings_packet::ServerboundRecipeBookChangeSettingsPacket, - 0x26: serverbound_recipe_book_seen_recipe_packet::ServerboundRecipeBookSeenRecipePacket, - 0x27: serverbound_rename_item_packet::ServerboundRenameItemPacket, - 0x28: serverbound_resource_pack_packet::ServerboundResourcePackPacket, - 0x29: serverbound_seen_advancements_packet::ServerboundSeenAdvancementsPacket, - 0x2a: serverbound_select_trade_packet::ServerboundSelectTradePacket, - 0x2b: serverbound_set_beacon_packet::ServerboundSetBeaconPacket, - 0x2c: serverbound_set_carried_item_packet::ServerboundSetCarriedItemPacket, - 0x2d: serverbound_set_command_block_packet::ServerboundSetCommandBlockPacket, - 0x2e: serverbound_set_command_minecart_packet::ServerboundSetCommandMinecartPacket, - 0x2f: serverbound_set_creative_mode_slot_packet::ServerboundSetCreativeModeSlotPacket, - 0x30: serverbound_set_jigsaw_block_packet::ServerboundSetJigsawBlockPacket, - 0x31: serverbound_set_structure_block_packet::ServerboundSetStructureBlockPacket, - 0x32: serverbound_sign_update_packet::ServerboundSignUpdatePacket, - 0x33: serverbound_swing_packet::ServerboundSwingPacket, - 0x34: serverbound_teleport_to_entity_packet::ServerboundTeleportToEntityPacket, - 0x35: serverbound_use_item_on_packet::ServerboundUseItemOnPacket, - 0x36: serverbound_use_item_packet::ServerboundUseItemPacket, + 0x05: serverbound_chat_command_signed_packet::ServerboundChatCommandSignedPacket, + 0x06: serverbound_chat_packet::ServerboundChatPacket, + 0x07: serverbound_chat_session_update_packet::ServerboundChatSessionUpdatePacket, + 0x08: serverbound_chunk_batch_received_packet::ServerboundChunkBatchReceivedPacket, + 0x09: serverbound_client_command_packet::ServerboundClientCommandPacket, + 0x0a: serverbound_client_information_packet::ServerboundClientInformationPacket, + 0x0b: serverbound_command_suggestion_packet::ServerboundCommandSuggestionPacket, + 0x0c: serverbound_configuration_acknowledged_packet::ServerboundConfigurationAcknowledgedPacket, + 0x0d: serverbound_container_button_click_packet::ServerboundContainerButtonClickPacket, + 0x0e: serverbound_container_click_packet::ServerboundContainerClickPacket, + 0x0f: serverbound_container_close_packet::ServerboundContainerClosePacket, + 0x10: serverbound_container_slot_state_changed_packet::ServerboundContainerSlotStateChangedPacket, + 0x11: serverbound_cookie_response_packet::ServerboundCookieResponsePacket, + 0x12: serverbound_custom_payload_packet::ServerboundCustomPayloadPacket, + 0x13: serverbound_debug_sample_subscription::ServerboundDebugSampleSubscription, + 0x14: serverbound_edit_book_packet::ServerboundEditBookPacket, + 0x15: serverbound_entity_tag_query_packet::ServerboundEntityTagQueryPacket, + 0x16: serverbound_interact_packet::ServerboundInteractPacket, + 0x17: serverbound_jigsaw_generate_packet::ServerboundJigsawGeneratePacket, + 0x18: serverbound_keep_alive_packet::ServerboundKeepAlivePacket, + 0x19: serverbound_lock_difficulty_packet::ServerboundLockDifficultyPacket, + 0x1a: serverbound_move_player_pos_packet::ServerboundMovePlayerPosPacket, + 0x1b: serverbound_move_player_pos_rot_packet::ServerboundMovePlayerPosRotPacket, + 0x1c: serverbound_move_player_rot_packet::ServerboundMovePlayerRotPacket, + 0x1d: serverbound_move_player_status_only_packet::ServerboundMovePlayerStatusOnlyPacket, + 0x1e: serverbound_move_vehicle_packet::ServerboundMoveVehiclePacket, + 0x1f: serverbound_paddle_boat_packet::ServerboundPaddleBoatPacket, + 0x20: serverbound_pick_item_packet::ServerboundPickItemPacket, + 0x21: serverbound_ping_request_packet::ServerboundPingRequestPacket, + 0x22: serverbound_place_recipe_packet::ServerboundPlaceRecipePacket, + 0x23: serverbound_player_abilities_packet::ServerboundPlayerAbilitiesPacket, + 0x24: serverbound_player_action_packet::ServerboundPlayerActionPacket, + 0x25: serverbound_player_command_packet::ServerboundPlayerCommandPacket, + 0x26: serverbound_player_input_packet::ServerboundPlayerInputPacket, + 0x27: serverbound_pong_packet::ServerboundPongPacket, + 0x28: serverbound_recipe_book_change_settings_packet::ServerboundRecipeBookChangeSettingsPacket, + 0x29: serverbound_recipe_book_seen_recipe_packet::ServerboundRecipeBookSeenRecipePacket, + 0x2a: serverbound_rename_item_packet::ServerboundRenameItemPacket, + 0x2b: serverbound_resource_pack_packet::ServerboundResourcePackPacket, + 0x2c: serverbound_seen_advancements_packet::ServerboundSeenAdvancementsPacket, + 0x2d: serverbound_select_trade_packet::ServerboundSelectTradePacket, + 0x2e: serverbound_set_beacon_packet::ServerboundSetBeaconPacket, + 0x2f: serverbound_set_carried_item_packet::ServerboundSetCarriedItemPacket, + 0x30: serverbound_set_command_block_packet::ServerboundSetCommandBlockPacket, + 0x31: serverbound_set_command_minecart_packet::ServerboundSetCommandMinecartPacket, + 0x32: serverbound_set_creative_mode_slot_packet::ServerboundSetCreativeModeSlotPacket, + 0x33: serverbound_set_jigsaw_block_packet::ServerboundSetJigsawBlockPacket, + 0x34: serverbound_set_structure_block_packet::ServerboundSetStructureBlockPacket, + 0x35: serverbound_sign_update_packet::ServerboundSignUpdatePacket, + 0x36: serverbound_swing_packet::ServerboundSwingPacket, + 0x37: serverbound_teleport_to_entity_packet::ServerboundTeleportToEntityPacket, + 0x38: serverbound_use_item_on_packet::ServerboundUseItemOnPacket, + 0x39: serverbound_use_item_packet::ServerboundUseItemPacket, }, Clientbound => { 0x00: clientbound_bundle_packet::ClientboundBundlePacket, @@ -255,100 +265,104 @@ declare_state_packets!( 0x13: clientbound_container_set_content_packet::ClientboundContainerSetContentPacket, 0x14: clientbound_container_set_data_packet::ClientboundContainerSetDataPacket, 0x15: clientbound_container_set_slot_packet::ClientboundContainerSetSlotPacket, - 0x16: clientbound_cooldown_packet::ClientboundCooldownPacket, - 0x17: clientbound_custom_chat_completions_packet::ClientboundCustomChatCompletionsPacket, - 0x18: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, - 0x19: clientbound_damage_event_packet::ClientboundDamageEventPacket, - 0x1a: clientbound_delete_chat_packet::ClientboundDeleteChatPacket, - 0x1b: clientbound_disconnect_packet::ClientboundDisconnectPacket, - 0x1c: clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket, - 0x1d: clientbound_entity_event_packet::ClientboundEntityEventPacket, - 0x1e: clientbound_explode_packet::ClientboundExplodePacket, - 0x1f: clientbound_forget_level_chunk_packet::ClientboundForgetLevelChunkPacket, - 0x20: clientbound_game_event_packet::ClientboundGameEventPacket, - 0x21: clientbound_horse_screen_open_packet::ClientboundHorseScreenOpenPacket, - 0x22: clientbound_hurt_animation_packet::ClientboundHurtAnimationPacket, - 0x23: clientbound_initialize_border_packet::ClientboundInitializeBorderPacket, - 0x24: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, - 0x25: clientbound_level_chunk_with_light_packet::ClientboundLevelChunkWithLightPacket, - 0x26: clientbound_level_event_packet::ClientboundLevelEventPacket, - 0x27: clientbound_level_particles_packet::ClientboundLevelParticlesPacket, - 0x28: clientbound_light_update_packet::ClientboundLightUpdatePacket, - 0x29: clientbound_login_packet::ClientboundLoginPacket, - 0x2a: clientbound_map_item_data_packet::ClientboundMapItemDataPacket, - 0x2b: clientbound_merchant_offers_packet::ClientboundMerchantOffersPacket, - 0x2c: clientbound_move_entity_pos_packet::ClientboundMoveEntityPosPacket, - 0x2d: clientbound_move_entity_pos_rot_packet::ClientboundMoveEntityPosRotPacket, - 0x2e: clientbound_move_entity_rot_packet::ClientboundMoveEntityRotPacket, - 0x2f: clientbound_move_vehicle_packet::ClientboundMoveVehiclePacket, - 0x30: clientbound_open_book_packet::ClientboundOpenBookPacket, - 0x31: clientbound_open_screen_packet::ClientboundOpenScreenPacket, - 0x32: clientbound_open_sign_editor_packet::ClientboundOpenSignEditorPacket, - 0x33: clientbound_ping_packet::ClientboundPingPacket, - 0x34: clientbound_pong_response_packet::ClientboundPongResponsePacket, - 0x35: clientbound_place_ghost_recipe_packet::ClientboundPlaceGhostRecipePacket, - 0x36: clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket, - 0x37: clientbound_player_chat_packet::ClientboundPlayerChatPacket, - 0x38: clientbound_player_combat_end_packet::ClientboundPlayerCombatEndPacket, - 0x39: clientbound_player_combat_enter_packet::ClientboundPlayerCombatEnterPacket, - 0x3a: clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, - 0x3b: clientbound_player_info_remove_packet::ClientboundPlayerInfoRemovePacket, - 0x3c: clientbound_player_info_update_packet::ClientboundPlayerInfoUpdatePacket, - 0x3d: clientbound_player_look_at_packet::ClientboundPlayerLookAtPacket, - 0x3e: clientbound_player_position_packet::ClientboundPlayerPositionPacket, - 0x3f: clientbound_recipe_packet::ClientboundRecipePacket, - 0x40: clientbound_remove_entities_packet::ClientboundRemoveEntitiesPacket, - 0x41: clientbound_remove_mob_effect_packet::ClientboundRemoveMobEffectPacket, - 0x42: clientbound_reset_score_packet::ClientboundResetScorePacket, - 0x43: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, - 0x44: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, - 0x45: clientbound_respawn_packet::ClientboundRespawnPacket, - 0x46: clientbound_rotate_head_packet::ClientboundRotateHeadPacket, - 0x47: clientbound_section_blocks_update_packet::ClientboundSectionBlocksUpdatePacket, - 0x48: clientbound_select_advancements_tab_packet::ClientboundSelectAdvancementsTabPacket, - 0x49: clientbound_server_data_packet::ClientboundServerDataPacket, - 0x4a: clientbound_set_action_bar_text_packet::ClientboundSetActionBarTextPacket, - 0x4b: clientbound_set_border_center_packet::ClientboundSetBorderCenterPacket, - 0x4c: clientbound_set_border_lerp_size_packet::ClientboundSetBorderLerpSizePacket, - 0x4d: clientbound_set_border_size_packet::ClientboundSetBorderSizePacket, - 0x4e: clientbound_set_border_warning_delay_packet::ClientboundSetBorderWarningDelayPacket, - 0x4f: clientbound_set_border_warning_distance_packet::ClientboundSetBorderWarningDistancePacket, - 0x50: clientbound_set_camera_packet::ClientboundSetCameraPacket, - 0x51: clientbound_set_carried_item_packet::ClientboundSetCarriedItemPacket, - 0x52: clientbound_set_chunk_cache_center_packet::ClientboundSetChunkCacheCenterPacket, - 0x53: clientbound_set_chunk_cache_radius_packet::ClientboundSetChunkCacheRadiusPacket, - 0x54: clientbound_set_default_spawn_position_packet::ClientboundSetDefaultSpawnPositionPacket, - 0x55: clientbound_set_display_objective_packet::ClientboundSetDisplayObjectivePacket, - 0x56: clientbound_set_entity_data_packet::ClientboundSetEntityDataPacket, - 0x57: clientbound_set_entity_link_packet::ClientboundSetEntityLinkPacket, - 0x58: clientbound_set_entity_motion_packet::ClientboundSetEntityMotionPacket, - 0x59: clientbound_set_equipment_packet::ClientboundSetEquipmentPacket, - 0x5a: clientbound_set_experience_packet::ClientboundSetExperiencePacket, - 0x5b: clientbound_set_health_packet::ClientboundSetHealthPacket, - 0x5c: clientbound_set_objective_packet::ClientboundSetObjectivePacket, - 0x5d: clientbound_set_passengers_packet::ClientboundSetPassengersPacket, - 0x5e: clientbound_set_player_team_packet::ClientboundSetPlayerTeamPacket, - 0x5f: clientbound_set_score_packet::ClientboundSetScorePacket, - 0x60: clientbound_set_simulation_distance_packet::ClientboundSetSimulationDistancePacket, - 0x61: clientbound_set_subtitle_text_packet::ClientboundSetSubtitleTextPacket, - 0x62: clientbound_set_time_packet::ClientboundSetTimePacket, - 0x63: clientbound_set_title_text_packet::ClientboundSetTitleTextPacket, - 0x64: clientbound_set_titles_animation_packet::ClientboundSetTitlesAnimationPacket, - 0x65: clientbound_sound_entity_packet::ClientboundSoundEntityPacket, - 0x66: clientbound_sound_packet::ClientboundSoundPacket, - 0x67: clientbound_start_configuration_packet::ClientboundStartConfigurationPacket, - 0x68: clientbound_stop_sound_packet::ClientboundStopSoundPacket, - 0x69: clientbound_system_chat_packet::ClientboundSystemChatPacket, - 0x6a: clientbound_tab_list_packet::ClientboundTabListPacket, - 0x6b: clientbound_tag_query_packet::ClientboundTagQueryPacket, - 0x6c: clientbound_take_item_entity_packet::ClientboundTakeItemEntityPacket, - 0x6d: clientbound_teleport_entity_packet::ClientboundTeleportEntityPacket, - 0x6e: clientbound_ticking_state_packet::ClientboundTickingStatePacket, - 0x6f: clientbound_ticking_step_packet::ClientboundTickingStepPacket, - 0x70: clientbound_update_advancements_packet::ClientboundUpdateAdvancementsPacket, - 0x71: clientbound_update_attributes_packet::ClientboundUpdateAttributesPacket, - 0x72: clientbound_update_mob_effect_packet::ClientboundUpdateMobEffectPacket, - 0x73: clientbound_update_recipes_packet::ClientboundUpdateRecipesPacket, - 0x74: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, + 0x16: clientbound_cookie_request_packet::ClientboundCookieRequestPacket, + 0x17: clientbound_cooldown_packet::ClientboundCooldownPacket, + 0x18: clientbound_custom_chat_completions_packet::ClientboundCustomChatCompletionsPacket, + 0x19: clientbound_custom_payload_packet::ClientboundCustomPayloadPacket, + 0x1a: clientbound_damage_event_packet::ClientboundDamageEventPacket, + 0x1b: clientbound_debug_sample_packet::ClientboundDebugSamplePacket, + 0x1c: clientbound_delete_chat_packet::ClientboundDeleteChatPacket, + 0x1d: clientbound_disconnect_packet::ClientboundDisconnectPacket, + 0x1e: clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket, + 0x1f: clientbound_entity_event_packet::ClientboundEntityEventPacket, + 0x20: clientbound_explode_packet::ClientboundExplodePacket, + 0x21: clientbound_forget_level_chunk_packet::ClientboundForgetLevelChunkPacket, + 0x22: clientbound_game_event_packet::ClientboundGameEventPacket, + 0x23: clientbound_horse_screen_open_packet::ClientboundHorseScreenOpenPacket, + 0x24: clientbound_hurt_animation_packet::ClientboundHurtAnimationPacket, + 0x25: clientbound_initialize_border_packet::ClientboundInitializeBorderPacket, + 0x26: clientbound_keep_alive_packet::ClientboundKeepAlivePacket, + 0x27: clientbound_level_chunk_with_light_packet::ClientboundLevelChunkWithLightPacket, + 0x28: clientbound_level_event_packet::ClientboundLevelEventPacket, + 0x29: clientbound_level_particles_packet::ClientboundLevelParticlesPacket, + 0x2a: clientbound_light_update_packet::ClientboundLightUpdatePacket, + 0x2b: clientbound_login_packet::ClientboundLoginPacket, + 0x2c: clientbound_map_item_data_packet::ClientboundMapItemDataPacket, + 0x2d: clientbound_merchant_offers_packet::ClientboundMerchantOffersPacket, + 0x2e: clientbound_move_entity_pos_packet::ClientboundMoveEntityPosPacket, + 0x2f: clientbound_move_entity_pos_rot_packet::ClientboundMoveEntityPosRotPacket, + 0x30: clientbound_move_entity_rot_packet::ClientboundMoveEntityRotPacket, + 0x31: clientbound_move_vehicle_packet::ClientboundMoveVehiclePacket, + 0x32: clientbound_open_book_packet::ClientboundOpenBookPacket, + 0x33: clientbound_open_screen_packet::ClientboundOpenScreenPacket, + 0x34: clientbound_open_sign_editor_packet::ClientboundOpenSignEditorPacket, + 0x35: clientbound_ping_packet::ClientboundPingPacket, + 0x36: clientbound_pong_response_packet::ClientboundPongResponsePacket, + 0x37: clientbound_place_ghost_recipe_packet::ClientboundPlaceGhostRecipePacket, + 0x38: clientbound_player_abilities_packet::ClientboundPlayerAbilitiesPacket, + 0x39: clientbound_player_chat_packet::ClientboundPlayerChatPacket, + 0x3a: clientbound_player_combat_end_packet::ClientboundPlayerCombatEndPacket, + 0x3b: clientbound_player_combat_enter_packet::ClientboundPlayerCombatEnterPacket, + 0x3c: clientbound_player_combat_kill_packet::ClientboundPlayerCombatKillPacket, + 0x3d: clientbound_player_info_remove_packet::ClientboundPlayerInfoRemovePacket, + 0x3e: clientbound_player_info_update_packet::ClientboundPlayerInfoUpdatePacket, + 0x3f: clientbound_player_look_at_packet::ClientboundPlayerLookAtPacket, + 0x40: clientbound_player_position_packet::ClientboundPlayerPositionPacket, + 0x41: clientbound_recipe_packet::ClientboundRecipePacket, + 0x42: clientbound_remove_entities_packet::ClientboundRemoveEntitiesPacket, + 0x43: clientbound_remove_mob_effect_packet::ClientboundRemoveMobEffectPacket, + 0x44: clientbound_reset_score_packet::ClientboundResetScorePacket, + 0x45: clientbound_resource_pack_pop_packet::ClientboundResourcePackPopPacket, + 0x46: clientbound_resource_pack_push_packet::ClientboundResourcePackPushPacket, + 0x47: clientbound_respawn_packet::ClientboundRespawnPacket, + 0x48: clientbound_rotate_head_packet::ClientboundRotateHeadPacket, + 0x49: clientbound_section_blocks_update_packet::ClientboundSectionBlocksUpdatePacket, + 0x4a: clientbound_select_advancements_tab_packet::ClientboundSelectAdvancementsTabPacket, + 0x4b: clientbound_server_data_packet::ClientboundServerDataPacket, + 0x4c: clientbound_set_action_bar_text_packet::ClientboundSetActionBarTextPacket, + 0x4d: clientbound_set_border_center_packet::ClientboundSetBorderCenterPacket, + 0x4e: clientbound_set_border_lerp_size_packet::ClientboundSetBorderLerpSizePacket, + 0x4f: clientbound_set_border_size_packet::ClientboundSetBorderSizePacket, + 0x50: clientbound_set_border_warning_delay_packet::ClientboundSetBorderWarningDelayPacket, + 0x51: clientbound_set_border_warning_distance_packet::ClientboundSetBorderWarningDistancePacket, + 0x52: clientbound_set_camera_packet::ClientboundSetCameraPacket, + 0x53: clientbound_set_carried_item_packet::ClientboundSetCarriedItemPacket, + 0x54: clientbound_set_chunk_cache_center_packet::ClientboundSetChunkCacheCenterPacket, + 0x55: clientbound_set_chunk_cache_radius_packet::ClientboundSetChunkCacheRadiusPacket, + 0x56: clientbound_set_default_spawn_position_packet::ClientboundSetDefaultSpawnPositionPacket, + 0x57: clientbound_set_display_objective_packet::ClientboundSetDisplayObjectivePacket, + 0x58: clientbound_set_entity_data_packet::ClientboundSetEntityDataPacket, + 0x59: clientbound_set_entity_link_packet::ClientboundSetEntityLinkPacket, + 0x5a: clientbound_set_entity_motion_packet::ClientboundSetEntityMotionPacket, + 0x5b: clientbound_set_equipment_packet::ClientboundSetEquipmentPacket, + 0x5c: clientbound_set_experience_packet::ClientboundSetExperiencePacket, + 0x5d: clientbound_set_health_packet::ClientboundSetHealthPacket, + 0x5e: clientbound_set_objective_packet::ClientboundSetObjectivePacket, + 0x5f: clientbound_set_passengers_packet::ClientboundSetPassengersPacket, + 0x60: clientbound_set_player_team_packet::ClientboundSetPlayerTeamPacket, + 0x61: clientbound_set_score_packet::ClientboundSetScorePacket, + 0x62: clientbound_set_simulation_distance_packet::ClientboundSetSimulationDistancePacket, + 0x63: clientbound_set_subtitle_text_packet::ClientboundSetSubtitleTextPacket, + 0x64: clientbound_set_time_packet::ClientboundSetTimePacket, + 0x65: clientbound_set_title_text_packet::ClientboundSetTitleTextPacket, + 0x66: clientbound_set_titles_animation_packet::ClientboundSetTitlesAnimationPacket, + 0x67: clientbound_sound_entity_packet::ClientboundSoundEntityPacket, + 0x68: clientbound_sound_packet::ClientboundSoundPacket, + 0x69: clientbound_start_configuration_packet::ClientboundStartConfigurationPacket, + 0x6a: clientbound_stop_sound_packet::ClientboundStopSoundPacket, + 0x6b: clientbound_store_cookie_packet::ClientboundStoreCookiePacket, + 0x6c: clientbound_system_chat_packet::ClientboundSystemChatPacket, + 0x6d: clientbound_tab_list_packet::ClientboundTabListPacket, + 0x6e: clientbound_tag_query_packet::ClientboundTagQueryPacket, + 0x6f: clientbound_take_item_entity_packet::ClientboundTakeItemEntityPacket, + 0x70: clientbound_teleport_entity_packet::ClientboundTeleportEntityPacket, + 0x71: clientbound_ticking_state_packet::ClientboundTickingStatePacket, + 0x72: clientbound_ticking_step_packet::ClientboundTickingStepPacket, + 0x73: clientbound_transfer_packet::ClientboundTransferPacket, + 0x74: clientbound_update_advancements_packet::ClientboundUpdateAdvancementsPacket, + 0x75: clientbound_update_attributes_packet::ClientboundUpdateAttributesPacket, + 0x76: clientbound_update_mob_effect_packet::ClientboundUpdateMobEffectPacket, + 0x77: clientbound_update_recipes_packet::ClientboundUpdateRecipesPacket, + 0x78: clientbound_update_tags_packet::ClientboundUpdateTagsPacket, } ); diff --git a/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs b/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs new file mode 100644 index 000000000..d88566472 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_block_entity_tag_query_packet.rs @@ -0,0 +1,10 @@ +use azalea_buf::McBuf; +use azalea_core::position::BlockPos; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundBlockEntityTagQueryPacket { + #[var] + pub transaction_id: u32, + pub pos: BlockPos, +} diff --git a/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs b/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs new file mode 100755 index 000000000..bb814d550 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_chat_command_signed_packet.rs @@ -0,0 +1,19 @@ +use super::serverbound_chat_packet::LastSeenMessagesUpdate; +use azalea_buf::McBuf; +use azalea_crypto::MessageSignature; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundChatCommandSignedPacket { + pub command: String, + pub timestamp: u64, + pub salt: u64, + pub argument_signatures: Vec, + pub last_seen_messages: LastSeenMessagesUpdate, +} + +#[derive(Clone, Debug, McBuf)] +pub struct ArgumentSignature { + pub name: String, + pub signature: MessageSignature, +} diff --git a/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs new file mode 100644 index 000000000..8ad0f07ee --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_cookie_response_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundCookieResponsePacket { + pub key: ResourceLocation, + pub payload: Option>, +} diff --git a/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs b/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs new file mode 100755 index 000000000..236972e06 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_debug_sample_subscription.rs @@ -0,0 +1,12 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundDebugSampleSubscription { + pub sample_type: RemoteDebugSampleType, +} + +#[derive(Clone, Copy, Debug, McBuf)] +pub enum RemoteDebugSampleType { + TickTime, +} diff --git a/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs b/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs new file mode 100644 index 000000000..d40a59a67 --- /dev/null +++ b/azalea-protocol/src/packets/game/serverbound_entity_tag_query_packet.rs @@ -0,0 +1,10 @@ +use azalea_buf::McBuf; +use azalea_protocol_macros::ServerboundGamePacket; + +#[derive(Clone, Debug, McBuf, ServerboundGamePacket)] +pub struct ServerboundEntityTagQueryPacket { + #[var] + pub transaction_id: u32, + #[var] + pub entity_id: u32, +} diff --git a/azalea-protocol/src/packets/handshaking/client_intention_packet.rs b/azalea-protocol/src/packets/handshaking/client_intention_packet.rs index cac64a01e..82be621a3 100755 --- a/azalea-protocol/src/packets/handshaking/client_intention_packet.rs +++ b/azalea-protocol/src/packets/handshaking/client_intention_packet.rs @@ -1,4 +1,4 @@ -use crate::packets::ConnectionProtocol; +use crate::packets::ClientIntention; use azalea_buf::McBuf; use azalea_protocol_macros::ServerboundHandshakePacket; use std::hash::Hash; @@ -9,5 +9,5 @@ pub struct ClientIntentionPacket { pub protocol_version: i32, pub hostname: String, pub port: u16, - pub intention: ConnectionProtocol, + pub intention: ClientIntention, } diff --git a/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs b/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs new file mode 100755 index 000000000..27ea0c09c --- /dev/null +++ b/azalea-protocol/src/packets/login/clientbound_cookie_request_packet.rs @@ -0,0 +1,8 @@ +use azalea_buf::McBuf; +use azalea_chat::FormattedText; +use azalea_protocol_macros::ClientboundLoginPacket; + +#[derive(Clone, Debug, McBuf, ClientboundLoginPacket)] +pub struct ClientboundCookieRequestPacket { + pub key: FormattedText, +} diff --git a/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs b/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs index 2783159a9..51f486d07 100755 --- a/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs +++ b/azalea-protocol/src/packets/login/clientbound_game_profile_packet.rs @@ -5,4 +5,5 @@ use azalea_protocol_macros::ClientboundLoginPacket; #[derive(Clone, Debug, McBuf, ClientboundLoginPacket)] pub struct ClientboundGameProfilePacket { pub game_profile: GameProfile, + pub strict_error_handling: bool, } diff --git a/azalea-protocol/src/packets/login/clientbound_hello_packet.rs b/azalea-protocol/src/packets/login/clientbound_hello_packet.rs index 0d5cce7d7..9beb499cd 100755 --- a/azalea-protocol/src/packets/login/clientbound_hello_packet.rs +++ b/azalea-protocol/src/packets/login/clientbound_hello_packet.rs @@ -7,5 +7,6 @@ pub struct ClientboundHelloPacket { // #[len(20)] pub server_id: String, pub public_key: Vec, - pub nonce: Vec, + pub challenge: Vec, + pub should_authenticate: bool, } diff --git a/azalea-protocol/src/packets/login/mod.rs b/azalea-protocol/src/packets/login/mod.rs index f9bf8dad5..2037f2c1c 100755 --- a/azalea-protocol/src/packets/login/mod.rs +++ b/azalea-protocol/src/packets/login/mod.rs @@ -1,8 +1,10 @@ +pub mod clientbound_cookie_request_packet; pub mod clientbound_custom_query_packet; pub mod clientbound_game_profile_packet; pub mod clientbound_hello_packet; pub mod clientbound_login_compression_packet; pub mod clientbound_login_disconnect_packet; +pub mod serverbound_cookie_response_packet; pub mod serverbound_custom_query_answer_packet; pub mod serverbound_hello_packet; pub mod serverbound_key_packet; @@ -17,6 +19,7 @@ declare_state_packets!( 0x01: serverbound_key_packet::ServerboundKeyPacket, 0x02: serverbound_custom_query_answer_packet::ServerboundCustomQueryAnswerPacket, 0x03: serverbound_login_acknowledged_packet::ServerboundLoginAcknowledgedPacket, + 0x04: serverbound_cookie_response_packet::ServerboundCookieResponsePacket, }, Clientbound => { 0x00: clientbound_login_disconnect_packet::ClientboundLoginDisconnectPacket, @@ -24,5 +27,6 @@ declare_state_packets!( 0x02: clientbound_game_profile_packet::ClientboundGameProfilePacket, 0x03: clientbound_login_compression_packet::ClientboundLoginCompressionPacket, 0x04: clientbound_custom_query_packet::ClientboundCustomQueryPacket, + 0x05: clientbound_cookie_request_packet::ClientboundCookieRequestPacket, } ); diff --git a/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs b/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs new file mode 100755 index 000000000..2074e2e71 --- /dev/null +++ b/azalea-protocol/src/packets/login/serverbound_cookie_response_packet.rs @@ -0,0 +1,9 @@ +use azalea_buf::McBuf; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol_macros::ServerboundLoginPacket; + +#[derive(Clone, Debug, McBuf, ServerboundLoginPacket)] +pub struct ServerboundCookieResponsePacket { + pub key: ResourceLocation, + pub payload: Option>, +} diff --git a/azalea-protocol/src/packets/mod.rs b/azalea-protocol/src/packets/mod.rs index 4bb4b7dec..4d6a2fc2e 100755 --- a/azalea-protocol/src/packets/mod.rs +++ b/azalea-protocol/src/packets/mod.rs @@ -12,7 +12,7 @@ use std::io::{Cursor, Write}; // TODO: rename the packet files to just like clientbound_add_entity instead of // clientbound_add_entity_packet -pub const PROTOCOL_VERSION: i32 = 765; +pub const PROTOCOL_VERSION: i32 = 766; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ConnectionProtocol { @@ -50,14 +50,44 @@ where fn write(&self, buf: &mut impl Write) -> Result<(), std::io::Error>; } -impl azalea_buf::McBufReadable for ConnectionProtocol { +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum ClientIntention { + Status = 1, + Login = 2, + Transfer = 3, +} + +impl TryFrom for ClientIntention { + type Error = (); + + fn try_from(value: i32) -> Result { + match value { + 1 => Ok(ClientIntention::Status), + 2 => Ok(ClientIntention::Login), + 3 => Ok(ClientIntention::Transfer), + _ => Err(()), + } + } +} + +impl From for ConnectionProtocol { + fn from(intention: ClientIntention) -> Self { + match intention { + ClientIntention::Status => ConnectionProtocol::Status, + ClientIntention::Login | ClientIntention::Transfer => ConnectionProtocol::Login, + } + } +} + +impl azalea_buf::McBufReadable for ClientIntention { fn read_from(buf: &mut Cursor<&[u8]>) -> Result { let id = i32::var_read_from(buf)?; - ConnectionProtocol::from_i32(id).ok_or(BufReadError::UnexpectedEnumVariant { id }) + id.try_into() + .map_err(|_| BufReadError::UnexpectedEnumVariant { id }) } } -impl McBufWritable for ConnectionProtocol { +impl McBufWritable for ClientIntention { fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { (*self as i32).var_write_into(buf) } diff --git a/azalea-registry/Cargo.toml b/azalea-registry/Cargo.toml index e1bae3afd..6a554593d 100644 --- a/azalea-registry/Cargo.toml +++ b/azalea-registry/Cargo.toml @@ -4,14 +4,14 @@ edition = "2021" license = "MIT" name = "azalea-registry" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-registry" -version = "0.9.0" +version = "0.10.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-registry-macros = { path = "./azalea-registry-macros", version = "0.9.0" } +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-registry-macros = { path = "./azalea-registry-macros", version = "0.10.0" } once_cell = "1.19.0" [features] serde = ["azalea-registry-macros/serde"] diff --git a/azalea-registry/azalea-registry-macros/Cargo.toml b/azalea-registry/azalea-registry-macros/Cargo.toml index cb07e2f70..396b58ba3 100644 --- a/azalea-registry/azalea-registry-macros/Cargo.toml +++ b/azalea-registry/azalea-registry-macros/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "MIT" name = "azalea-registry-macros" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-registry/azalea-registry-macros" -version = "0.9.0" +version = "0.10.0" [lib] proc-macro = true @@ -12,9 +12,9 @@ proc-macro = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -proc-macro2 = "1.0.78" -quote = "1.0.35" -syn = "2.0.49" +proc-macro2 = "1.0.81" +quote = "1.0.36" +syn = "2.0.60" [features] serde = [] diff --git a/azalea-registry/src/extra.rs b/azalea-registry/src/extra.rs new file mode 100644 index 000000000..6be981c19 --- /dev/null +++ b/azalea-registry/src/extra.rs @@ -0,0 +1,74 @@ +//! These registries are sent by the server during the configuration state so +//! you should be relying on those if possible, but these are provided for your +//! convenience anyways. + +use crate::Registry; +use azalea_registry_macros::registry; + +registry! { +enum WolfVariant { + Pale => "minecraft:wolf", + Spotted => "minecraft:wolf_spotted", + Snowy => "minecraft:wolf_snowy", + Black => "minecraft:wolf_black", + Ashen => "minecraft:wolf_ashen", + Rusty => "minecraft:wolf_rusty", + Woods => "minecraft:wolf_woods", + Chestnut => "minecraft:wolf_chestnut", + Striped => "minecraft:wolf_striped", +} +} + +#[allow(clippy::derivable_impls)] +impl Default for WolfVariant { + fn default() -> Self { + WolfVariant::Pale + } +} + +registry! { +enum DimensionType { + Overworld => "minecraft:overworld", + Nether => "minecraft:the_nether", + End => "minecraft:the_end", + OverworldCaves => "minecraft:overworld_caves", +} +} + +registry! { +enum TrimMaterial { + Quartz => "minecraft:quartz", + Iron => "minecraft:iron", + Netherite => "minecraft:netherite", + Redstone => "minecraft:redstone", + Copper => "minecraft:copper", + Gold => "minecraft:gold", + Emerald => "minecraft:emerald", + Diamond => "minecraft:diamond", + Lapis => "minecraft:lapis", + Amethyst => "minecraft:amethyst", +} +} + +registry! { +enum TrimPattern { + Sentry => "sentry", + Dune => "dune", + Coast => "coast", + Wild => "wild", + Ward => "ward", + Eye => "eye", + Vex => "vex", + Tide => "tide", + Snout => "snout", + Rib => "rib", + Spire => "spire", + Wayfinder => "wayfinder", + Shaper => "shaper", + Silence => "silence", + Raiser => "raiser", + Host => "host", + Flow => "flow", + Bolt => "bolt", +} +} diff --git a/azalea-registry/src/lib.rs b/azalea-registry/src/lib.rs index 448dd3340..63ebdc613 100755 --- a/azalea-registry/src/lib.rs +++ b/azalea-registry/src/lib.rs @@ -5,6 +5,7 @@ // auto-generated (so you can add doc comments to the registry enums if you // want) +mod extra; pub mod tags; use std::io::{Cursor, Write}; @@ -12,7 +13,9 @@ use std::io::{Cursor, Write}; use azalea_buf::{BufReadError, McBufReadable, McBufVarReadable, McBufVarWritable, McBufWritable}; use azalea_registry_macros::registry; -pub trait Registry +pub use extra::*; + +pub trait Registry: McBufReadable + McBufWritable where Self: Sized, { @@ -77,6 +80,58 @@ impl McBufWritable for CustomRegi } } +#[derive(Clone, PartialEq)] +pub enum HolderSet { + Direct { + contents: Vec, + }, + Named { + key: ResourceLocation, + contents: Vec, + }, +} + +impl McBufReadable + for HolderSet +{ + fn read_from(buf: &mut Cursor<&[u8]>) -> Result { + let size = i32::var_read_from(buf)? - 1; + if size == -1 { + let key = ResourceLocation::read_from(buf)?; + Ok(Self::Named { + key, + contents: Vec::new(), + }) + } else { + let mut contents = Vec::new(); + for _ in 0..size { + contents.push(D::read_from(buf)?); + } + Ok(Self::Direct { contents }) + } + } +} + +impl McBufWritable + for HolderSet +{ + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + match self { + Self::Direct { contents } => { + (contents.len() as i32 + 1).var_write_into(buf)?; + for item in contents { + item.write_into(buf)?; + } + } + Self::Named { key, .. } => { + 0i32.var_write_into(buf)?; + key.write_into(buf)?; + } + } + Ok(()) + } +} + registry! { /// The AI code that's currently being executed for the entity. enum Activity { @@ -116,15 +171,23 @@ enum Attribute { GenericAttackDamage => "minecraft:generic.attack_damage", GenericAttackKnockback => "minecraft:generic.attack_knockback", GenericAttackSpeed => "minecraft:generic.attack_speed", + PlayerBlockBreakSpeed => "minecraft:player.block_break_speed", + PlayerBlockInteractionRange => "minecraft:player.block_interaction_range", + PlayerEntityInteractionRange => "minecraft:player.entity_interaction_range", + GenericFallDamageMultiplier => "minecraft:generic.fall_damage_multiplier", GenericFlyingSpeed => "minecraft:generic.flying_speed", GenericFollowRange => "minecraft:generic.follow_range", - HorseJumpStrength => "minecraft:horse.jump_strength", + GenericGravity => "minecraft:generic.gravity", + GenericJumpStrength => "minecraft:generic.jump_strength", GenericKnockbackResistance => "minecraft:generic.knockback_resistance", GenericLuck => "minecraft:generic.luck", GenericMaxAbsorption => "minecraft:generic.max_absorption", GenericMaxHealth => "minecraft:generic.max_health", GenericMovementSpeed => "minecraft:generic.movement_speed", + GenericSafeFallDistance => "minecraft:generic.safe_fall_distance", + GenericScale => "minecraft:generic.scale", ZombieSpawnReinforcements => "minecraft:zombie.spawn_reinforcements", + GenericStepHeight => "minecraft:generic.step_height", } } @@ -1239,6 +1302,8 @@ enum Block { DecoratedPot => "minecraft:decorated_pot", Crafter => "minecraft:crafter", TrialSpawner => "minecraft:trial_spawner", + Vault => "minecraft:vault", + HeavyCore => "minecraft:heavy_core", } } @@ -1290,6 +1355,7 @@ enum BlockEntityKind { DecoratedPot => "minecraft:decorated_pot", Crafter => "minecraft:crafter", TrialSpawner => "minecraft:trial_spawner", + Vault => "minecraft:vault", } } @@ -1379,6 +1445,7 @@ enum CommandArgumentKind { Swizzle => "minecraft:swizzle", Team => "minecraft:team", ItemSlot => "minecraft:item_slot", + ItemSlots => "minecraft:item_slots", ResourceLocation => "minecraft:resource_location", Function => "minecraft:function", EntityAnchor => "minecraft:entity_anchor", @@ -1394,6 +1461,9 @@ enum CommandArgumentKind { TemplateMirror => "minecraft:template_mirror", TemplateRotation => "minecraft:template_rotation", Heightmap => "minecraft:heightmap", + LootTable => "minecraft:loot_table", + LootPredicate => "minecraft:loot_predicate", + LootModifier => "minecraft:loot_modifier", Uuid => "minecraft:uuid", } } @@ -1499,7 +1569,7 @@ enum Enchantment { Knockback => "minecraft:knockback", FireAspect => "minecraft:fire_aspect", Looting => "minecraft:looting", - Sweeping => "minecraft:sweeping", + SweepingEdge => "minecraft:sweeping_edge", Efficiency => "minecraft:efficiency", SilkTouch => "minecraft:silk_touch", Unbreaking => "minecraft:unbreaking", @@ -1517,6 +1587,9 @@ enum Enchantment { Multishot => "minecraft:multishot", QuickCharge => "minecraft:quick_charge", Piercing => "minecraft:piercing", + Density => "minecraft:density", + Breach => "minecraft:breach", + WindBurst => "minecraft:wind_burst", Mending => "minecraft:mending", VanishingCurse => "minecraft:vanishing_curse", } @@ -1527,6 +1600,7 @@ registry! { enum EntityKind { Allay => "minecraft:allay", AreaEffectCloud => "minecraft:area_effect_cloud", + Armadillo => "minecraft:armadillo", ArmorStand => "minecraft:armor_stand", Arrow => "minecraft:arrow", Axolotl => "minecraft:axolotl", @@ -1535,7 +1609,9 @@ enum EntityKind { Blaze => "minecraft:blaze", BlockDisplay => "minecraft:block_display", Boat => "minecraft:boat", + Bogged => "minecraft:bogged", Breeze => "minecraft:breeze", + BreezeWindCharge => "minecraft:breeze_wind_charge", Camel => "minecraft:camel", Cat => "minecraft:cat", CaveSpider => "minecraft:cave_spider", @@ -1583,6 +1659,7 @@ enum EntityKind { Item => "minecraft:item", ItemDisplay => "minecraft:item_display", ItemFrame => "minecraft:item_frame", + OminousItemSpawner => "minecraft:ominous_item_spawner", Fireball => "minecraft:fireball", LeashKnot => "minecraft:leash_knot", LightningBolt => "minecraft:lightning_bolt", @@ -1868,6 +1945,7 @@ enum Item { RawIronBlock => "minecraft:raw_iron_block", RawCopperBlock => "minecraft:raw_copper_block", RawGoldBlock => "minecraft:raw_gold_block", + HeavyCore => "minecraft:heavy_core", AmethystBlock => "minecraft:amethyst_block", BuddingAmethyst => "minecraft:budding_amethyst", IronBlock => "minecraft:iron_block", @@ -2577,7 +2655,9 @@ enum Item { StructureBlock => "minecraft:structure_block", Jigsaw => "minecraft:jigsaw", TurtleHelmet => "minecraft:turtle_helmet", - Scute => "minecraft:scute", + TurtleScute => "minecraft:turtle_scute", + ArmadilloScute => "minecraft:armadillo_scute", + WolfArmor => "minecraft:wolf_armor", FlintAndSteel => "minecraft:flint_and_steel", Apple => "minecraft:apple", Bow => "minecraft:bow", @@ -2788,11 +2868,13 @@ enum Item { Cauldron => "minecraft:cauldron", EnderEye => "minecraft:ender_eye", GlisteringMelonSlice => "minecraft:glistering_melon_slice", + ArmadilloSpawnEgg => "minecraft:armadillo_spawn_egg", AllaySpawnEgg => "minecraft:allay_spawn_egg", AxolotlSpawnEgg => "minecraft:axolotl_spawn_egg", BatSpawnEgg => "minecraft:bat_spawn_egg", BeeSpawnEgg => "minecraft:bee_spawn_egg", BlazeSpawnEgg => "minecraft:blaze_spawn_egg", + BoggedSpawnEgg => "minecraft:bogged_spawn_egg", BreezeSpawnEgg => "minecraft:breeze_spawn_egg", CatSpawnEgg => "minecraft:cat_spawn_egg", CamelSpawnEgg => "minecraft:camel_spawn_egg", @@ -2868,8 +2950,10 @@ enum Item { ZombifiedPiglinSpawnEgg => "minecraft:zombified_piglin_spawn_egg", ExperienceBottle => "minecraft:experience_bottle", FireCharge => "minecraft:fire_charge", + WindCharge => "minecraft:wind_charge", WritableBook => "minecraft:writable_book", WrittenBook => "minecraft:written_book", + Mace => "minecraft:mace", ItemFrame => "minecraft:item_frame", GlowItemFrame => "minecraft:glow_item_frame", FlowerPot => "minecraft:flower_pot", @@ -2974,6 +3058,8 @@ enum Item { MojangBannerPattern => "minecraft:mojang_banner_pattern", GlobeBannerPattern => "minecraft:globe_banner_pattern", PiglinBannerPattern => "minecraft:piglin_banner_pattern", + FlowBannerPattern => "minecraft:flow_banner_pattern", + GusterBannerPattern => "minecraft:guster_banner_pattern", GoatHorn => "minecraft:goat_horn", Composter => "minecraft:composter", Barrel => "minecraft:barrel", @@ -3057,6 +3143,8 @@ enum Item { SilenceArmorTrimSmithingTemplate => "minecraft:silence_armor_trim_smithing_template", RaiserArmorTrimSmithingTemplate => "minecraft:raiser_armor_trim_smithing_template", HostArmorTrimSmithingTemplate => "minecraft:host_armor_trim_smithing_template", + FlowArmorTrimSmithingTemplate => "minecraft:flow_armor_trim_smithing_template", + BoltArmorTrimSmithingTemplate => "minecraft:bolt_armor_trim_smithing_template", AnglerPotterySherd => "minecraft:angler_pottery_sherd", ArcherPotterySherd => "minecraft:archer_pottery_sherd", ArmsUpPotterySherd => "minecraft:arms_up_pottery_sherd", @@ -3065,7 +3153,9 @@ enum Item { BurnPotterySherd => "minecraft:burn_pottery_sherd", DangerPotterySherd => "minecraft:danger_pottery_sherd", ExplorerPotterySherd => "minecraft:explorer_pottery_sherd", + FlowPotterySherd => "minecraft:flow_pottery_sherd", FriendPotterySherd => "minecraft:friend_pottery_sherd", + GusterPotterySherd => "minecraft:guster_pottery_sherd", HeartPotterySherd => "minecraft:heart_pottery_sherd", HeartbreakPotterySherd => "minecraft:heartbreak_pottery_sherd", HowlPotterySherd => "minecraft:howl_pottery_sherd", @@ -3073,6 +3163,7 @@ enum Item { MournerPotterySherd => "minecraft:mourner_pottery_sherd", PlentyPotterySherd => "minecraft:plenty_pottery_sherd", PrizePotterySherd => "minecraft:prize_pottery_sherd", + ScrapePotterySherd => "minecraft:scrape_pottery_sherd", SheafPotterySherd => "minecraft:sheaf_pottery_sherd", ShelterPotterySherd => "minecraft:shelter_pottery_sherd", SkullPotterySherd => "minecraft:skull_pottery_sherd", @@ -3095,6 +3186,10 @@ enum Item { WaxedOxidizedCopperBulb => "minecraft:waxed_oxidized_copper_bulb", TrialSpawner => "minecraft:trial_spawner", TrialKey => "minecraft:trial_key", + OminousTrialKey => "minecraft:ominous_trial_key", + Vault => "minecraft:vault", + OminousBottle => "minecraft:ominous_bottle", + BreezeRod => "minecraft:breeze_rod", } } @@ -3124,10 +3219,12 @@ enum LootConditionKind { registry! { enum LootFunctionKind { SetCount => "minecraft:set_count", + SetItem => "minecraft:set_item", EnchantWithLevels => "minecraft:enchant_with_levels", EnchantRandomly => "minecraft:enchant_randomly", SetEnchantments => "minecraft:set_enchantments", - SetNbt => "minecraft:set_nbt", + SetCustomData => "minecraft:set_custom_data", + SetComponents => "minecraft:set_components", FurnaceSmelt => "minecraft:furnace_smelt", LootingEnchant => "minecraft:looting_enchant", SetDamage => "minecraft:set_damage", @@ -3137,19 +3234,30 @@ enum LootFunctionKind { SetStewEffect => "minecraft:set_stew_effect", CopyName => "minecraft:copy_name", SetContents => "minecraft:set_contents", + ModifyContents => "minecraft:modify_contents", + Filtered => "minecraft:filtered", LimitCount => "minecraft:limit_count", ApplyBonus => "minecraft:apply_bonus", SetLootTable => "minecraft:set_loot_table", ExplosionDecay => "minecraft:explosion_decay", SetLore => "minecraft:set_lore", FillPlayerHead => "minecraft:fill_player_head", - CopyNbt => "minecraft:copy_nbt", + CopyCustomData => "minecraft:copy_custom_data", CopyState => "minecraft:copy_state", SetBannerPattern => "minecraft:set_banner_pattern", SetPotion => "minecraft:set_potion", SetInstrument => "minecraft:set_instrument", Reference => "minecraft:reference", Sequence => "minecraft:sequence", + CopyComponents => "minecraft:copy_components", + SetFireworks => "minecraft:set_fireworks", + SetFireworkExplosion => "minecraft:set_firework_explosion", + SetBookCover => "minecraft:set_book_cover", + SetWrittenBookPages => "minecraft:set_written_book_pages", + SetWritableBookPages => "minecraft:set_writable_book_pages", + ToggleTooltips => "minecraft:toggle_tooltips", + SetOminousBottleAmplifier => "minecraft:set_ominous_bottle_amplifier", + SetCustomModelData => "minecraft:set_custom_model_data", } } @@ -3166,6 +3274,7 @@ enum LootNumberProviderKind { Uniform => "minecraft:uniform", Binomial => "minecraft:binomial", Score => "minecraft:score", + Storage => "minecraft:storage", } } @@ -3223,6 +3332,7 @@ enum MemoryModuleKind { HeardBellTime => "minecraft:heard_bell_time", CantReachWalkTargetSince => "minecraft:cant_reach_walk_target_since", GolemDetectedRecently => "minecraft:golem_detected_recently", + DangerDetectedRecently => "minecraft:danger_detected_recently", LastSlept => "minecraft:last_slept", LastWoken => "minecraft:last_woken", LastWorkedAtPoi => "minecraft:last_worked_at_poi", @@ -3295,6 +3405,7 @@ enum MemoryModuleKind { BreezeShootCooldown => "minecraft:breeze_shoot_cooldown", BreezeJumpInhaling => "minecraft:breeze_jump_inhaling", BreezeJumpTarget => "minecraft:breeze_jump_target", + BreezeLeavingWater => "minecraft:breeze_leaving_water", } } @@ -3362,6 +3473,12 @@ enum MobEffect { BadOmen => "minecraft:bad_omen", HeroOfTheVillage => "minecraft:hero_of_the_village", Darkness => "minecraft:darkness", + TrialOmen => "minecraft:trial_omen", + RaidOmen => "minecraft:raid_omen", + WindCharged => "minecraft:wind_charged", + Weaving => "minecraft:weaving", + Oozing => "minecraft:oozing", + Infested => "minecraft:infested", } } @@ -3402,7 +3519,6 @@ enum PaintingVariant { registry! { enum ParticleKind { - AmbientEntityEffect => "minecraft:ambient_entity_effect", AngryVillager => "minecraft:angry_villager", Block => "minecraft:block", BlockMarker => "minecraft:block_marker", @@ -3427,12 +3543,15 @@ enum ParticleKind { ExplosionEmitter => "minecraft:explosion_emitter", Explosion => "minecraft:explosion", Gust => "minecraft:gust", - GustEmitter => "minecraft:gust_emitter", + SmallGust => "minecraft:small_gust", + GustEmitterLarge => "minecraft:gust_emitter_large", + GustEmitterSmall => "minecraft:gust_emitter_small", SonicBoom => "minecraft:sonic_boom", FallingDust => "minecraft:falling_dust", Firework => "minecraft:firework", Fishing => "minecraft:fishing", Flame => "minecraft:flame", + Infested => "minecraft:infested", CherryLeaves => "minecraft:cherry_leaves", SculkSoul => "minecraft:sculk_soul", SculkCharge => "minecraft:sculk_charge", @@ -3447,6 +3566,7 @@ enum ParticleKind { Item => "minecraft:item", Vibration => "minecraft:vibration", ItemSlime => "minecraft:item_slime", + ItemCobweb => "minecraft:item_cobweb", ItemSnowball => "minecraft:item_snowball", LargeSmoke => "minecraft:large_smoke", Lava => "minecraft:lava", @@ -3501,8 +3621,13 @@ enum ParticleKind { Shriek => "minecraft:shriek", EggCrack => "minecraft:egg_crack", DustPlume => "minecraft:dust_plume", - GustDust => "minecraft:gust_dust", TrialSpawnerDetection => "minecraft:trial_spawner_detection", + TrialSpawnerDetectionOminous => "minecraft:trial_spawner_detection_ominous", + VaultConnection => "minecraft:vault_connection", + DustPillar => "minecraft:dust_pillar", + OminousSpawning => "minecraft:ominous_spawning", + RaidOmen => "minecraft:raid_omen", + TrialOmen => "minecraft:trial_omen", } } @@ -3548,7 +3673,6 @@ enum PositionSourceKind { registry! { enum Potion { - Empty => "minecraft:empty", Water => "minecraft:water", Mundane => "minecraft:mundane", Thick => "minecraft:thick", @@ -3591,6 +3715,10 @@ enum Potion { Luck => "minecraft:luck", SlowFalling => "minecraft:slow_falling", LongSlowFalling => "minecraft:long_slow_falling", + WindCharged => "minecraft:wind_charged", + Weaving => "minecraft:weaving", + Oozing => "minecraft:oozing", + Infested => "minecraft:infested", } } @@ -3666,6 +3794,7 @@ enum SensorKind { VillagerBabies => "minecraft:villager_babies", SecondaryPois => "minecraft:secondary_pois", GolemDetected => "minecraft:golem_detected", + ArmadilloScareDetected => "minecraft:armadillo_scare_detected", PiglinSpecificSensor => "minecraft:piglin_specific_sensor", PiglinBruteSpecificSensor => "minecraft:piglin_brute_specific_sensor", HoglinSpecificSensor => "minecraft:hoglin_specific_sensor", @@ -3675,6 +3804,7 @@ enum SensorKind { GoatTemptations => "minecraft:goat_temptations", FrogTemptations => "minecraft:frog_temptations", CamelTemptations => "minecraft:camel_temptations", + ArmadilloTemptations => "minecraft:armadillo_temptations", FrogAttackables => "minecraft:frog_attackables", IsInWater => "minecraft:is_in_water", WardenEntitySensor => "minecraft:warden_entity_sensor", @@ -3739,6 +3869,19 @@ enum SoundEvent { BlockAnvilPlace => "minecraft:block.anvil.place", BlockAnvilStep => "minecraft:block.anvil.step", BlockAnvilUse => "minecraft:block.anvil.use", + EntityArmadilloEat => "minecraft:entity.armadillo.eat", + EntityArmadilloHurt => "minecraft:entity.armadillo.hurt", + EntityArmadilloHurtReduced => "minecraft:entity.armadillo.hurt_reduced", + EntityArmadilloAmbient => "minecraft:entity.armadillo.ambient", + EntityArmadilloStep => "minecraft:entity.armadillo.step", + EntityArmadilloDeath => "minecraft:entity.armadillo.death", + EntityArmadilloRoll => "minecraft:entity.armadillo.roll", + EntityArmadilloLand => "minecraft:entity.armadillo.land", + EntityArmadilloScuteDrop => "minecraft:entity.armadillo.scute_drop", + EntityArmadilloUnrollFinish => "minecraft:entity.armadillo.unroll_finish", + EntityArmadilloPeek => "minecraft:entity.armadillo.peek", + EntityArmadilloUnrollStart => "minecraft:entity.armadillo.unroll_start", + EntityArmadilloBrush => "minecraft:entity.armadillo.brush", ItemArmorEquipChain => "minecraft:item.armor.equip_chain", ItemArmorEquipDiamond => "minecraft:item.armor.equip_diamond", ItemArmorEquipElytra => "minecraft:item.armor.equip_elytra", @@ -3748,6 +3891,8 @@ enum SoundEvent { ItemArmorEquipLeather => "minecraft:item.armor.equip_leather", ItemArmorEquipNetherite => "minecraft:item.armor.equip_netherite", ItemArmorEquipTurtle => "minecraft:item.armor.equip_turtle", + ItemArmorEquipWolf => "minecraft:item.armor.equip_wolf", + ItemArmorUnequipWolf => "minecraft:item.armor.unequip_wolf", EntityArmorStandBreak => "minecraft:entity.armor_stand.break", EntityArmorStandFall => "minecraft:entity.armor_stand.fall", EntityArmorStandHit => "minecraft:entity.armor_stand.hit", @@ -3839,6 +3984,11 @@ enum SoundEvent { EntityBlazeShoot => "minecraft:entity.blaze.shoot", EntityBoatPaddleLand => "minecraft:entity.boat.paddle_land", EntityBoatPaddleWater => "minecraft:entity.boat.paddle_water", + EntityBoggedAmbient => "minecraft:entity.bogged.ambient", + EntityBoggedDeath => "minecraft:entity.bogged.death", + EntityBoggedHurt => "minecraft:entity.bogged.hurt", + EntityBoggedShear => "minecraft:entity.bogged.shear", + EntityBoggedStep => "minecraft:entity.bogged.step", BlockBoneBlockBreak => "minecraft:block.bone_block.break", BlockBoneBlockFall => "minecraft:block.bone_block.fall", BlockBoneBlockHit => "minecraft:block.bone_block.hit", @@ -3851,6 +4001,8 @@ enum SoundEvent { ItemBottleEmpty => "minecraft:item.bottle.empty", ItemBottleFill => "minecraft:item.bottle.fill", ItemBottleFillDragonbreath => "minecraft:item.bottle.fill_dragonbreath", + EntityBreezeCharge => "minecraft:entity.breeze.charge", + EntityBreezeDeflect => "minecraft:entity.breeze.deflect", EntityBreezeInhale => "minecraft:entity.breeze.inhale", EntityBreezeIdleGround => "minecraft:entity.breeze.idle_ground", EntityBreezeIdleAir => "minecraft:entity.breeze.idle_air", @@ -3860,6 +4012,8 @@ enum SoundEvent { EntityBreezeSlide => "minecraft:entity.breeze.slide", EntityBreezeDeath => "minecraft:entity.breeze.death", EntityBreezeHurt => "minecraft:entity.breeze.hurt", + EntityBreezeWhirl => "minecraft:entity.breeze.whirl", + EntityBreezeWindBurst => "minecraft:entity.breeze.wind_burst", BlockBrewingStandBrew => "minecraft:block.brewing_stand.brew", ItemBrushBrushingGeneric => "minecraft:item.brush.brushing.generic", ItemBrushBrushingSand => "minecraft:item.brush.brushing.sand", @@ -3981,6 +4135,11 @@ enum SoundEvent { BlockChorusFlowerDeath => "minecraft:block.chorus_flower.death", BlockChorusFlowerGrow => "minecraft:block.chorus_flower.grow", ItemChorusFruitTeleport => "minecraft:item.chorus_fruit.teleport", + BlockCobwebBreak => "minecraft:block.cobweb.break", + BlockCobwebStep => "minecraft:block.cobweb.step", + BlockCobwebPlace => "minecraft:block.cobweb.place", + BlockCobwebHit => "minecraft:block.cobweb.hit", + BlockCobwebFall => "minecraft:block.cobweb.fall", EntityCodAmbient => "minecraft:entity.cod.ambient", EntityCodDeath => "minecraft:entity.cod.death", EntityCodFlop => "minecraft:entity.cod.flop", @@ -4083,6 +4242,7 @@ enum SoundEvent { EntityDonkeyDeath => "minecraft:entity.donkey.death", EntityDonkeyEat => "minecraft:entity.donkey.eat", EntityDonkeyHurt => "minecraft:entity.donkey.hurt", + EntityDonkeyJump => "minecraft:entity.donkey.jump", BlockDripstoneBlockBreak => "minecraft:block.dripstone_block.break", BlockDripstoneBlockStep => "minecraft:block.dripstone_block.step", BlockDripstoneBlockPlace => "minecraft:block.dripstone_block.place", @@ -4313,6 +4473,11 @@ enum SoundEvent { BlockHangingSignFall => "minecraft:block.hanging_sign.fall", BlockHangingSignHit => "minecraft:block.hanging_sign.hit", BlockHangingSignPlace => "minecraft:block.hanging_sign.place", + BlockHeavyCoreBreak => "minecraft:block.heavy_core.break", + BlockHeavyCoreFall => "minecraft:block.heavy_core.fall", + BlockHeavyCoreHit => "minecraft:block.heavy_core.hit", + BlockHeavyCorePlace => "minecraft:block.heavy_core.place", + BlockHeavyCoreStep => "minecraft:block.heavy_core.step", BlockNetherWoodHangingSignStep => "minecraft:block.nether_wood_hanging_sign.step", BlockNetherWoodHangingSignBreak => "minecraft:block.nether_wood_hanging_sign.break", BlockNetherWoodHangingSignFall => "minecraft:block.nether_wood_hanging_sign.fall", @@ -4329,8 +4494,13 @@ enum SoundEvent { BlockTrialSpawnerHit => "minecraft:block.trial_spawner.hit", BlockTrialSpawnerFall => "minecraft:block.trial_spawner.fall", BlockTrialSpawnerSpawnMob => "minecraft:block.trial_spawner.spawn_mob", + BlockTrialSpawnerAboutToSpawnItem => "minecraft:block.trial_spawner.about_to_spawn_item", + BlockTrialSpawnerSpawnItem => "minecraft:block.trial_spawner.spawn_item", + BlockTrialSpawnerSpawnItemBegin => "minecraft:block.trial_spawner.spawn_item_begin", BlockTrialSpawnerDetectPlayer => "minecraft:block.trial_spawner.detect_player", + BlockTrialSpawnerChargeActivate => "minecraft:block.trial_spawner.charge_activate", BlockTrialSpawnerAmbient => "minecraft:block.trial_spawner.ambient", + BlockTrialSpawnerAmbientCharged => "minecraft:block.trial_spawner.ambient_charged", BlockTrialSpawnerOpenShutter => "minecraft:block.trial_spawner.open_shutter", BlockTrialSpawnerCloseShutter => "minecraft:block.trial_spawner.close_shutter", BlockTrialSpawnerEjectItem => "minecraft:block.trial_spawner.eject_item", @@ -4445,6 +4615,9 @@ enum SoundEvent { BlockLodestoneHit => "minecraft:block.lodestone.hit", BlockLodestoneFall => "minecraft:block.lodestone.fall", ItemLodestoneCompassLock => "minecraft:item.lodestone_compass.lock", + ItemMaceSmashAir => "minecraft:item.mace.smash_air", + ItemMaceSmashGround => "minecraft:item.mace.smash_ground", + ItemMaceSmashGroundHeavy => "minecraft:item.mace.smash_ground_heavy", EntityMagmaCubeDeath => "minecraft:entity.magma_cube.death", EntityMagmaCubeHurt => "minecraft:entity.magma_cube.hurt", EntityMagmaCubeHurtSmall => "minecraft:entity.magma_cube.hurt_small", @@ -4509,6 +4682,7 @@ enum SoundEvent { EntityMuleDeath => "minecraft:entity.mule.death", EntityMuleEat => "minecraft:entity.mule.eat", EntityMuleHurt => "minecraft:entity.mule.hurt", + EntityMuleJump => "minecraft:entity.mule.jump", MusicCreative => "minecraft:music.creative", MusicCredits => "minecraft:music.credits", MusicDisc5 => "minecraft:music_disc.5", @@ -4649,6 +4823,7 @@ enum SoundEvent { EntityOcelotHurt => "minecraft:entity.ocelot.hurt", EntityOcelotAmbient => "minecraft:entity.ocelot.ambient", EntityOcelotDeath => "minecraft:entity.ocelot.death", + ItemOminousBottleDispose => "minecraft:item.ominous_bottle.dispose", EntityPaintingBreak => "minecraft:entity.painting.break", EntityPaintingPlace => "minecraft:entity.painting.place", EntityPandaPreSneeze => "minecraft:entity.panda.pre_sneeze", @@ -4668,6 +4843,7 @@ enum SoundEvent { EntityParrotFly => "minecraft:entity.parrot.fly", EntityParrotHurt => "minecraft:entity.parrot.hurt", EntityParrotImitateBlaze => "minecraft:entity.parrot.imitate.blaze", + EntityParrotImitateBogged => "minecraft:entity.parrot.imitate.bogged", EntityParrotImitateBreeze => "minecraft:entity.parrot.imitate.breeze", EntityParrotImitateCreeper => "minecraft:entity.parrot.imitate.creeper", EntityParrotImitateDrowned => "minecraft:entity.parrot.imitate.drowned", @@ -5072,6 +5248,19 @@ enum SoundEvent { UiToastChallengeComplete => "minecraft:ui.toast.challenge_complete", UiToastIn => "minecraft:ui.toast.in", UiToastOut => "minecraft:ui.toast.out", + BlockVaultActivate => "minecraft:block.vault.activate", + BlockVaultAmbient => "minecraft:block.vault.ambient", + BlockVaultBreak => "minecraft:block.vault.break", + BlockVaultCloseShutter => "minecraft:block.vault.close_shutter", + BlockVaultDeactivate => "minecraft:block.vault.deactivate", + BlockVaultEjectItem => "minecraft:block.vault.eject_item", + BlockVaultFall => "minecraft:block.vault.fall", + BlockVaultHit => "minecraft:block.vault.hit", + BlockVaultInsertItem => "minecraft:block.vault.insert_item", + BlockVaultInsertItemFail => "minecraft:block.vault.insert_item_fail", + BlockVaultOpenShutter => "minecraft:block.vault.open_shutter", + BlockVaultPlace => "minecraft:block.vault.place", + BlockVaultStep => "minecraft:block.vault.step", EntityVexAmbient => "minecraft:entity.vex.ambient", EntityVexCharge => "minecraft:entity.vex.charge", EntityVexDeath => "minecraft:entity.vex.death", @@ -5147,11 +5336,13 @@ enum SoundEvent { BlockWetGrassPlace => "minecraft:block.wet_grass.place", BlockWetGrassStep => "minecraft:block.wet_grass.step", BlockWetSpongeBreak => "minecraft:block.wet_sponge.break", + BlockWetSpongeDries => "minecraft:block.wet_sponge.dries", BlockWetSpongeFall => "minecraft:block.wet_sponge.fall", BlockWetSpongeHit => "minecraft:block.wet_sponge.hit", BlockWetSpongePlace => "minecraft:block.wet_sponge.place", BlockWetSpongeStep => "minecraft:block.wet_sponge.step", - EntityGenericWindBurst => "minecraft:entity.generic.wind_burst", + EntityWindChargeWindBurst => "minecraft:entity.wind_charge.wind_burst", + EntityWindChargeThrow => "minecraft:entity.wind_charge.throw", EntityWitchAmbient => "minecraft:entity.witch.ambient", EntityWitchCelebrate => "minecraft:entity.witch.celebrate", EntityWitchDeath => "minecraft:entity.witch.death", @@ -5168,6 +5359,10 @@ enum SoundEvent { EntityWitherSkeletonHurt => "minecraft:entity.wither_skeleton.hurt", EntityWitherSkeletonStep => "minecraft:entity.wither_skeleton.step", EntityWitherSpawn => "minecraft:entity.wither.spawn", + ItemWolfArmorBreak => "minecraft:item.wolf_armor.break", + ItemWolfArmorCrack => "minecraft:item.wolf_armor.crack", + ItemWolfArmorDamage => "minecraft:item.wolf_armor.damage", + ItemWolfArmorRepair => "minecraft:item.wolf_armor.repair", EntityWolfAmbient => "minecraft:entity.wolf.ambient", EntityWolfDeath => "minecraft:entity.wolf.death", EntityWolfGrowl => "minecraft:entity.wolf.growl", @@ -5224,6 +5419,9 @@ enum SoundEvent { EntityZombieVillagerDeath => "minecraft:entity.zombie_villager.death", EntityZombieVillagerHurt => "minecraft:entity.zombie_villager.hurt", EntityZombieVillagerStep => "minecraft:entity.zombie_villager.step", + EventMobEffectBadOmen => "minecraft:event.mob_effect.bad_omen", + EventMobEffectTrialOmen => "minecraft:event.mob_effect.trial_omen", + EventMobEffectRaidOmen => "minecraft:event.mob_effect.raid_omen", } } @@ -5638,7 +5836,9 @@ enum DecoratedPotPatterns { BurnPotteryPattern => "minecraft:burn_pottery_pattern", DangerPotteryPattern => "minecraft:danger_pottery_pattern", ExplorerPotteryPattern => "minecraft:explorer_pottery_pattern", + FlowPotteryPattern => "minecraft:flow_pottery_pattern", FriendPotteryPattern => "minecraft:friend_pottery_pattern", + GusterPotteryPattern => "minecraft:guster_pottery_pattern", HeartPotteryPattern => "minecraft:heart_pottery_pattern", HeartbreakPotteryPattern => "minecraft:heartbreak_pottery_pattern", HowlPotteryPattern => "minecraft:howl_pottery_pattern", @@ -5646,6 +5846,7 @@ enum DecoratedPotPatterns { MournerPotteryPattern => "minecraft:mourner_pottery_pattern", PlentyPotteryPattern => "minecraft:plenty_pottery_pattern", PrizePotteryPattern => "minecraft:prize_pottery_pattern", + ScrapePotteryPattern => "minecraft:scrape_pottery_pattern", SheafPotteryPattern => "minecraft:sheaf_pottery_pattern", ShelterPotteryPattern => "minecraft:shelter_pottery_pattern", SkullPotteryPattern => "minecraft:skull_pottery_pattern", @@ -5813,6 +6014,7 @@ enum BlockKind { HalfTransparent => "minecraft:half_transparent", HangingRoots => "minecraft:hanging_roots", Hay => "minecraft:hay", + HeavyCore => "minecraft:heavy_core", Honey => "minecraft:honey", Hopper => "minecraft:hopper", HugeMushroom => "minecraft:huge_mushroom", @@ -5928,6 +6130,7 @@ enum BlockKind { TurtleEgg => "minecraft:turtle_egg", TwistingVinesPlant => "minecraft:twisting_vines_plant", TwistingVines => "minecraft:twisting_vines", + Vault => "minecraft:vault", Vine => "minecraft:vine", WallBanner => "minecraft:wall_banner", WallHangingSign => "minecraft:wall_hanging_sign", @@ -6005,6 +6208,8 @@ enum TriggerKind { BeeNestDestroyed => "minecraft:bee_nest_destroyed", TargetHit => "minecraft:target_hit", ItemUsedOnBlock => "minecraft:item_used_on_block", + DefaultBlockUse => "minecraft:default_block_use", + AnyBlockUse => "minecraft:any_block_use", PlayerGeneratesContainerLoot => "minecraft:player_generates_container_loot", ThrownItemPickedUpByEntity => "minecraft:thrown_item_picked_up_by_entity", ThrownItemPickedUpByPlayer => "minecraft:thrown_item_picked_up_by_player", @@ -6018,6 +6223,8 @@ enum TriggerKind { AllayDropItemOnBlock => "minecraft:allay_drop_item_on_block", AvoidVibration => "minecraft:avoid_vibration", RecipeCrafted => "minecraft:recipe_crafted", + CrafterRecipeCrafted => "minecraft:crafter_recipe_crafted", + FallAfterExplosion => "minecraft:fall_after_explosion", } } @@ -6028,3 +6235,159 @@ enum NumberFormatKind { Fixed => "minecraft:fixed", } } + +registry! { +enum ArmorMaterial { + Leather => "minecraft:leather", + Chainmail => "minecraft:chainmail", + Iron => "minecraft:iron", + Gold => "minecraft:gold", + Diamond => "minecraft:diamond", + Turtle => "minecraft:turtle", + Netherite => "minecraft:netherite", + Armadillo => "minecraft:armadillo", +} +} + +registry! { +enum DataComponentKind { + CustomData => "minecraft:custom_data", + MaxStackSize => "minecraft:max_stack_size", + MaxDamage => "minecraft:max_damage", + Damage => "minecraft:damage", + Unbreakable => "minecraft:unbreakable", + CustomName => "minecraft:custom_name", + ItemName => "minecraft:item_name", + Lore => "minecraft:lore", + Rarity => "minecraft:rarity", + Enchantments => "minecraft:enchantments", + CanPlaceOn => "minecraft:can_place_on", + CanBreak => "minecraft:can_break", + AttributeModifiers => "minecraft:attribute_modifiers", + CustomModelData => "minecraft:custom_model_data", + HideAdditionalTooltip => "minecraft:hide_additional_tooltip", + HideTooltip => "minecraft:hide_tooltip", + RepairCost => "minecraft:repair_cost", + CreativeSlotLock => "minecraft:creative_slot_lock", + EnchantmentGlintOverride => "minecraft:enchantment_glint_override", + IntangibleProjectile => "minecraft:intangible_projectile", + Food => "minecraft:food", + FireResistant => "minecraft:fire_resistant", + Tool => "minecraft:tool", + StoredEnchantments => "minecraft:stored_enchantments", + DyedColor => "minecraft:dyed_color", + MapColor => "minecraft:map_color", + MapId => "minecraft:map_id", + MapDecorations => "minecraft:map_decorations", + MapPostProcessing => "minecraft:map_post_processing", + ChargedProjectiles => "minecraft:charged_projectiles", + BundleContents => "minecraft:bundle_contents", + PotionContents => "minecraft:potion_contents", + SuspiciousStewEffects => "minecraft:suspicious_stew_effects", + WritableBookContent => "minecraft:writable_book_content", + WrittenBookContent => "minecraft:written_book_content", + Trim => "minecraft:trim", + DebugStickState => "minecraft:debug_stick_state", + EntityData => "minecraft:entity_data", + BucketEntityData => "minecraft:bucket_entity_data", + BlockEntityData => "minecraft:block_entity_data", + Instrument => "minecraft:instrument", + OminousBottleAmplifier => "minecraft:ominous_bottle_amplifier", + Recipes => "minecraft:recipes", + LodestoneTracker => "minecraft:lodestone_tracker", + FireworkExplosion => "minecraft:firework_explosion", + Fireworks => "minecraft:fireworks", + Profile => "minecraft:profile", + NoteBlockSound => "minecraft:note_block_sound", + BannerPatterns => "minecraft:banner_patterns", + BaseColor => "minecraft:base_color", + PotDecorations => "minecraft:pot_decorations", + Container => "minecraft:container", + BlockState => "minecraft:block_state", + Bees => "minecraft:bees", + Lock => "minecraft:lock", + ContainerLoot => "minecraft:container_loot", +} +} + +registry! { +enum EntitySubPredicateKind { + Lightning => "minecraft:lightning", + FishingHook => "minecraft:fishing_hook", + Player => "minecraft:player", + Slime => "minecraft:slime", + Raider => "minecraft:raider", + Axolotl => "minecraft:axolotl", + Boat => "minecraft:boat", + Fox => "minecraft:fox", + Mooshroom => "minecraft:mooshroom", + Rabbit => "minecraft:rabbit", + Horse => "minecraft:horse", + Llama => "minecraft:llama", + Villager => "minecraft:villager", + Parrot => "minecraft:parrot", + TropicalFish => "minecraft:tropical_fish", + Painting => "minecraft:painting", + Cat => "minecraft:cat", + Frog => "minecraft:frog", + Wolf => "minecraft:wolf", +} +} + +registry! { +enum ItemSubPredicateKind { + Damage => "minecraft:damage", + Enchantments => "minecraft:enchantments", + StoredEnchantments => "minecraft:stored_enchantments", + PotionContents => "minecraft:potion_contents", + CustomData => "minecraft:custom_data", + Container => "minecraft:container", + BundleContents => "minecraft:bundle_contents", + FireworkExplosion => "minecraft:firework_explosion", + Fireworks => "minecraft:fireworks", + WritableBookContent => "minecraft:writable_book_content", + WrittenBookContent => "minecraft:written_book_content", + AttributeModifiers => "minecraft:attribute_modifiers", + Trim => "minecraft:trim", +} +} + +registry! { +enum MapDecorationKind { + Player => "minecraft:player", + Frame => "minecraft:frame", + RedMarker => "minecraft:red_marker", + BlueMarker => "minecraft:blue_marker", + TargetX => "minecraft:target_x", + TargetPoint => "minecraft:target_point", + PlayerOffMap => "minecraft:player_off_map", + PlayerOffLimits => "minecraft:player_off_limits", + Mansion => "minecraft:mansion", + Monument => "minecraft:monument", + BannerWhite => "minecraft:banner_white", + BannerOrange => "minecraft:banner_orange", + BannerMagenta => "minecraft:banner_magenta", + BannerLightBlue => "minecraft:banner_light_blue", + BannerYellow => "minecraft:banner_yellow", + BannerLime => "minecraft:banner_lime", + BannerPink => "minecraft:banner_pink", + BannerGray => "minecraft:banner_gray", + BannerLightGray => "minecraft:banner_light_gray", + BannerCyan => "minecraft:banner_cyan", + BannerPurple => "minecraft:banner_purple", + BannerBlue => "minecraft:banner_blue", + BannerBrown => "minecraft:banner_brown", + BannerGreen => "minecraft:banner_green", + BannerRed => "minecraft:banner_red", + BannerBlack => "minecraft:banner_black", + RedX => "minecraft:red_x", + VillageDesert => "minecraft:village_desert", + VillagePlains => "minecraft:village_plains", + VillageSavanna => "minecraft:village_savanna", + VillageSnowy => "minecraft:village_snowy", + VillageTaiga => "minecraft:village_taiga", + JungleTemple => "minecraft:jungle_temple", + SwampHut => "minecraft:swamp_hut", + TrialChambers => "minecraft:trial_chambers", +} +} diff --git a/azalea-registry/src/tags/blocks.rs b/azalea-registry/src/tags/blocks.rs index 0396eb877..0d79b2972 100644 --- a/azalea-registry/src/tags/blocks.rs +++ b/azalea-registry/src/tags/blocks.rs @@ -6,119 +6,238 @@ use once_cell::sync::Lazy; use crate::Block; -pub static MINEABLE_SHOVEL: Lazy> = Lazy::new(|| { +pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Clay, - Block::Dirt, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + ]) +}); +pub static ALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakHangingSign, + Block::SpruceHangingSign, + Block::BirchHangingSign, + Block::AcaciaHangingSign, + Block::CherryHangingSign, + Block::JungleHangingSign, + Block::DarkOakHangingSign, + Block::CrimsonHangingSign, + Block::WarpedHangingSign, + Block::MangroveHangingSign, + Block::BambooHangingSign, + Block::OakWallHangingSign, + Block::SpruceWallHangingSign, + Block::BirchWallHangingSign, + Block::AcaciaWallHangingSign, + Block::CherryWallHangingSign, + Block::JungleWallHangingSign, + Block::DarkOakWallHangingSign, + Block::CrimsonWallHangingSign, + Block::WarpedWallHangingSign, + Block::MangroveWallHangingSign, + Block::BambooWallHangingSign, + ]) +}); +pub static ALL_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + Block::OakHangingSign, + Block::SpruceHangingSign, + Block::BirchHangingSign, + Block::AcaciaHangingSign, + Block::CherryHangingSign, + Block::JungleHangingSign, + Block::DarkOakHangingSign, + Block::CrimsonHangingSign, + Block::WarpedHangingSign, + Block::MangroveHangingSign, + Block::BambooHangingSign, + Block::OakWallHangingSign, + Block::SpruceWallHangingSign, + Block::BirchWallHangingSign, + Block::AcaciaWallHangingSign, + Block::CherryWallHangingSign, + Block::JungleWallHangingSign, + Block::DarkOakWallHangingSign, + Block::CrimsonWallHangingSign, + Block::WarpedWallHangingSign, + Block::MangroveWallHangingSign, + Block::BambooWallHangingSign, + ]) +}); +pub static ANCIENT_CITY_REPLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Deepslate, + Block::DeepslateBricks, + Block::DeepslateTiles, + Block::DeepslateBrickSlab, + Block::DeepslateTileSlab, + Block::DeepslateBrickStairs, + Block::DeepslateTileWall, + Block::DeepslateBrickWall, + Block::CobbledDeepslate, + Block::CrackedDeepslateBricks, + Block::CrackedDeepslateTiles, + Block::GrayWool, + ]) +}); +pub static ANIMALS_SPAWNABLE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock])); +pub static ANVIL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Anvil, Block::ChippedAnvil, Block::DamagedAnvil])); +pub static ARMADILLO_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::RedSand, Block::CoarseDirt, - Block::Podzol, - Block::Farmland, Block::GrassBlock, - Block::Gravel, + Block::Terracotta, + Block::WhiteTerracotta, + Block::YellowTerracotta, + Block::OrangeTerracotta, + Block::RedTerracotta, + Block::BrownTerracotta, + Block::LightGrayTerracotta, + ]) +}); +pub static AXOLOTLS_SPAWNABLE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Clay])); +pub static AZALEA_GROWS_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SnowBlock, + Block::PowderSnow, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, Block::Sand, Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, + ]) +}); +pub static AZALEA_ROOT_REPLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::RedSand, + Block::Clay, + Block::Gravel, + Block::Sand, Block::SnowBlock, - Block::Snow, - Block::SoulSand, - Block::DirtPath, - Block::SoulSoil, + Block::PowderSnow, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, Block::RootedDirt, - Block::MuddyMangroveRoots, + Block::MossBlock, Block::Mud, - Block::SuspiciousSand, - Block::SuspiciousGravel, - Block::WhiteConcretePowder, - Block::OrangeConcretePowder, - Block::MagentaConcretePowder, - Block::LightBlueConcretePowder, - Block::YellowConcretePowder, - Block::LimeConcretePowder, - Block::PinkConcretePowder, - Block::GrayConcretePowder, - Block::LightGrayConcretePowder, - Block::CyanConcretePowder, - Block::PurpleConcretePowder, - Block::BlueConcretePowder, - Block::BrownConcretePowder, - Block::GreenConcretePowder, - Block::RedConcretePowder, - Block::BlackConcretePowder, + Block::MuddyMangroveRoots, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, ]) }); -pub static MINEABLE_AXE: Lazy> = Lazy::new(|| { +pub static BADLANDS_TERRACOTTA: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Terracotta, + Block::WhiteTerracotta, + Block::YellowTerracotta, + Block::OrangeTerracotta, + Block::RedTerracotta, + Block::BrownTerracotta, + Block::LightGrayTerracotta, + ]) +}); +pub static BAMBOO_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::BambooBlock, Block::StrippedBambooBlock])); +pub static BAMBOO_PLANTABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::NoteBlock, - Block::AttachedMelonStem, - Block::AttachedPumpkinStem, - Block::Azalea, Block::Bamboo, - Block::Barrel, - Block::BeeNest, - Block::Beehive, - Block::Beetroots, - Block::BigDripleafStem, - Block::BigDripleaf, - Block::Bookshelf, - Block::BrownMushroomBlock, - Block::BrownMushroom, - Block::Campfire, - Block::Carrots, - Block::CartographyTable, - Block::CarvedPumpkin, - Block::CaveVinesPlant, - Block::CaveVines, - Block::Chest, - Block::ChorusFlower, - Block::ChorusPlant, - Block::Cocoa, - Block::Composter, - Block::CraftingTable, - Block::CrimsonFungus, - Block::DaylightDetector, - Block::DeadBush, - Block::Fern, - Block::FletchingTable, - Block::GlowLichen, - Block::ShortGrass, - Block::HangingRoots, - Block::JackOLantern, - Block::Jukebox, - Block::Ladder, - Block::LargeFern, - Block::Lectern, - Block::LilyPad, - Block::Loom, - Block::MelonStem, - Block::Melon, - Block::MushroomStem, - Block::NetherWart, - Block::Potatoes, - Block::PumpkinStem, - Block::Pumpkin, - Block::RedMushroomBlock, - Block::RedMushroom, - Block::Scaffolding, - Block::SmallDripleaf, - Block::SmithingTable, - Block::SoulCampfire, - Block::SporeBlossom, - Block::SugarCane, - Block::SweetBerryBush, - Block::TallGrass, - Block::TrappedChest, - Block::TwistingVinesPlant, - Block::TwistingVines, - Block::Vine, - Block::WarpedFungus, - Block::WeepingVinesPlant, - Block::WeepingVines, - Block::Wheat, - Block::MangroveRoots, - Block::BambooMosaic, - Block::BambooMosaicSlab, - Block::BambooMosaicStairs, - Block::ChiseledBookshelf, + Block::BambooSapling, + Block::Gravel, + Block::SuspiciousGravel, + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static BANNERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ Block::WhiteBanner, Block::OrangeBanner, Block::MagentaBanner, @@ -151,38 +270,92 @@ pub static MINEABLE_AXE: Lazy> = Lazy::new(|| { Block::GreenWallBanner, Block::RedWallBanner, Block::BlackWallBanner, - Block::AcaciaFenceGate, - Block::BirchFenceGate, - Block::DarkOakFenceGate, - Block::JungleFenceGate, - Block::OakFenceGate, - Block::SpruceFenceGate, - Block::CrimsonFenceGate, - Block::WarpedFenceGate, - Block::MangroveFenceGate, - Block::BambooFenceGate, - Block::CherryFenceGate, - Block::OakPlanks, - Block::SprucePlanks, - Block::BirchPlanks, - Block::JunglePlanks, - Block::AcaciaPlanks, - Block::DarkOakPlanks, - Block::CrimsonPlanks, - Block::WarpedPlanks, - Block::MangrovePlanks, - Block::BambooPlanks, - Block::CherryPlanks, - Block::OakSapling, - Block::SpruceSapling, - Block::BirchSapling, - Block::JungleSapling, - Block::AcaciaSapling, - Block::DarkOakSapling, - Block::Azalea, - Block::FloweringAzalea, - Block::MangrovePropagule, - Block::CherrySapling, + ]) +}); +pub static BASE_STONE_NETHER: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::Basalt, Block::Blackstone])); +pub static BASE_STONE_OVERWORLD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + ]) +}); +pub static BEACON_BASE_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetheriteBlock, + Block::EmeraldBlock, + Block::DiamondBlock, + Block::GoldBlock, + Block::IronBlock, + ]) +}); +pub static BEDS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::RedBed, + Block::BlackBed, + Block::BlueBed, + Block::BrownBed, + Block::CyanBed, + Block::GrayBed, + Block::GreenBed, + Block::LightBlueBed, + Block::LightGrayBed, + Block::LimeBed, + Block::MagentaBed, + Block::OrangeBed, + Block::PinkBed, + Block::PurpleBed, + Block::WhiteBed, + Block::YellowBed, + ]) +}); +pub static BEE_GROWABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SweetBerryBush, + Block::CaveVines, + Block::CaveVinesPlant, + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::Wheat, + Block::MelonStem, + Block::PumpkinStem, + Block::TorchflowerCrop, + Block::PitcherCrop, + ]) +}); +pub static BEEHIVES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::BeeNest, Block::Beehive])); +pub static BIG_DRIPLEAF_PLACEABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Farmland, + Block::Clay, + Block::MossBlock, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + ]) +}); +pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + ]) +}); +pub static BUTTONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ Block::OakButton, Block::SpruceButton, Block::BirchButton, @@ -194,104 +367,90 @@ pub static MINEABLE_AXE: Lazy> = Lazy::new(|| { Block::MangroveButton, Block::BambooButton, Block::CherryButton, - Block::OakDoor, - Block::SpruceDoor, - Block::BirchDoor, - Block::JungleDoor, - Block::AcaciaDoor, - Block::DarkOakDoor, - Block::CrimsonDoor, - Block::WarpedDoor, - Block::MangroveDoor, - Block::BambooDoor, - Block::CherryDoor, - Block::OakFence, - Block::AcaciaFence, - Block::DarkOakFence, - Block::SpruceFence, - Block::BirchFence, - Block::JungleFence, - Block::CrimsonFence, - Block::WarpedFence, - Block::MangroveFence, - Block::BambooFence, - Block::CherryFence, - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, - Block::OakSlab, - Block::SpruceSlab, - Block::BirchSlab, - Block::JungleSlab, - Block::AcaciaSlab, - Block::DarkOakSlab, - Block::CrimsonSlab, - Block::WarpedSlab, - Block::MangroveSlab, - Block::BambooSlab, - Block::CherrySlab, - Block::OakStairs, - Block::SpruceStairs, - Block::BirchStairs, - Block::JungleStairs, - Block::AcaciaStairs, - Block::DarkOakStairs, - Block::CrimsonStairs, - Block::WarpedStairs, - Block::MangroveStairs, - Block::BambooStairs, - Block::CherryStairs, - Block::AcaciaTrapdoor, - Block::BirchTrapdoor, - Block::DarkOakTrapdoor, - Block::JungleTrapdoor, - Block::OakTrapdoor, - Block::SpruceTrapdoor, - Block::CrimsonTrapdoor, - Block::WarpedTrapdoor, - Block::MangroveTrapdoor, - Block::BambooTrapdoor, - Block::CherryTrapdoor, - Block::BambooBlock, - Block::StrippedBambooBlock, - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, + Block::StoneButton, + Block::PolishedBlackstoneButton, + ]) +}); +pub static CAMEL_SAND_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + Block::WhiteConcretePowder, + Block::OrangeConcretePowder, + Block::MagentaConcretePowder, + Block::LightBlueConcretePowder, + Block::YellowConcretePowder, + Block::LimeConcretePowder, + Block::PinkConcretePowder, + Block::GrayConcretePowder, + Block::LightGrayConcretePowder, + Block::CyanConcretePowder, + Block::PurpleConcretePowder, + Block::BlueConcretePowder, + Block::BrownConcretePowder, + Block::GreenConcretePowder, + Block::RedConcretePowder, + Block::BlackConcretePowder, + ]) +}); +pub static CAMPFIRES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Campfire, Block::SoulCampfire])); +pub static CANDLE_CAKES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::CandleCake, + Block::WhiteCandleCake, + Block::OrangeCandleCake, + Block::MagentaCandleCake, + Block::LightBlueCandleCake, + Block::YellowCandleCake, + Block::LimeCandleCake, + Block::PinkCandleCake, + Block::GrayCandleCake, + Block::LightGrayCandleCake, + Block::CyanCandleCake, + Block::PurpleCandleCake, + Block::BlueCandleCake, + Block::BrownCandleCake, + Block::GreenCandleCake, + Block::RedCandleCake, + Block::BlackCandleCake, + ]) +}); +pub static CANDLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Candle, + Block::WhiteCandle, + Block::OrangeCandle, + Block::MagentaCandle, + Block::LightBlueCandle, + Block::YellowCandle, + Block::LimeCandle, + Block::PinkCandle, + Block::GrayCandle, + Block::LightGrayCandle, + Block::CyanCandle, + Block::PurpleCandle, + Block::BlueCandle, + Block::BrownCandle, + Block::GreenCandle, + Block::RedCandle, + Block::BlackCandle, + ]) +}); +pub static CAULDRONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Cauldron, + Block::WaterCauldron, + Block::LavaCauldron, + Block::PowderSnowCauldron, + ]) +}); +pub static CAVE_VINES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CaveVinesPlant, Block::CaveVines])); +pub static CEILING_HANGING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ Block::OakHangingSign, Block::SpruceHangingSign, Block::BirchHangingSign, @@ -303,489 +462,161 @@ pub static MINEABLE_AXE: Lazy> = Lazy::new(|| { Block::WarpedHangingSign, Block::MangroveHangingSign, Block::BambooHangingSign, - Block::OakWallHangingSign, - Block::SpruceWallHangingSign, - Block::BirchWallHangingSign, - Block::AcaciaWallHangingSign, - Block::CherryWallHangingSign, - Block::JungleWallHangingSign, - Block::DarkOakWallHangingSign, - Block::CrimsonWallHangingSign, - Block::WarpedWallHangingSign, - Block::MangroveWallHangingSign, - Block::BambooWallHangingSign, - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, + ]) +}); +pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ Block::CherryLog, Block::CherryWood, Block::StrippedCherryLog, Block::StrippedCherryWood, ]) }); -pub static MINEABLE_HOE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::NetherWartBlock, - Block::WarpedWartBlock, - Block::HayBlock, - Block::DriedKelpBlock, - Block::Target, - Block::Shroomlight, - Block::Sponge, - Block::WetSponge, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::SculkSensor, - Block::CalibratedSculkSensor, - Block::MossBlock, - Block::MossCarpet, - Block::Sculk, - Block::SculkCatalyst, - Block::SculkVein, - Block::SculkShrieker, - Block::PinkPetals, - Block::CherryLeaves, - ]) -}); -pub static MINEABLE_PICKAXE: Lazy> = Lazy::new(|| { +pub static CLIMBABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::PolishedGranite, - Block::Diorite, - Block::PolishedDiorite, - Block::Andesite, - Block::PolishedAndesite, - Block::Cobblestone, - Block::GoldOre, - Block::DeepslateGoldOre, - Block::IronOre, - Block::DeepslateIronOre, - Block::CoalOre, - Block::DeepslateCoalOre, - Block::NetherGoldOre, - Block::LapisOre, - Block::DeepslateLapisOre, - Block::LapisBlock, - Block::Dispenser, - Block::Sandstone, - Block::ChiseledSandstone, - Block::CutSandstone, - Block::GoldBlock, - Block::IronBlock, - Block::Bricks, - Block::MossyCobblestone, - Block::Obsidian, - Block::Spawner, - Block::DiamondOre, - Block::DeepslateDiamondOre, - Block::DiamondBlock, - Block::Furnace, - Block::CobblestoneStairs, - Block::StonePressurePlate, - Block::IronDoor, - Block::RedstoneOre, - Block::DeepslateRedstoneOre, - Block::Netherrack, - Block::Basalt, - Block::PolishedBasalt, - Block::StoneBricks, - Block::MossyStoneBricks, - Block::CrackedStoneBricks, - Block::ChiseledStoneBricks, - Block::IronBars, - Block::Chain, - Block::BrickStairs, - Block::StoneBrickStairs, - Block::NetherBricks, - Block::NetherBrickFence, - Block::NetherBrickStairs, - Block::EnchantingTable, - Block::BrewingStand, - Block::EndStone, - Block::SandstoneStairs, - Block::EmeraldOre, - Block::DeepslateEmeraldOre, - Block::EnderChest, - Block::EmeraldBlock, - Block::LightWeightedPressurePlate, - Block::HeavyWeightedPressurePlate, - Block::RedstoneBlock, - Block::NetherQuartzOre, - Block::Hopper, - Block::QuartzBlock, - Block::ChiseledQuartzBlock, - Block::QuartzPillar, - Block::QuartzStairs, - Block::Dropper, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - Block::IronTrapdoor, - Block::Prismarine, - Block::PrismarineBricks, - Block::DarkPrismarine, - Block::PrismarineStairs, - Block::PrismarineBrickStairs, - Block::DarkPrismarineStairs, - Block::PrismarineSlab, - Block::PrismarineBrickSlab, - Block::DarkPrismarineSlab, - Block::Terracotta, - Block::CoalBlock, - Block::RedSandstone, - Block::ChiseledRedSandstone, - Block::CutRedSandstone, - Block::RedSandstoneStairs, - Block::StoneSlab, - Block::SmoothStoneSlab, - Block::SandstoneSlab, - Block::CutSandstoneSlab, - Block::PetrifiedOakSlab, - Block::CobblestoneSlab, - Block::BrickSlab, - Block::StoneBrickSlab, - Block::NetherBrickSlab, - Block::QuartzSlab, - Block::RedSandstoneSlab, - Block::CutRedSandstoneSlab, - Block::PurpurSlab, - Block::SmoothStone, - Block::SmoothSandstone, - Block::SmoothQuartz, - Block::SmoothRedSandstone, - Block::PurpurBlock, - Block::PurpurPillar, - Block::PurpurStairs, - Block::EndStoneBricks, - Block::MagmaBlock, - Block::RedNetherBricks, - Block::BoneBlock, - Block::Observer, - Block::WhiteGlazedTerracotta, - Block::OrangeGlazedTerracotta, - Block::MagentaGlazedTerracotta, - Block::LightBlueGlazedTerracotta, - Block::YellowGlazedTerracotta, - Block::LimeGlazedTerracotta, - Block::PinkGlazedTerracotta, - Block::GrayGlazedTerracotta, - Block::LightGrayGlazedTerracotta, - Block::CyanGlazedTerracotta, - Block::PurpleGlazedTerracotta, - Block::BlueGlazedTerracotta, - Block::BrownGlazedTerracotta, - Block::GreenGlazedTerracotta, - Block::RedGlazedTerracotta, - Block::BlackGlazedTerracotta, - Block::WhiteConcrete, - Block::OrangeConcrete, - Block::MagentaConcrete, - Block::LightBlueConcrete, - Block::YellowConcrete, - Block::LimeConcrete, - Block::PinkConcrete, - Block::GrayConcrete, - Block::LightGrayConcrete, - Block::CyanConcrete, - Block::PurpleConcrete, - Block::BlueConcrete, - Block::BrownConcrete, - Block::GreenConcrete, - Block::RedConcrete, - Block::BlackConcrete, - Block::DeadTubeCoralBlock, - Block::DeadBrainCoralBlock, - Block::DeadBubbleCoralBlock, - Block::DeadFireCoralBlock, - Block::DeadHornCoralBlock, - Block::TubeCoralBlock, - Block::BrainCoralBlock, - Block::BubbleCoralBlock, - Block::FireCoralBlock, - Block::HornCoralBlock, - Block::DeadTubeCoral, - Block::DeadBrainCoral, - Block::DeadBubbleCoral, - Block::DeadFireCoral, - Block::DeadHornCoral, - Block::DeadTubeCoralFan, - Block::DeadBrainCoralFan, - Block::DeadBubbleCoralFan, - Block::DeadFireCoralFan, - Block::DeadHornCoralFan, - Block::DeadTubeCoralWallFan, - Block::DeadBrainCoralWallFan, - Block::DeadBubbleCoralWallFan, - Block::DeadFireCoralWallFan, - Block::DeadHornCoralWallFan, - Block::PolishedGraniteStairs, - Block::SmoothRedSandstoneStairs, - Block::MossyStoneBrickStairs, - Block::PolishedDioriteStairs, - Block::MossyCobblestoneStairs, - Block::EndStoneBrickStairs, - Block::StoneStairs, - Block::SmoothSandstoneStairs, - Block::SmoothQuartzStairs, - Block::GraniteStairs, - Block::AndesiteStairs, - Block::RedNetherBrickStairs, - Block::PolishedAndesiteStairs, - Block::DioriteStairs, - Block::PolishedGraniteSlab, - Block::SmoothRedSandstoneSlab, - Block::MossyStoneBrickSlab, - Block::PolishedDioriteSlab, - Block::MossyCobblestoneSlab, - Block::EndStoneBrickSlab, - Block::SmoothSandstoneSlab, - Block::SmoothQuartzSlab, - Block::GraniteSlab, - Block::AndesiteSlab, - Block::RedNetherBrickSlab, - Block::PolishedAndesiteSlab, - Block::DioriteSlab, - Block::Smoker, - Block::BlastFurnace, - Block::Grindstone, - Block::Stonecutter, - Block::Bell, - Block::Lantern, - Block::SoulLantern, - Block::WarpedNylium, - Block::CrimsonNylium, - Block::NetheriteBlock, - Block::AncientDebris, - Block::CryingObsidian, - Block::RespawnAnchor, - Block::Lodestone, - Block::Blackstone, - Block::BlackstoneStairs, - Block::BlackstoneSlab, - Block::PolishedBlackstone, - Block::PolishedBlackstoneBricks, - Block::CrackedPolishedBlackstoneBricks, - Block::ChiseledPolishedBlackstone, - Block::PolishedBlackstoneBrickSlab, - Block::PolishedBlackstoneBrickStairs, - Block::GildedBlackstone, - Block::PolishedBlackstoneStairs, - Block::PolishedBlackstoneSlab, - Block::PolishedBlackstonePressurePlate, - Block::ChiseledNetherBricks, - Block::CrackedNetherBricks, - Block::QuartzBricks, - Block::Tuff, - Block::Calcite, - Block::OxidizedCopper, - Block::WeatheredCopper, - Block::ExposedCopper, - Block::CopperBlock, - Block::CopperOre, - Block::DeepslateCopperOre, - Block::OxidizedCutCopper, - Block::WeatheredCutCopper, - Block::ExposedCutCopper, - Block::CutCopper, - Block::OxidizedCutCopperStairs, - Block::WeatheredCutCopperStairs, - Block::ExposedCutCopperStairs, - Block::CutCopperStairs, - Block::OxidizedCutCopperSlab, - Block::WeatheredCutCopperSlab, - Block::ExposedCutCopperSlab, - Block::CutCopperSlab, - Block::WaxedCopperBlock, - Block::WaxedWeatheredCopper, - Block::WaxedExposedCopper, - Block::WaxedOxidizedCopper, - Block::WaxedOxidizedCutCopper, - Block::WaxedWeatheredCutCopper, - Block::WaxedExposedCutCopper, - Block::WaxedCutCopper, - Block::WaxedOxidizedCutCopperStairs, - Block::WaxedWeatheredCutCopperStairs, - Block::WaxedExposedCutCopperStairs, - Block::WaxedCutCopperStairs, - Block::WaxedOxidizedCutCopperSlab, - Block::WaxedWeatheredCutCopperSlab, - Block::WaxedExposedCutCopperSlab, - Block::WaxedCutCopperSlab, - Block::LightningRod, - Block::PointedDripstone, - Block::DripstoneBlock, - Block::Deepslate, - Block::CobbledDeepslate, - Block::CobbledDeepslateStairs, - Block::CobbledDeepslateSlab, - Block::PolishedDeepslate, - Block::PolishedDeepslateStairs, - Block::PolishedDeepslateSlab, - Block::DeepslateTiles, - Block::DeepslateTileStairs, - Block::DeepslateTileSlab, - Block::DeepslateBricks, - Block::DeepslateBrickStairs, - Block::DeepslateBrickSlab, - Block::ChiseledDeepslate, - Block::CrackedDeepslateBricks, - Block::CrackedDeepslateTiles, - Block::SmoothBasalt, - Block::RawIronBlock, - Block::RawCopperBlock, - Block::RawGoldBlock, - Block::Ice, - Block::PackedIce, - Block::BlueIce, - Block::Piston, - Block::StickyPiston, - Block::PistonHead, - Block::AmethystCluster, - Block::SmallAmethystBud, - Block::MediumAmethystBud, - Block::LargeAmethystBud, - Block::AmethystBlock, - Block::BuddingAmethyst, - Block::InfestedCobblestone, - Block::InfestedChiseledStoneBricks, - Block::InfestedCrackedStoneBricks, - Block::InfestedDeepslate, - Block::InfestedStone, - Block::InfestedMossyStoneBricks, - Block::InfestedStoneBricks, - Block::Conduit, - Block::MudBricks, - Block::MudBrickStairs, - Block::MudBrickSlab, - Block::PackedMud, - Block::StoneButton, - Block::PolishedBlackstoneButton, - Block::CobblestoneWall, - Block::MossyCobblestoneWall, - Block::BrickWall, - Block::PrismarineWall, - Block::RedSandstoneWall, - Block::MossyStoneBrickWall, - Block::GraniteWall, - Block::StoneBrickWall, - Block::NetherBrickWall, - Block::AndesiteWall, - Block::RedNetherBrickWall, - Block::SandstoneWall, - Block::EndStoneBrickWall, - Block::DioriteWall, - Block::BlackstoneWall, - Block::PolishedBlackstoneBrickWall, - Block::PolishedBlackstoneWall, - Block::CobbledDeepslateWall, - Block::PolishedDeepslateWall, - Block::DeepslateTileWall, - Block::DeepslateBrickWall, - Block::MudBrickWall, - Block::ShulkerBox, - Block::BlackShulkerBox, - Block::BlueShulkerBox, - Block::BrownShulkerBox, - Block::CyanShulkerBox, - Block::GrayShulkerBox, - Block::GreenShulkerBox, - Block::LightBlueShulkerBox, - Block::LightGrayShulkerBox, - Block::LimeShulkerBox, - Block::MagentaShulkerBox, - Block::OrangeShulkerBox, - Block::PinkShulkerBox, - Block::PurpleShulkerBox, - Block::RedShulkerBox, - Block::WhiteShulkerBox, - Block::YellowShulkerBox, - Block::Anvil, - Block::ChippedAnvil, - Block::DamagedAnvil, - Block::Cauldron, - Block::WaterCauldron, - Block::LavaCauldron, - Block::PowderSnowCauldron, - Block::Rail, - Block::PoweredRail, - Block::DetectorRail, - Block::ActivatorRail, + Block::Ladder, + Block::Vine, + Block::Scaffolding, + Block::WeepingVines, + Block::WeepingVinesPlant, + Block::TwistingVines, + Block::TwistingVinesPlant, + Block::CaveVines, + Block::CaveVinesPlant, ]) }); -pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { +pub static COAL_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CoalOre, Block::DeepslateCoalOre])); +pub static COMBINATION_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakFence, - Block::AcaciaFence, - Block::DarkOakFence, - Block::SpruceFence, - Block::BirchFence, - Block::JungleFence, - Block::CrimsonFence, - Block::WarpedFence, - Block::MangroveFence, - Block::BambooFence, - Block::CherryFence, + Block::MossCarpet, + Block::Snow, + Block::NetherSprouts, + Block::WarpedRoots, + Block::CrimsonRoots, + Block::WhiteCarpet, + Block::OrangeCarpet, + Block::MagentaCarpet, + Block::LightBlueCarpet, + Block::YellowCarpet, + Block::LimeCarpet, + Block::PinkCarpet, + Block::GrayCarpet, + Block::LightGrayCarpet, + Block::CyanCarpet, + Block::PurpleCarpet, + Block::BlueCarpet, + Block::BrownCarpet, + Block::GreenCarpet, + Block::RedCarpet, + Block::BlackCarpet, ]) }); -pub static UNDERWATER_BONEMEALS: Lazy> = Lazy::new(|| { +pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, + Block::NetherWartBlock, + Block::WarpedWartBlock, + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, + ]) +}); +pub static CONCRETE_POWDER: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteConcretePowder, + Block::OrangeConcretePowder, + Block::MagentaConcretePowder, + Block::LightBlueConcretePowder, + Block::YellowConcretePowder, + Block::LimeConcretePowder, + Block::PinkConcretePowder, + Block::GrayConcretePowder, + Block::LightGrayConcretePowder, + Block::CyanConcretePowder, + Block::PurpleConcretePowder, + Block::BlueConcretePowder, + Block::BrownConcretePowder, + Block::GreenConcretePowder, + Block::RedConcretePowder, + Block::BlackConcretePowder, + ]) +}); +pub static CONVERTABLE_TO_MUD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Dirt, Block::CoarseDirt, Block::RootedDirt])); +pub static COPPER_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CopperOre, Block::DeepslateCopperOre])); +pub static CORAL_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::TubeCoralBlock, + Block::BrainCoralBlock, + Block::BubbleCoralBlock, + Block::FireCoralBlock, + Block::HornCoralBlock, + ]) +}); +pub static CORAL_PLANTS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::TubeCoral, + Block::BrainCoral, + Block::BubbleCoral, + Block::FireCoral, + Block::HornCoral, + ]) +}); +pub static CORALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Seagrass, Block::TubeCoralFan, Block::BrainCoralFan, Block::BubbleCoralFan, Block::FireCoralFan, Block::HornCoralFan, - Block::TubeCoralWallFan, - Block::BrainCoralWallFan, - Block::BubbleCoralWallFan, - Block::FireCoralWallFan, - Block::HornCoralWallFan, Block::TubeCoral, Block::BrainCoral, Block::BubbleCoral, @@ -793,45 +624,112 @@ pub static UNDERWATER_BONEMEALS: Lazy> = Lazy::new(|| { Block::HornCoral, ]) }); -pub static INSIDE_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { +pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::PowderSnow, - Block::SculkVein, - Block::GlowLichen, - Block::LilyPad, - Block::SmallAmethystBud, - Block::PinkPetals, + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, ]) }); -pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { +pub static CROPS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::Wheat, + Block::MelonStem, + Block::PumpkinStem, + Block::TorchflowerCrop, + Block::PitcherCrop, ]) }); -pub static SMALL_DRIPLEAF_PLACEABLE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Clay, Block::MossBlock])); -pub static WALL_CORALS: Lazy> = Lazy::new(|| { +pub static CRYSTAL_SOUND_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock, Block::BuddingAmethyst])); +pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::TubeCoralWallFan, - Block::BrainCoralWallFan, - Block::BubbleCoralWallFan, - Block::FireCoralWallFan, - Block::HornCoralWallFan, + Block::WhiteWool, + Block::OrangeWool, + Block::MagentaWool, + Block::LightBlueWool, + Block::YellowWool, + Block::LimeWool, + Block::PinkWool, + Block::GrayWool, + Block::LightGrayWool, + Block::CyanWool, + Block::PurpleWool, + Block::BlueWool, + Block::BrownWool, + Block::GreenWool, + Block::RedWool, + Block::BlackWool, + Block::WhiteCarpet, + Block::OrangeCarpet, + Block::MagentaCarpet, + Block::LightBlueCarpet, + Block::YellowCarpet, + Block::LimeCarpet, + Block::PinkCarpet, + Block::GrayCarpet, + Block::LightGrayCarpet, + Block::CyanCarpet, + Block::PurpleCarpet, + Block::BlueCarpet, + Block::BrownCarpet, + Block::GreenCarpet, + Block::RedCarpet, + Block::BlackCarpet, + ]) +}); +pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + ]) +}); +pub static DEAD_BUSH_MAY_PLACE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, ]) }); -pub static BAMBOO_PLANTABLE_ON: Lazy> = Lazy::new(|| { +pub static DEEPSLATE_ORE_REPLACEABLES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Deepslate, Block::Tuff])); +pub static DIAMOND_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::DiamondOre, Block::DeepslateDiamondOre])); +pub static DIRT: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Bamboo, - Block::BambooSapling, - Block::Gravel, - Block::SuspiciousGravel, - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -843,74 +741,108 @@ pub static BAMBOO_PLANTABLE_ON: Lazy> = Lazy::new(|| { Block::MuddyMangroveRoots, ]) }); -pub static SWORD_EFFICIENT: Lazy> = Lazy::new(|| { +pub static DOES_NOT_BLOCK_HOPPERS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::BeeNest, Block::Beehive])); +pub static DOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::IronDoor, + Block::OakDoor, + Block::SpruceDoor, + Block::BirchDoor, + Block::JungleDoor, + Block::AcaciaDoor, + Block::DarkOakDoor, + Block::CrimsonDoor, + Block::WarpedDoor, + Block::MangroveDoor, + Block::BambooDoor, + Block::CherryDoor, + ]) +}); +pub static DRAGON_IMMUNE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Barrier, + Block::Bedrock, + Block::EndPortal, + Block::EndPortalFrame, + Block::EndGateway, + Block::CommandBlock, + Block::RepeatingCommandBlock, + Block::ChainCommandBlock, + Block::StructureBlock, + Block::Jigsaw, + Block::MovingPiston, + Block::Obsidian, + Block::CryingObsidian, + Block::EndStone, + Block::IronBars, + Block::RespawnAnchor, + Block::ReinforcedDeepslate, + ]) +}); +pub static DRAGON_TRANSPARENT: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Light, Block::Fire, Block::SoulFire])); +pub static DRIPSTONE_REPLACEABLE_BLOCKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + ]) +}); +pub static EMERALD_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::EmeraldOre, Block::DeepslateEmeraldOre])); +pub static ENCHANTMENT_POWER_PROVIDER: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Bookshelf])); +pub static ENCHANTMENT_POWER_TRANSMITTER: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::Air, + Block::Water, + Block::Lava, Block::ShortGrass, Block::Fern, Block::DeadBush, + Block::Seagrass, + Block::TallSeagrass, + Block::Fire, + Block::SoulFire, + Block::Snow, Block::Vine, Block::GlowLichen, - Block::Sunflower, - Block::Lilac, - Block::RoseBush, - Block::Peony, + Block::Light, Block::TallGrass, Block::LargeFern, + Block::StructureVoid, + Block::VoidAir, + Block::CaveAir, + Block::BubbleColumn, + Block::WarpedRoots, + Block::NetherSprouts, + Block::CrimsonRoots, Block::HangingRoots, - Block::PitcherPlant, + ]) +}); +pub static ENDERMAN_HOLDABLE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::Gravel, Block::BrownMushroom, Block::RedMushroom, - Block::SugarCane, + Block::Tnt, + Block::Cactus, + Block::Clay, Block::Pumpkin, Block::CarvedPumpkin, - Block::JackOLantern, Block::Melon, - Block::AttachedPumpkinStem, - Block::AttachedMelonStem, - Block::LilyPad, - Block::Cocoa, - Block::PitcherCrop, - Block::SweetBerryBush, - Block::CaveVines, - Block::CaveVinesPlant, - Block::SporeBlossom, - Block::MossCarpet, - Block::PinkPetals, - Block::BigDripleaf, - Block::BigDripleafStem, - Block::SmallDripleaf, - Block::NetherWart, - Block::WarpedFungus, - Block::WarpedRoots, - Block::NetherSprouts, Block::CrimsonFungus, - Block::WeepingVines, - Block::WeepingVinesPlant, - Block::TwistingVines, - Block::TwistingVinesPlant, + Block::CrimsonNylium, Block::CrimsonRoots, - Block::ChorusPlant, - Block::ChorusFlower, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::CherryLeaves, - Block::OakSapling, - Block::SpruceSapling, - Block::BirchSapling, - Block::JungleSapling, - Block::AcaciaSapling, - Block::DarkOakSapling, - Block::Azalea, - Block::FloweringAzalea, - Block::MangrovePropagule, - Block::CherrySapling, + Block::WarpedFungus, + Block::WarpedNylium, + Block::WarpedRoots, Block::Dandelion, Block::Poppy, Block::BlueOrchid, @@ -925,49 +857,6 @@ pub static SWORD_EFFICIENT: Lazy> = Lazy::new(|| { Block::LilyOfTheValley, Block::WitherRose, Block::Torchflower, - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::Wheat, - Block::MelonStem, - Block::PumpkinStem, - Block::TorchflowerCrop, - Block::PitcherCrop, - ]) -}); -pub static SNOW_LAYER_CANNOT_SURVIVE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Ice, Block::PackedIce, Block::Barrier])); -pub static MUSHROOM_GROW_BLOCK: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Mycelium, - Block::Podzol, - Block::CrimsonNylium, - Block::WarpedNylium, - ]) -}); -pub static DEAD_BUSH_MAY_PLACE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -979,272 +868,364 @@ pub static DEAD_BUSH_MAY_PLACE_ON: Lazy> = Lazy::new(|| { Block::MuddyMangroveRoots, ]) }); -pub static CONCRETE_POWDER: Lazy> = Lazy::new(|| { +pub static FALL_DAMAGE_RESETTING: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::WhiteConcretePowder, - Block::OrangeConcretePowder, - Block::MagentaConcretePowder, - Block::LightBlueConcretePowder, - Block::YellowConcretePowder, - Block::LimeConcretePowder, - Block::PinkConcretePowder, - Block::GrayConcretePowder, - Block::LightGrayConcretePowder, - Block::CyanConcretePowder, - Block::PurpleConcretePowder, - Block::BlueConcretePowder, - Block::BrownConcretePowder, - Block::GreenConcretePowder, - Block::RedConcretePowder, - Block::BlackConcretePowder, + Block::SweetBerryBush, + Block::Cobweb, + Block::Ladder, + Block::Vine, + Block::Scaffolding, + Block::WeepingVines, + Block::WeepingVinesPlant, + Block::TwistingVines, + Block::TwistingVinesPlant, + Block::CaveVines, + Block::CaveVinesPlant, + ]) +}); +pub static FEATURES_CANNOT_REPLACE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Bedrock, + Block::Spawner, + Block::Chest, + Block::EndPortalFrame, + Block::ReinforcedDeepslate, + ]) +}); +pub static FENCE_GATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaFenceGate, + Block::BirchFenceGate, + Block::DarkOakFenceGate, + Block::JungleFenceGate, + Block::OakFenceGate, + Block::SpruceFenceGate, + Block::CrimsonFenceGate, + Block::WarpedFenceGate, + Block::MangroveFenceGate, + Block::BambooFenceGate, + Block::CherryFenceGate, + ]) +}); +pub static FENCES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetherBrickFence, + Block::OakFence, + Block::AcaciaFence, + Block::DarkOakFence, + Block::SpruceFence, + Block::BirchFence, + Block::JungleFence, + Block::CrimsonFence, + Block::WarpedFence, + Block::MangroveFence, + Block::BambooFence, + Block::CherryFence, ]) }); -pub static WOLVES_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock, Block::Snow, Block::SnowBlock])); -pub static LUSH_GROUND_REPLACEABLE: Lazy> = Lazy::new(|| { +pub static FIRE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Fire, Block::SoulFire])); +pub static FLOWER_POTS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Clay, - Block::Gravel, - Block::Sand, - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::CaveVinesPlant, - Block::CaveVines, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, + Block::FlowerPot, + Block::PottedPoppy, + Block::PottedBlueOrchid, + Block::PottedAllium, + Block::PottedAzureBluet, + Block::PottedRedTulip, + Block::PottedOrangeTulip, + Block::PottedWhiteTulip, + Block::PottedPinkTulip, + Block::PottedOxeyeDaisy, + Block::PottedDandelion, + Block::PottedOakSapling, + Block::PottedSpruceSapling, + Block::PottedBirchSapling, + Block::PottedJungleSapling, + Block::PottedAcaciaSapling, + Block::PottedDarkOakSapling, + Block::PottedRedMushroom, + Block::PottedBrownMushroom, + Block::PottedDeadBush, + Block::PottedFern, + Block::PottedCactus, + Block::PottedCornflower, + Block::PottedLilyOfTheValley, + Block::PottedWitherRose, + Block::PottedBamboo, + Block::PottedCrimsonFungus, + Block::PottedWarpedFungus, + Block::PottedCrimsonRoots, + Block::PottedWarpedRoots, + Block::PottedAzaleaBush, + Block::PottedFloweringAzaleaBush, + Block::PottedMangrovePropagule, + Block::PottedCherrySapling, + Block::PottedTorchflower, ]) }); -pub static PARROTS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { +pub static FLOWERS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Air, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, + Block::FloweringAzalea, + Block::MangrovePropagule, Block::CherryLeaves, - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, + Block::PinkPetals, + Block::ChorusFlower, + Block::SporeBlossom, + Block::Dandelion, + Block::Poppy, + Block::BlueOrchid, + Block::Allium, + Block::AzureBluet, + Block::RedTulip, + Block::OrangeTulip, + Block::WhiteTulip, + Block::PinkTulip, + Block::OxeyeDaisy, + Block::Cornflower, + Block::LilyOfTheValley, + Block::WitherRose, + Block::Torchflower, + Block::Sunflower, + Block::Lilac, + Block::Peony, + Block::RoseBush, + Block::PitcherPlant, ]) }); -pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { +pub static FOXES_SPAWNABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakSlab, - Block::SpruceSlab, - Block::BirchSlab, - Block::JungleSlab, - Block::AcaciaSlab, - Block::DarkOakSlab, - Block::CrimsonSlab, - Block::WarpedSlab, - Block::MangroveSlab, - Block::BambooSlab, - Block::CherrySlab, + Block::GrassBlock, + Block::Snow, + Block::SnowBlock, + Block::Podzol, + Block::CoarseDirt, ]) }); -pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { +pub static FROG_PREFER_JUMP_TO: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::LilyPad, Block::BigDripleaf])); +pub static FROGS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakStairs, - Block::SpruceStairs, - Block::BirchStairs, - Block::JungleStairs, - Block::AcaciaStairs, - Block::DarkOakStairs, - Block::CrimsonStairs, - Block::WarpedStairs, - Block::MangroveStairs, - Block::BambooStairs, - Block::CherryStairs, + Block::GrassBlock, + Block::Mud, + Block::MangroveRoots, + Block::MuddyMangroveRoots, ]) }); -pub static WALL_SIGNS: Lazy> = Lazy::new(|| { +pub static GEODE_INVALID_BLOCKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, + Block::Bedrock, + Block::Water, + Block::Lava, + Block::Ice, + Block::PackedIce, + Block::BlueIce, ]) }); -pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { +pub static GOATS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, + Block::Stone, + Block::Snow, + Block::SnowBlock, + Block::PackedIce, + Block::Gravel, + Block::GrassBlock, ]) }); -pub static WITHER_IMMUNE: Lazy> = Lazy::new(|| { +pub static GOLD_ORES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Barrier, - Block::Bedrock, - Block::EndPortal, - Block::EndPortalFrame, - Block::EndGateway, - Block::CommandBlock, - Block::RepeatingCommandBlock, - Block::ChainCommandBlock, - Block::StructureBlock, - Block::Jigsaw, - Block::MovingPiston, - Block::Light, - Block::ReinforcedDeepslate, + Block::GoldOre, + Block::NetherGoldOre, + Block::DeepslateGoldOre, ]) }); -pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { +pub static GUARDED_BY_PIGLINS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, + Block::GoldBlock, + Block::Barrel, + Block::Chest, + Block::EnderChest, + Block::GildedBlackstone, + Block::TrappedChest, + Block::RawGoldBlock, + Block::ShulkerBox, + Block::BlackShulkerBox, + Block::BlueShulkerBox, + Block::BrownShulkerBox, + Block::CyanShulkerBox, + Block::GrayShulkerBox, + Block::GreenShulkerBox, + Block::LightBlueShulkerBox, + Block::LightGrayShulkerBox, + Block::LimeShulkerBox, + Block::MagentaShulkerBox, + Block::OrangeShulkerBox, + Block::PinkShulkerBox, + Block::PurpleShulkerBox, + Block::RedShulkerBox, + Block::WhiteShulkerBox, + Block::YellowShulkerBox, + Block::GoldOre, + Block::NetherGoldOre, + Block::DeepslateGoldOre, ]) }); -pub static STONE_ORE_REPLACEABLES: Lazy> = Lazy::new(|| { +pub static HOGLIN_REPELLENTS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, + Block::WarpedFungus, + Block::PottedWarpedFungus, + Block::NetherPortal, + Block::RespawnAnchor, ]) }); -pub static EMERALD_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::EmeraldOre, Block::DeepslateEmeraldOre])); -pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { +pub static ICE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Sunflower, - Block::Lilac, - Block::Peony, - Block::RoseBush, - Block::PitcherPlant, + Block::Ice, + Block::PackedIce, + Block::BlueIce, + Block::FrostedIce, ]) }); -pub static BEE_GROWABLES: Lazy> = Lazy::new(|| { +pub static IMPERMEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SweetBerryBush, - Block::CaveVines, - Block::CaveVinesPlant, - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::Wheat, - Block::MelonStem, - Block::PumpkinStem, - Block::TorchflowerCrop, - Block::PitcherCrop, + Block::Glass, + Block::WhiteStainedGlass, + Block::OrangeStainedGlass, + Block::MagentaStainedGlass, + Block::LightBlueStainedGlass, + Block::YellowStainedGlass, + Block::LimeStainedGlass, + Block::PinkStainedGlass, + Block::GrayStainedGlass, + Block::LightGrayStainedGlass, + Block::CyanStainedGlass, + Block::PurpleStainedGlass, + Block::BlueStainedGlass, + Block::BrownStainedGlass, + Block::GreenStainedGlass, + Block::RedStainedGlass, + Block::BlackStainedGlass, + Block::TintedGlass, ]) }); -pub static DOORS: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_DIAMOND_TOOL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![])); +pub static INCORRECT_FOR_GOLD_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::IronDoor, - Block::OakDoor, - Block::SpruceDoor, - Block::BirchDoor, - Block::JungleDoor, - Block::AcaciaDoor, - Block::DarkOakDoor, - Block::CrimsonDoor, - Block::WarpedDoor, - Block::MangroveDoor, - Block::BambooDoor, - Block::CherryDoor, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, + Block::IronBlock, + Block::RawIronBlock, + Block::IronOre, + Block::DeepslateIronOre, + Block::LapisBlock, + Block::LapisOre, + Block::DeepslateLapisOre, + Block::CopperBlock, + Block::RawCopperBlock, + Block::CopperOre, + Block::DeepslateCopperOre, + Block::CutCopperSlab, + Block::CutCopperStairs, + Block::CutCopper, + Block::WeatheredCopper, + Block::WeatheredCutCopperSlab, + Block::WeatheredCutCopperStairs, + Block::WeatheredCutCopper, + Block::OxidizedCopper, + Block::OxidizedCutCopperSlab, + Block::OxidizedCutCopperStairs, + Block::OxidizedCutCopper, + Block::ExposedCopper, + Block::ExposedCutCopperSlab, + Block::ExposedCutCopperStairs, + Block::ExposedCutCopper, + Block::WaxedCopperBlock, + Block::WaxedCutCopperSlab, + Block::WaxedCutCopperStairs, + Block::WaxedCutCopper, + Block::WaxedWeatheredCopper, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedWeatheredCutCopperStairs, + Block::WaxedWeatheredCutCopper, + Block::WaxedExposedCopper, + Block::WaxedExposedCutCopperSlab, + Block::WaxedExposedCutCopperStairs, + Block::WaxedExposedCutCopper, + Block::WaxedOxidizedCopper, + Block::WaxedOxidizedCutCopperSlab, + Block::WaxedOxidizedCutCopperStairs, + Block::WaxedOxidizedCutCopper, + Block::LightningRod, ]) }); -pub static BEDS: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_IRON_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::RedBed, - Block::BlackBed, - Block::BlueBed, - Block::BrownBed, - Block::CyanBed, - Block::GrayBed, - Block::GreenBed, - Block::LightBlueBed, - Block::LightGrayBed, - Block::LimeBed, - Block::MagentaBed, - Block::OrangeBed, - Block::PinkBed, - Block::PurpleBed, - Block::WhiteBed, - Block::YellowBed, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, ]) }); -pub static BASE_STONE_OVERWORLD: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_NETHERITE_TOOL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![])); +pub static INCORRECT_FOR_STONE_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, ]) }); -pub static SNIFFER_EGG_HATCH_BOOST: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::MossBlock])); -pub static VALID_SPAWN: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock, Block::Podzol])); -pub static NEEDS_STONE_TOOL: Lazy> = Lazy::new(|| { +pub static INCORRECT_FOR_WOODEN_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, + Block::DiamondBlock, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EmeraldBlock, + Block::GoldBlock, + Block::RawGoldBlock, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, Block::IronBlock, Block::RawIronBlock, Block::IronOre, @@ -1290,72 +1271,61 @@ pub static NEEDS_STONE_TOOL: Lazy> = Lazy::new(|| { Block::LightningRod, ]) }); -pub static SNIFFER_DIGGABLE_BLOCK: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - ]) -}); -pub static ANCIENT_CITY_REPLACEABLE: Lazy> = Lazy::new(|| { +pub static INFINIBURN_END: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Bedrock, Block::Netherrack, Block::MagmaBlock])); +pub static INFINIBURN_NETHER: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); +pub static INFINIBURN_OVERWORLD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); +pub static INSIDE_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Deepslate, - Block::DeepslateBricks, - Block::DeepslateTiles, - Block::DeepslateBrickSlab, - Block::DeepslateTileSlab, - Block::DeepslateBrickStairs, - Block::DeepslateTileWall, - Block::DeepslateBrickWall, - Block::CobbledDeepslate, - Block::CrackedDeepslateBricks, - Block::CrackedDeepslateTiles, - Block::GrayWool, + Block::PowderSnow, + Block::SculkVein, + Block::GlowLichen, + Block::LilyPad, + Block::SmallAmethystBud, + Block::PinkPetals, ]) }); -pub static COPPER_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CopperOre, Block::DeepslateCopperOre])); -pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, +pub static INVALID_SPAWN_INSIDE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::EndPortal, Block::EndGateway])); +pub static IRON_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::IronOre, Block::DeepslateIronOre])); +pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, ]) }); -pub static NYLIUM: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CrimsonNylium, Block::WarpedNylium])); -pub static FEATURES_CANNOT_REPLACE: Lazy> = Lazy::new(|| { +pub static LAPIS_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::LapisOre, Block::DeepslateLapisOre])); +pub static LAVA_POOL_STONE_CANNOT_REPLACE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Bedrock, Block::Spawner, Block::Chest, Block::EndPortalFrame, Block::ReinforcedDeepslate, - ]) -}); -pub static SAND: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - ]) -}); -pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, Block::DarkOakLog, Block::DarkOakWood, Block::StrippedDarkOakLog, @@ -1390,169 +1360,8 @@ pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { Block::StrippedCherryWood, ]) }); -pub static CAMEL_SAND_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - Block::WhiteConcretePowder, - Block::OrangeConcretePowder, - Block::MagentaConcretePowder, - Block::LightBlueConcretePowder, - Block::YellowConcretePowder, - Block::LimeConcretePowder, - Block::PinkConcretePowder, - Block::GrayConcretePowder, - Block::LightGrayConcretePowder, - Block::CyanConcretePowder, - Block::PurpleConcretePowder, - Block::BlueConcretePowder, - Block::BrownConcretePowder, - Block::GreenConcretePowder, - Block::RedConcretePowder, - Block::BlackConcretePowder, - ]) -}); -pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, - ]) -}); -pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteWool, - Block::OrangeWool, - Block::MagentaWool, - Block::LightBlueWool, - Block::YellowWool, - Block::LimeWool, - Block::PinkWool, - Block::GrayWool, - Block::LightGrayWool, - Block::CyanWool, - Block::PurpleWool, - Block::BlueWool, - Block::BrownWool, - Block::GreenWool, - Block::RedWool, - Block::BlackWool, - Block::WhiteCarpet, - Block::OrangeCarpet, - Block::MagentaCarpet, - Block::LightBlueCarpet, - Block::YellowCarpet, - Block::LimeCarpet, - Block::PinkCarpet, - Block::GrayCarpet, - Block::LightGrayCarpet, - Block::CyanCarpet, - Block::PurpleCarpet, - Block::BlueCarpet, - Block::BrownCarpet, - Block::GreenCarpet, - Block::RedCarpet, - Block::BlackCarpet, - ]) -}); -pub static DIAMOND_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::DiamondOre, Block::DeepslateDiamondOre])); -pub static WOOL: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteWool, - Block::OrangeWool, - Block::MagentaWool, - Block::LightBlueWool, - Block::YellowWool, - Block::LimeWool, - Block::PinkWool, - Block::GrayWool, - Block::LightGrayWool, - Block::CyanWool, - Block::PurpleWool, - Block::BlueWool, - Block::BrownWool, - Block::GreenWool, - Block::RedWool, - Block::BlackWool, - ]) -}); -pub static FOXES_SPAWNABLE_ON: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Snow, - Block::SnowBlock, - Block::Podzol, - Block::CoarseDirt, - ]) -}); -pub static ALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakHangingSign, - Block::SpruceHangingSign, - Block::BirchHangingSign, - Block::AcaciaHangingSign, - Block::CherryHangingSign, - Block::JungleHangingSign, - Block::DarkOakHangingSign, - Block::CrimsonHangingSign, - Block::WarpedHangingSign, - Block::MangroveHangingSign, - Block::BambooHangingSign, - Block::OakWallHangingSign, - Block::SpruceWallHangingSign, - Block::BirchWallHangingSign, - Block::AcaciaWallHangingSign, - Block::CherryWallHangingSign, - Block::JungleWallHangingSign, - Block::DarkOakWallHangingSign, - Block::CrimsonWallHangingSign, - Block::WarpedWallHangingSign, - Block::MangroveWallHangingSign, - Block::BambooWallHangingSign, - ]) -}); -pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::AcaciaTrapdoor, - Block::BirchTrapdoor, - Block::DarkOakTrapdoor, - Block::JungleTrapdoor, - Block::OakTrapdoor, - Block::SpruceTrapdoor, - Block::CrimsonTrapdoor, - Block::WarpedTrapdoor, - Block::MangroveTrapdoor, - Block::BambooTrapdoor, - Block::CherryTrapdoor, - ]) -}); -pub static DRAGON_TRANSPARENT: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Light, Block::Fire, Block::SoulFire])); -pub static REPLACEABLE_BY_TREES: Lazy> = Lazy::new(|| { +pub static LEAVES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::ShortGrass, - Block::Fern, - Block::DeadBush, - Block::Vine, - Block::GlowLichen, - Block::Sunflower, - Block::Lilac, - Block::RoseBush, - Block::Peony, - Block::TallGrass, - Block::LargeFern, - Block::HangingRoots, - Block::PitcherPlant, - Block::Water, - Block::Seagrass, - Block::TallSeagrass, - Block::WarpedRoots, - Block::NetherSprouts, - Block::CrimsonRoots, Block::JungleLeaves, Block::OakLeaves, Block::SpruceLeaves, @@ -1565,171 +1374,372 @@ pub static REPLACEABLE_BY_TREES: Lazy> = Lazy::new(|| { Block::CherryLeaves, ]) }); -pub static FLOWERS: Lazy> = Lazy::new(|| { +pub static LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::FloweringAzaleaLeaves, - Block::FloweringAzalea, - Block::MangrovePropagule, - Block::CherryLeaves, - Block::PinkPetals, - Block::ChorusFlower, - Block::SporeBlossom, - Block::Dandelion, - Block::Poppy, - Block::BlueOrchid, - Block::Allium, - Block::AzureBluet, - Block::RedTulip, - Block::OrangeTulip, - Block::WhiteTulip, - Block::PinkTulip, - Block::OxeyeDaisy, - Block::Cornflower, - Block::LilyOfTheValley, - Block::WitherRose, - Block::Torchflower, - Block::Sunflower, - Block::Lilac, - Block::Peony, - Block::RoseBush, - Block::PitcherPlant, + Block::CrimsonStem, + Block::StrippedCrimsonStem, + Block::CrimsonHyphae, + Block::StrippedCrimsonHyphae, + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, ]) }); -pub static FIRE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Fire, Block::SoulFire])); -pub static CANDLE_CAKES: Lazy> = Lazy::new(|| { +pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::CandleCake, - Block::WhiteCandleCake, - Block::OrangeCandleCake, - Block::MagentaCandleCake, - Block::LightBlueCandleCake, - Block::YellowCandleCake, - Block::LimeCandleCake, - Block::PinkCandleCake, - Block::GrayCandleCake, - Block::LightGrayCandleCake, - Block::CyanCandleCake, - Block::PurpleCandleCake, - Block::BlueCandleCake, - Block::BrownCandleCake, - Block::GreenCandleCake, - Block::RedCandleCake, - Block::BlackCandleCake, + Block::DarkOakLog, + Block::DarkOakWood, + Block::StrippedDarkOakLog, + Block::StrippedDarkOakWood, + Block::OakLog, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, + Block::AcaciaLog, + Block::AcaciaWood, + Block::StrippedAcaciaLog, + Block::StrippedAcaciaWood, + Block::BirchLog, + Block::BirchWood, + Block::StrippedBirchLog, + Block::StrippedBirchWood, + Block::JungleLog, + Block::JungleWood, + Block::StrippedJungleLog, + Block::StrippedJungleWood, + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, + Block::CherryLog, + Block::CherryWood, + Block::StrippedCherryLog, + Block::StrippedCherryWood, ]) }); -pub static BANNERS: Lazy> = Lazy::new(|| { +pub static LUSH_GROUND_REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::WhiteBanner, - Block::OrangeBanner, - Block::MagentaBanner, - Block::LightBlueBanner, - Block::YellowBanner, - Block::LimeBanner, - Block::PinkBanner, - Block::GrayBanner, - Block::LightGrayBanner, - Block::CyanBanner, - Block::PurpleBanner, - Block::BlueBanner, - Block::BrownBanner, - Block::GreenBanner, - Block::RedBanner, - Block::BlackBanner, - Block::WhiteWallBanner, - Block::OrangeWallBanner, - Block::MagentaWallBanner, - Block::LightBlueWallBanner, - Block::YellowWallBanner, - Block::LimeWallBanner, - Block::PinkWallBanner, - Block::GrayWallBanner, - Block::LightGrayWallBanner, - Block::CyanWallBanner, - Block::PurpleWallBanner, - Block::BlueWallBanner, - Block::BrownWallBanner, - Block::GreenWallBanner, - Block::RedWallBanner, - Block::BlackWallBanner, + Block::Clay, + Block::Gravel, + Block::Sand, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::CaveVinesPlant, + Block::CaveVines, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, ]) }); -pub static TERRACOTTA: Lazy> = Lazy::new(|| { +pub static MAINTAINS_FARMLAND: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, + Block::PumpkinStem, + Block::AttachedPumpkinStem, + Block::MelonStem, + Block::AttachedMelonStem, + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::TorchflowerCrop, + Block::Torchflower, + Block::PitcherCrop, + Block::Wheat, ]) }); -pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { +pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, + Block::MangroveLog, + Block::MangroveWood, + Block::StrippedMangroveLog, + Block::StrippedMangroveWood, ]) }); -pub static PIGLIN_REPELLENTS: Lazy> = Lazy::new(|| { +pub static MANGROVE_LOGS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SoulFire, - Block::SoulTorch, - Block::SoulLantern, - Block::SoulWallTorch, - Block::SoulCampfire, + Block::Mud, + Block::MuddyMangroveRoots, + Block::MangroveRoots, + Block::MangroveLeaves, + Block::MangroveLog, + Block::MangrovePropagule, + Block::MossCarpet, + Block::Vine, ]) }); -pub static MANGROVE_LOGS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { +pub static MANGROVE_ROOTS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Mud, Block::MuddyMangroveRoots, Block::MangroveRoots, - Block::MangroveLeaves, - Block::MangroveLog, + Block::MossCarpet, + Block::Vine, + Block::MangrovePropagule, + Block::Snow, + ]) +}); +pub static MINEABLE_AXE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NoteBlock, + Block::AttachedMelonStem, + Block::AttachedPumpkinStem, + Block::Azalea, + Block::Bamboo, + Block::Barrel, + Block::BeeNest, + Block::Beehive, + Block::Beetroots, + Block::BigDripleafStem, + Block::BigDripleaf, + Block::Bookshelf, + Block::BrownMushroomBlock, + Block::BrownMushroom, + Block::Campfire, + Block::Carrots, + Block::CartographyTable, + Block::CarvedPumpkin, + Block::CaveVinesPlant, + Block::CaveVines, + Block::Chest, + Block::ChorusFlower, + Block::ChorusPlant, + Block::Cocoa, + Block::Composter, + Block::CraftingTable, + Block::CrimsonFungus, + Block::DaylightDetector, + Block::DeadBush, + Block::Fern, + Block::FletchingTable, + Block::GlowLichen, + Block::ShortGrass, + Block::HangingRoots, + Block::JackOLantern, + Block::Jukebox, + Block::Ladder, + Block::LargeFern, + Block::Lectern, + Block::LilyPad, + Block::Loom, + Block::MelonStem, + Block::Melon, + Block::MushroomStem, + Block::NetherWart, + Block::Potatoes, + Block::PumpkinStem, + Block::Pumpkin, + Block::RedMushroomBlock, + Block::RedMushroom, + Block::Scaffolding, + Block::SmallDripleaf, + Block::SmithingTable, + Block::SoulCampfire, + Block::SporeBlossom, + Block::SugarCane, + Block::SweetBerryBush, + Block::TallGrass, + Block::TrappedChest, + Block::TwistingVinesPlant, + Block::TwistingVines, + Block::Vine, + Block::WarpedFungus, + Block::WeepingVinesPlant, + Block::WeepingVines, + Block::Wheat, + Block::MangroveRoots, + Block::BambooMosaic, + Block::BambooMosaicSlab, + Block::BambooMosaicStairs, + Block::ChiseledBookshelf, + Block::WhiteBanner, + Block::OrangeBanner, + Block::MagentaBanner, + Block::LightBlueBanner, + Block::YellowBanner, + Block::LimeBanner, + Block::PinkBanner, + Block::GrayBanner, + Block::LightGrayBanner, + Block::CyanBanner, + Block::PurpleBanner, + Block::BlueBanner, + Block::BrownBanner, + Block::GreenBanner, + Block::RedBanner, + Block::BlackBanner, + Block::WhiteWallBanner, + Block::OrangeWallBanner, + Block::MagentaWallBanner, + Block::LightBlueWallBanner, + Block::YellowWallBanner, + Block::LimeWallBanner, + Block::PinkWallBanner, + Block::GrayWallBanner, + Block::LightGrayWallBanner, + Block::CyanWallBanner, + Block::PurpleWallBanner, + Block::BlueWallBanner, + Block::BrownWallBanner, + Block::GreenWallBanner, + Block::RedWallBanner, + Block::BlackWallBanner, + Block::AcaciaFenceGate, + Block::BirchFenceGate, + Block::DarkOakFenceGate, + Block::JungleFenceGate, + Block::OakFenceGate, + Block::SpruceFenceGate, + Block::CrimsonFenceGate, + Block::WarpedFenceGate, + Block::MangroveFenceGate, + Block::BambooFenceGate, + Block::CherryFenceGate, + Block::OakPlanks, + Block::SprucePlanks, + Block::BirchPlanks, + Block::JunglePlanks, + Block::AcaciaPlanks, + Block::DarkOakPlanks, + Block::CrimsonPlanks, + Block::WarpedPlanks, + Block::MangrovePlanks, + Block::BambooPlanks, + Block::CherryPlanks, + Block::OakSapling, + Block::SpruceSapling, + Block::BirchSapling, + Block::JungleSapling, + Block::AcaciaSapling, + Block::DarkOakSapling, + Block::Azalea, + Block::FloweringAzalea, Block::MangrovePropagule, - Block::MossCarpet, - Block::Vine, - ]) -}); -pub static BEACON_BASE_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::NetheriteBlock, - Block::EmeraldBlock, - Block::DiamondBlock, - Block::GoldBlock, - Block::IronBlock, - ]) -}); -pub static LAVA_POOL_STONE_CANNOT_REPLACE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Bedrock, - Block::Spawner, - Block::Chest, - Block::EndPortalFrame, - Block::ReinforcedDeepslate, - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::CherryLeaves, + Block::CherrySapling, + Block::OakButton, + Block::SpruceButton, + Block::BirchButton, + Block::JungleButton, + Block::AcaciaButton, + Block::DarkOakButton, + Block::CrimsonButton, + Block::WarpedButton, + Block::MangroveButton, + Block::BambooButton, + Block::CherryButton, + Block::OakDoor, + Block::SpruceDoor, + Block::BirchDoor, + Block::JungleDoor, + Block::AcaciaDoor, + Block::DarkOakDoor, + Block::CrimsonDoor, + Block::WarpedDoor, + Block::MangroveDoor, + Block::BambooDoor, + Block::CherryDoor, + Block::OakFence, + Block::AcaciaFence, + Block::DarkOakFence, + Block::SpruceFence, + Block::BirchFence, + Block::JungleFence, + Block::CrimsonFence, + Block::WarpedFence, + Block::MangroveFence, + Block::BambooFence, + Block::CherryFence, + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + Block::OakSlab, + Block::SpruceSlab, + Block::BirchSlab, + Block::JungleSlab, + Block::AcaciaSlab, + Block::DarkOakSlab, + Block::CrimsonSlab, + Block::WarpedSlab, + Block::MangroveSlab, + Block::BambooSlab, + Block::CherrySlab, + Block::OakStairs, + Block::SpruceStairs, + Block::BirchStairs, + Block::JungleStairs, + Block::AcaciaStairs, + Block::DarkOakStairs, + Block::CrimsonStairs, + Block::WarpedStairs, + Block::MangroveStairs, + Block::BambooStairs, + Block::CherryStairs, + Block::AcaciaTrapdoor, + Block::BirchTrapdoor, + Block::DarkOakTrapdoor, + Block::JungleTrapdoor, + Block::OakTrapdoor, + Block::SpruceTrapdoor, + Block::CrimsonTrapdoor, + Block::WarpedTrapdoor, + Block::MangroveTrapdoor, + Block::BambooTrapdoor, + Block::CherryTrapdoor, + Block::BambooBlock, + Block::StrippedBambooBlock, Block::CrimsonStem, Block::StrippedCrimsonStem, Block::CrimsonHyphae, @@ -1738,6 +1748,50 @@ pub static LAVA_POOL_STONE_CANNOT_REPLACE: Lazy> = Lazy::new(|| { Block::StrippedWarpedStem, Block::WarpedHyphae, Block::StrippedWarpedHyphae, + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + Block::OakHangingSign, + Block::SpruceHangingSign, + Block::BirchHangingSign, + Block::AcaciaHangingSign, + Block::CherryHangingSign, + Block::JungleHangingSign, + Block::DarkOakHangingSign, + Block::CrimsonHangingSign, + Block::WarpedHangingSign, + Block::MangroveHangingSign, + Block::BambooHangingSign, + Block::OakWallHangingSign, + Block::SpruceWallHangingSign, + Block::BirchWallHangingSign, + Block::AcaciaWallHangingSign, + Block::CherryWallHangingSign, + Block::JungleWallHangingSign, + Block::DarkOakWallHangingSign, + Block::CrimsonWallHangingSign, + Block::WarpedWallHangingSign, + Block::MangroveWallHangingSign, + Block::BambooWallHangingSign, Block::DarkOakLog, Block::DarkOakWood, Block::StrippedDarkOakLog, @@ -1772,38 +1826,108 @@ pub static LAVA_POOL_STONE_CANNOT_REPLACE: Lazy> = Lazy::new(|| { Block::StrippedCherryWood, ]) }); -pub static OVERWORLD_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { +pub static MINEABLE_HOE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetherWartBlock, + Block::WarpedWartBlock, + Block::HayBlock, + Block::DriedKelpBlock, + Block::Target, + Block::Shroomlight, + Block::Sponge, + Block::WetSponge, + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::SculkSensor, + Block::CalibratedSculkSensor, + Block::MossBlock, + Block::MossCarpet, + Block::Sculk, + Block::SculkCatalyst, + Block::SculkVein, + Block::SculkShrieker, + Block::PinkPetals, + Block::CherryLeaves, + ]) +}); +pub static MINEABLE_PICKAXE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Water, - Block::Gravel, - Block::SuspiciousGravel, - Block::Sandstone, - Block::RedSandstone, - Block::Calcite, - Block::Snow, - Block::PackedIce, - Block::RawIronBlock, - Block::RawCopperBlock, Block::Stone, Block::Granite, + Block::PolishedGranite, Block::Diorite, + Block::PolishedDiorite, Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, - Block::Sand, - Block::RedSand, - Block::SuspiciousSand, - Block::SuspiciousSand, - Block::Terracotta, + Block::PolishedAndesite, + Block::Cobblestone, + Block::GoldOre, + Block::DeepslateGoldOre, + Block::IronOre, + Block::DeepslateIronOre, + Block::CoalOre, + Block::DeepslateCoalOre, + Block::NetherGoldOre, + Block::LapisOre, + Block::DeepslateLapisOre, + Block::LapisBlock, + Block::Dispenser, + Block::Sandstone, + Block::ChiseledSandstone, + Block::CutSandstone, + Block::GoldBlock, + Block::IronBlock, + Block::Bricks, + Block::MossyCobblestone, + Block::Obsidian, + Block::Spawner, + Block::DiamondOre, + Block::DeepslateDiamondOre, + Block::DiamondBlock, + Block::Furnace, + Block::CobblestoneStairs, + Block::StonePressurePlate, + Block::IronDoor, + Block::RedstoneOre, + Block::DeepslateRedstoneOre, + Block::Netherrack, + Block::Basalt, + Block::PolishedBasalt, + Block::StoneBricks, + Block::MossyStoneBricks, + Block::CrackedStoneBricks, + Block::ChiseledStoneBricks, + Block::IronBars, + Block::Chain, + Block::BrickStairs, + Block::StoneBrickStairs, + Block::NetherBricks, + Block::NetherBrickFence, + Block::NetherBrickStairs, + Block::EnchantingTable, + Block::BrewingStand, + Block::EndStone, + Block::SandstoneStairs, + Block::EmeraldOre, + Block::DeepslateEmeraldOre, + Block::EnderChest, + Block::EmeraldBlock, + Block::LightWeightedPressurePlate, + Block::HeavyWeightedPressurePlate, + Block::RedstoneBlock, + Block::NetherQuartzOre, + Block::Hopper, + Block::QuartzBlock, + Block::ChiseledQuartzBlock, + Block::QuartzPillar, + Block::QuartzStairs, + Block::Dropper, Block::WhiteTerracotta, Block::OrangeTerracotta, Block::MagentaTerracotta, @@ -1820,125 +1944,104 @@ pub static OVERWORLD_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { Block::GreenTerracotta, Block::RedTerracotta, Block::BlackTerracotta, - Block::IronOre, - Block::DeepslateIronOre, - Block::CopperOre, - Block::DeepslateCopperOre, - ]) -}); -pub static STANDING_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - ]) -}); -pub static SLABS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::BambooMosaicSlab, + Block::IronTrapdoor, + Block::Prismarine, + Block::PrismarineBricks, + Block::DarkPrismarine, + Block::PrismarineStairs, + Block::PrismarineBrickStairs, + Block::DarkPrismarineStairs, + Block::PrismarineSlab, + Block::PrismarineBrickSlab, + Block::DarkPrismarineSlab, + Block::Terracotta, + Block::CoalBlock, + Block::RedSandstone, + Block::ChiseledRedSandstone, + Block::CutRedSandstone, + Block::RedSandstoneStairs, Block::StoneSlab, Block::SmoothStoneSlab, - Block::StoneBrickSlab, Block::SandstoneSlab, - Block::PurpurSlab, - Block::QuartzSlab, - Block::RedSandstoneSlab, - Block::BrickSlab, + Block::CutSandstoneSlab, + Block::PetrifiedOakSlab, Block::CobblestoneSlab, + Block::BrickSlab, + Block::StoneBrickSlab, Block::NetherBrickSlab, - Block::PetrifiedOakSlab, - Block::PrismarineSlab, - Block::PrismarineBrickSlab, - Block::DarkPrismarineSlab, - Block::PolishedGraniteSlab, - Block::SmoothRedSandstoneSlab, - Block::MossyStoneBrickSlab, - Block::PolishedDioriteSlab, - Block::MossyCobblestoneSlab, - Block::EndStoneBrickSlab, - Block::SmoothSandstoneSlab, - Block::SmoothQuartzSlab, - Block::GraniteSlab, - Block::AndesiteSlab, - Block::RedNetherBrickSlab, - Block::PolishedAndesiteSlab, - Block::DioriteSlab, - Block::CutSandstoneSlab, + Block::QuartzSlab, + Block::RedSandstoneSlab, Block::CutRedSandstoneSlab, - Block::BlackstoneSlab, - Block::PolishedBlackstoneBrickSlab, - Block::PolishedBlackstoneSlab, - Block::CobbledDeepslateSlab, - Block::PolishedDeepslateSlab, - Block::DeepslateTileSlab, - Block::DeepslateBrickSlab, - Block::WaxedWeatheredCutCopperSlab, - Block::WaxedExposedCutCopperSlab, - Block::WaxedCutCopperSlab, - Block::OxidizedCutCopperSlab, - Block::WeatheredCutCopperSlab, - Block::ExposedCutCopperSlab, - Block::CutCopperSlab, - Block::WaxedOxidizedCutCopperSlab, - Block::MudBrickSlab, - Block::OakSlab, - Block::SpruceSlab, - Block::BirchSlab, - Block::JungleSlab, - Block::AcaciaSlab, - Block::DarkOakSlab, - Block::CrimsonSlab, - Block::WarpedSlab, - Block::MangroveSlab, - Block::BambooSlab, - Block::CherrySlab, - ]) -}); -pub static ANVIL: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Anvil, Block::ChippedAnvil, Block::DamagedAnvil])); -pub static DRAGON_IMMUNE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Barrier, - Block::Bedrock, - Block::EndPortal, - Block::EndPortalFrame, - Block::EndGateway, - Block::CommandBlock, - Block::RepeatingCommandBlock, - Block::ChainCommandBlock, - Block::StructureBlock, - Block::Jigsaw, - Block::MovingPiston, - Block::Obsidian, - Block::CryingObsidian, - Block::EndStone, - Block::IronBars, - Block::RespawnAnchor, - Block::ReinforcedDeepslate, - ]) -}); -pub static STAIRS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::BambooMosaicStairs, - Block::CobblestoneStairs, - Block::SandstoneStairs, - Block::NetherBrickStairs, - Block::StoneBrickStairs, - Block::BrickStairs, + Block::PurpurSlab, + Block::SmoothStone, + Block::SmoothSandstone, + Block::SmoothQuartz, + Block::SmoothRedSandstone, + Block::PurpurBlock, + Block::PurpurPillar, Block::PurpurStairs, - Block::QuartzStairs, - Block::RedSandstoneStairs, - Block::PrismarineBrickStairs, - Block::PrismarineStairs, - Block::DarkPrismarineStairs, + Block::EndStoneBricks, + Block::MagmaBlock, + Block::RedNetherBricks, + Block::BoneBlock, + Block::Observer, + Block::WhiteGlazedTerracotta, + Block::OrangeGlazedTerracotta, + Block::MagentaGlazedTerracotta, + Block::LightBlueGlazedTerracotta, + Block::YellowGlazedTerracotta, + Block::LimeGlazedTerracotta, + Block::PinkGlazedTerracotta, + Block::GrayGlazedTerracotta, + Block::LightGrayGlazedTerracotta, + Block::CyanGlazedTerracotta, + Block::PurpleGlazedTerracotta, + Block::BlueGlazedTerracotta, + Block::BrownGlazedTerracotta, + Block::GreenGlazedTerracotta, + Block::RedGlazedTerracotta, + Block::BlackGlazedTerracotta, + Block::WhiteConcrete, + Block::OrangeConcrete, + Block::MagentaConcrete, + Block::LightBlueConcrete, + Block::YellowConcrete, + Block::LimeConcrete, + Block::PinkConcrete, + Block::GrayConcrete, + Block::LightGrayConcrete, + Block::CyanConcrete, + Block::PurpleConcrete, + Block::BlueConcrete, + Block::BrownConcrete, + Block::GreenConcrete, + Block::RedConcrete, + Block::BlackConcrete, + Block::DeadTubeCoralBlock, + Block::DeadBrainCoralBlock, + Block::DeadBubbleCoralBlock, + Block::DeadFireCoralBlock, + Block::DeadHornCoralBlock, + Block::TubeCoralBlock, + Block::BrainCoralBlock, + Block::BubbleCoralBlock, + Block::FireCoralBlock, + Block::HornCoralBlock, + Block::DeadTubeCoral, + Block::DeadBrainCoral, + Block::DeadBubbleCoral, + Block::DeadFireCoral, + Block::DeadHornCoral, + Block::DeadTubeCoralFan, + Block::DeadBrainCoralFan, + Block::DeadBubbleCoralFan, + Block::DeadFireCoralFan, + Block::DeadHornCoralFan, + Block::DeadTubeCoralWallFan, + Block::DeadBrainCoralWallFan, + Block::DeadBubbleCoralWallFan, + Block::DeadFireCoralWallFan, + Block::DeadHornCoralWallFan, Block::PolishedGraniteStairs, Block::SmoothRedSandstoneStairs, Block::MossyStoneBrickStairs, @@ -1953,183 +2056,238 @@ pub static STAIRS: Lazy> = Lazy::new(|| { Block::RedNetherBrickStairs, Block::PolishedAndesiteStairs, Block::DioriteStairs, + Block::PolishedGraniteSlab, + Block::SmoothRedSandstoneSlab, + Block::MossyStoneBrickSlab, + Block::PolishedDioriteSlab, + Block::MossyCobblestoneSlab, + Block::EndStoneBrickSlab, + Block::SmoothSandstoneSlab, + Block::SmoothQuartzSlab, + Block::GraniteSlab, + Block::AndesiteSlab, + Block::RedNetherBrickSlab, + Block::PolishedAndesiteSlab, + Block::DioriteSlab, + Block::Smoker, + Block::BlastFurnace, + Block::Grindstone, + Block::Stonecutter, + Block::Bell, + Block::Lantern, + Block::SoulLantern, + Block::WarpedNylium, + Block::CrimsonNylium, + Block::NetheriteBlock, + Block::AncientDebris, + Block::CryingObsidian, + Block::RespawnAnchor, + Block::Lodestone, + Block::Blackstone, Block::BlackstoneStairs, + Block::BlackstoneSlab, + Block::PolishedBlackstone, + Block::PolishedBlackstoneBricks, + Block::CrackedPolishedBlackstoneBricks, + Block::ChiseledPolishedBlackstone, + Block::PolishedBlackstoneBrickSlab, Block::PolishedBlackstoneBrickStairs, + Block::GildedBlackstone, Block::PolishedBlackstoneStairs, - Block::CobbledDeepslateStairs, - Block::PolishedDeepslateStairs, - Block::DeepslateTileStairs, - Block::DeepslateBrickStairs, + Block::PolishedBlackstoneSlab, + Block::PolishedBlackstonePressurePlate, + Block::ChiseledNetherBricks, + Block::CrackedNetherBricks, + Block::QuartzBricks, + Block::Tuff, + Block::Calcite, + Block::OxidizedCopper, + Block::WeatheredCopper, + Block::ExposedCopper, + Block::CopperBlock, + Block::CopperOre, + Block::DeepslateCopperOre, + Block::OxidizedCutCopper, + Block::WeatheredCutCopper, + Block::ExposedCutCopper, + Block::CutCopper, Block::OxidizedCutCopperStairs, Block::WeatheredCutCopperStairs, Block::ExposedCutCopperStairs, Block::CutCopperStairs, + Block::OxidizedCutCopperSlab, + Block::WeatheredCutCopperSlab, + Block::ExposedCutCopperSlab, + Block::CutCopperSlab, + Block::WaxedCopperBlock, + Block::WaxedWeatheredCopper, + Block::WaxedExposedCopper, + Block::WaxedOxidizedCopper, + Block::WaxedOxidizedCutCopper, + Block::WaxedWeatheredCutCopper, + Block::WaxedExposedCutCopper, + Block::WaxedCutCopper, + Block::WaxedOxidizedCutCopperStairs, Block::WaxedWeatheredCutCopperStairs, Block::WaxedExposedCutCopperStairs, Block::WaxedCutCopperStairs, - Block::WaxedOxidizedCutCopperStairs, + Block::WaxedOxidizedCutCopperSlab, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedExposedCutCopperSlab, + Block::WaxedCutCopperSlab, + Block::LightningRod, + Block::PointedDripstone, + Block::DripstoneBlock, + Block::Deepslate, + Block::CobbledDeepslate, + Block::CobbledDeepslateStairs, + Block::CobbledDeepslateSlab, + Block::PolishedDeepslate, + Block::PolishedDeepslateStairs, + Block::PolishedDeepslateSlab, + Block::DeepslateTiles, + Block::DeepslateTileStairs, + Block::DeepslateTileSlab, + Block::DeepslateBricks, + Block::DeepslateBrickStairs, + Block::DeepslateBrickSlab, + Block::ChiseledDeepslate, + Block::CrackedDeepslateBricks, + Block::CrackedDeepslateTiles, + Block::SmoothBasalt, + Block::RawIronBlock, + Block::RawCopperBlock, + Block::RawGoldBlock, + Block::Ice, + Block::PackedIce, + Block::BlueIce, + Block::Piston, + Block::StickyPiston, + Block::PistonHead, + Block::AmethystCluster, + Block::SmallAmethystBud, + Block::MediumAmethystBud, + Block::LargeAmethystBud, + Block::AmethystBlock, + Block::BuddingAmethyst, + Block::InfestedCobblestone, + Block::InfestedChiseledStoneBricks, + Block::InfestedCrackedStoneBricks, + Block::InfestedDeepslate, + Block::InfestedStone, + Block::InfestedMossyStoneBricks, + Block::InfestedStoneBricks, + Block::Conduit, + Block::MudBricks, Block::MudBrickStairs, - Block::OakStairs, - Block::SpruceStairs, - Block::BirchStairs, - Block::JungleStairs, - Block::AcaciaStairs, - Block::DarkOakStairs, - Block::CrimsonStairs, - Block::WarpedStairs, - Block::MangroveStairs, - Block::BambooStairs, - Block::CherryStairs, - ]) -}); -pub static CAVE_VINES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CaveVinesPlant, Block::CaveVines])); -pub static NEEDS_DIAMOND_TOOL: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Obsidian, - Block::CryingObsidian, - Block::NetheriteBlock, - Block::RespawnAnchor, - Block::AncientDebris, - ]) -}); -pub static ENDERMAN_HOLDABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::Gravel, - Block::BrownMushroom, - Block::RedMushroom, - Block::Tnt, - Block::Cactus, - Block::Clay, - Block::Pumpkin, - Block::CarvedPumpkin, - Block::Melon, - Block::CrimsonFungus, - Block::CrimsonNylium, - Block::CrimsonRoots, - Block::WarpedFungus, - Block::WarpedNylium, - Block::WarpedRoots, - Block::Dandelion, - Block::Poppy, - Block::BlueOrchid, - Block::Allium, - Block::AzureBluet, - Block::RedTulip, - Block::OrangeTulip, - Block::WhiteTulip, - Block::PinkTulip, - Block::OxeyeDaisy, - Block::Cornflower, - Block::LilyOfTheValley, - Block::WitherRose, - Block::Torchflower, + Block::MudBrickSlab, + Block::PackedMud, + Block::StoneButton, + Block::PolishedBlackstoneButton, + Block::CobblestoneWall, + Block::MossyCobblestoneWall, + Block::BrickWall, + Block::PrismarineWall, + Block::RedSandstoneWall, + Block::MossyStoneBrickWall, + Block::GraniteWall, + Block::StoneBrickWall, + Block::NetherBrickWall, + Block::AndesiteWall, + Block::RedNetherBrickWall, + Block::SandstoneWall, + Block::EndStoneBrickWall, + Block::DioriteWall, + Block::BlackstoneWall, + Block::PolishedBlackstoneBrickWall, + Block::PolishedBlackstoneWall, + Block::CobbledDeepslateWall, + Block::PolishedDeepslateWall, + Block::DeepslateTileWall, + Block::DeepslateBrickWall, + Block::MudBrickWall, + Block::ShulkerBox, + Block::BlackShulkerBox, + Block::BlueShulkerBox, + Block::BrownShulkerBox, + Block::CyanShulkerBox, + Block::GrayShulkerBox, + Block::GreenShulkerBox, + Block::LightBlueShulkerBox, + Block::LightGrayShulkerBox, + Block::LimeShulkerBox, + Block::MagentaShulkerBox, + Block::OrangeShulkerBox, + Block::PinkShulkerBox, + Block::PurpleShulkerBox, + Block::RedShulkerBox, + Block::WhiteShulkerBox, + Block::YellowShulkerBox, + Block::Anvil, + Block::ChippedAnvil, + Block::DamagedAnvil, + Block::Cauldron, + Block::WaterCauldron, + Block::LavaCauldron, + Block::PowderSnowCauldron, + Block::Rail, + Block::PoweredRail, + Block::DetectorRail, + Block::ActivatorRail, + ]) +}); +pub static MINEABLE_SHOVEL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Clay, Block::Dirt, - Block::GrassBlock, - Block::Podzol, Block::CoarseDirt, + Block::Podzol, + Block::Farmland, + Block::GrassBlock, + Block::Gravel, Block::Mycelium, + Block::Sand, + Block::RedSand, + Block::SnowBlock, + Block::Snow, + Block::SoulSand, + Block::DirtPath, + Block::SoulSoil, Block::RootedDirt, - Block::MossBlock, - Block::Mud, Block::MuddyMangroveRoots, + Block::Mud, + Block::SuspiciousSand, + Block::SuspiciousGravel, + Block::WhiteConcretePowder, + Block::OrangeConcretePowder, + Block::MagentaConcretePowder, + Block::LightBlueConcretePowder, + Block::YellowConcretePowder, + Block::LimeConcretePowder, + Block::PinkConcretePowder, + Block::GrayConcretePowder, + Block::LightGrayConcretePowder, + Block::CyanConcretePowder, + Block::PurpleConcretePowder, + Block::BlueConcretePowder, + Block::BrownConcretePowder, + Block::GreenConcretePowder, + Block::RedConcretePowder, + Block::BlackConcretePowder, ]) }); -pub static ENCHANTMENT_POWER_TRANSMITTER: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Air, - Block::Water, - Block::Lava, - Block::ShortGrass, - Block::Fern, - Block::DeadBush, - Block::Seagrass, - Block::TallSeagrass, - Block::Fire, - Block::SoulFire, - Block::Snow, - Block::Vine, - Block::GlowLichen, - Block::Light, - Block::TallGrass, - Block::LargeFern, - Block::StructureVoid, - Block::VoidAir, - Block::CaveAir, - Block::BubbleColumn, - Block::WarpedRoots, - Block::NetherSprouts, - Block::CrimsonRoots, - Block::HangingRoots, - ]) -}); -pub static INFINIBURN_END: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Bedrock, Block::Netherrack, Block::MagmaBlock])); -pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); -pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WhiteCarpet, - Block::OrangeCarpet, - Block::MagentaCarpet, - Block::LightBlueCarpet, - Block::YellowCarpet, - Block::LimeCarpet, - Block::PinkCarpet, - Block::GrayCarpet, - Block::LightGrayCarpet, - Block::CyanCarpet, - Block::PurpleCarpet, - Block::BlueCarpet, - Block::BrownCarpet, - Block::GreenCarpet, - Block::RedCarpet, - Block::BlackCarpet, - ]) -}); -pub static GOATS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { +pub static MOOSHROOMS_SPAWNABLE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Mycelium])); +pub static MOSS_REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Stone, - Block::Snow, - Block::SnowBlock, - Block::PackedIce, - Block::Gravel, - Block::GrassBlock, - ]) -}); -pub static CORAL_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::TubeCoralBlock, - Block::BrainCoralBlock, - Block::BubbleCoralBlock, - Block::FireCoralBlock, - Block::HornCoralBlock, - ]) -}); -pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakDoor, - Block::SpruceDoor, - Block::BirchDoor, - Block::JungleDoor, - Block::AcaciaDoor, - Block::DarkOakDoor, - Block::CrimsonDoor, - Block::WarpedDoor, - Block::MangroveDoor, - Block::BambooDoor, - Block::CherryDoor, - ]) -}); -pub static COAL_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::CoalOre, Block::DeepslateCoalOre])); -pub static BIG_DRIPLEAF_PLACEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Farmland, - Block::Clay, - Block::MossBlock, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::CaveVinesPlant, + Block::CaveVines, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -2141,28 +2299,21 @@ pub static BIG_DRIPLEAF_PLACEABLE: Lazy> = Lazy::new(|| { Block::MuddyMangroveRoots, ]) }); -pub static BUTTONS: Lazy> = Lazy::new(|| { +pub static MUSHROOM_GROW_BLOCK: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakButton, - Block::SpruceButton, - Block::BirchButton, - Block::JungleButton, - Block::AcaciaButton, - Block::DarkOakButton, - Block::CrimsonButton, - Block::WarpedButton, - Block::MangroveButton, - Block::BambooButton, - Block::CherryButton, - Block::StoneButton, - Block::PolishedBlackstoneButton, + Block::Mycelium, + Block::Podzol, + Block::CrimsonNylium, + Block::WarpedNylium, ]) }); -pub static GOLD_ORES: Lazy> = Lazy::new(|| { +pub static NEEDS_DIAMOND_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::GoldOre, - Block::NetherGoldOre, - Block::DeepslateGoldOre, + Block::Obsidian, + Block::CryingObsidian, + Block::NetheriteBlock, + Block::RespawnAnchor, + Block::AncientDebris, ]) }); pub static NEEDS_IRON_TOOL: Lazy> = Lazy::new(|| { @@ -2181,121 +2332,123 @@ pub static NEEDS_IRON_TOOL: Lazy> = Lazy::new(|| { Block::DeepslateRedstoneOre, ]) }); -pub static UNSTABLE_BOTTOM_CENTER: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::AcaciaFenceGate, - Block::BirchFenceGate, - Block::DarkOakFenceGate, - Block::JungleFenceGate, - Block::OakFenceGate, - Block::SpruceFenceGate, - Block::CrimsonFenceGate, - Block::WarpedFenceGate, - Block::MangroveFenceGate, - Block::BambooFenceGate, - Block::CherryFenceGate, - ]) -}); -pub static CORALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::TubeCoralFan, - Block::BrainCoralFan, - Block::BubbleCoralFan, - Block::FireCoralFan, - Block::HornCoralFan, - Block::TubeCoral, - Block::BrainCoral, - Block::BubbleCoral, - Block::FireCoral, - Block::HornCoral, - ]) -}); -pub static WART_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::NetherWartBlock, Block::WarpedWartBlock])); -pub static BEEHIVES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::BeeNest, Block::Beehive])); -pub static POLAR_BEARS_SPAWNABLE_ON_ALTERNATE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Ice])); -pub static DEEPSLATE_ORE_REPLACEABLES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Deepslate, Block::Tuff])); -pub static SNAPS_GOAT_HORN: Lazy> = Lazy::new(|| { +pub static NEEDS_STONE_TOOL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Stone, - Block::PackedIce, + Block::IronBlock, + Block::RawIronBlock, Block::IronOre, - Block::CoalOre, + Block::DeepslateIronOre, + Block::LapisBlock, + Block::LapisOre, + Block::DeepslateLapisOre, + Block::CopperBlock, + Block::RawCopperBlock, Block::CopperOre, - Block::EmeraldOre, - Block::AcaciaLog, - Block::BirchLog, - Block::OakLog, - Block::JungleLog, - Block::SpruceLog, - Block::DarkOakLog, - Block::MangroveLog, - Block::CherryLog, + Block::DeepslateCopperOre, + Block::CutCopperSlab, + Block::CutCopperStairs, + Block::CutCopper, + Block::WeatheredCopper, + Block::WeatheredCutCopperSlab, + Block::WeatheredCutCopperStairs, + Block::WeatheredCutCopper, + Block::OxidizedCopper, + Block::OxidizedCutCopperSlab, + Block::OxidizedCutCopperStairs, + Block::OxidizedCutCopper, + Block::ExposedCopper, + Block::ExposedCutCopperSlab, + Block::ExposedCutCopperStairs, + Block::ExposedCutCopper, + Block::WaxedCopperBlock, + Block::WaxedCutCopperSlab, + Block::WaxedCutCopperStairs, + Block::WaxedCutCopper, + Block::WaxedWeatheredCopper, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedWeatheredCutCopperStairs, + Block::WaxedWeatheredCutCopper, + Block::WaxedExposedCopper, + Block::WaxedExposedCutCopperSlab, + Block::WaxedExposedCutCopperStairs, + Block::WaxedExposedCutCopper, + Block::WaxedOxidizedCopper, + Block::WaxedOxidizedCutCopperSlab, + Block::WaxedOxidizedCutCopperStairs, + Block::WaxedOxidizedCutCopper, + Block::LightningRod, ]) }); -pub static PREVENT_MOB_SPAWNING_INSIDE: Lazy> = Lazy::new(|| { +pub static NETHER_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Rail, - Block::PoweredRail, - Block::DetectorRail, - Block::ActivatorRail, + Block::SoulSand, + Block::SoulSoil, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, + Block::Netherrack, + Block::Basalt, + Block::Blackstone, + Block::Dirt, + Block::GrassBlock, + Block::Podzol, + Block::CoarseDirt, + Block::Mycelium, + Block::RootedDirt, + Block::MossBlock, + Block::Mud, + Block::MuddyMangroveRoots, + Block::CrimsonNylium, + Block::WarpedNylium, + Block::NetherWartBlock, + Block::WarpedWartBlock, ]) }); -pub static CONVERTABLE_TO_MUD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Dirt, Block::CoarseDirt, Block::RootedDirt])); -pub static SOUL_SPEED_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); -pub static OVERWORLD_NATURAL_LOGS: Lazy> = Lazy::new(|| { +pub static NYLIUM: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::CrimsonNylium, Block::WarpedNylium])); +pub static OAK_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::AcaciaLog, - Block::BirchLog, Block::OakLog, - Block::JungleLog, - Block::SpruceLog, - Block::DarkOakLog, - Block::MangroveLog, - Block::CherryLog, - ]) -}); -pub static CORAL_PLANTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::TubeCoral, - Block::BrainCoral, - Block::BubbleCoral, - Block::FireCoral, - Block::HornCoral, + Block::OakWood, + Block::StrippedOakLog, + Block::StrippedOakWood, ]) }); -pub static PORTALS: Lazy> = Lazy::new(|| { +pub static OCCLUDES_VIBRATION_SIGNALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::NetherPortal, - Block::EndPortal, - Block::EndGateway, + Block::WhiteWool, + Block::OrangeWool, + Block::MagentaWool, + Block::LightBlueWool, + Block::YellowWool, + Block::LimeWool, + Block::PinkWool, + Block::GrayWool, + Block::LightGrayWool, + Block::CyanWool, + Block::PurpleWool, + Block::BlueWool, + Block::BrownWool, + Block::GreenWool, + Block::RedWool, + Block::BlackWool, ]) }); -pub static SCULK_REPLACEABLE_WORLD_GEN: Lazy> = Lazy::new(|| { +pub static OVERWORLD_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::DeepslateBricks, - Block::DeepslateTiles, - Block::CobbledDeepslate, - Block::CrackedDeepslateBricks, - Block::CrackedDeepslateTiles, - Block::PolishedDeepslate, - Block::Sand, - Block::RedSand, + Block::Water, Block::Gravel, - Block::SoulSand, - Block::SoulSoil, - Block::Calcite, - Block::SmoothBasalt, - Block::Clay, - Block::DripstoneBlock, - Block::EndStone, - Block::RedSandstone, + Block::SuspiciousGravel, Block::Sandstone, + Block::RedSandstone, + Block::Calcite, + Block::Snow, + Block::PackedIce, + Block::RawIronBlock, + Block::RawCopperBlock, Block::Stone, Block::Granite, Block::Diorite, @@ -2311,6 +2464,10 @@ pub static SCULK_REPLACEABLE_WORLD_GEN: Lazy> = Lazy::new(|| { Block::MossBlock, Block::Mud, Block::MuddyMangroveRoots, + Block::Sand, + Block::RedSand, + Block::SuspiciousSand, + Block::SuspiciousSand, Block::Terracotta, Block::WhiteTerracotta, Block::OrangeTerracotta, @@ -2328,62 +2485,28 @@ pub static SCULK_REPLACEABLE_WORLD_GEN: Lazy> = Lazy::new(|| { Block::GreenTerracotta, Block::RedTerracotta, Block::BlackTerracotta, - Block::CrimsonNylium, - Block::WarpedNylium, - Block::Netherrack, - Block::Basalt, - Block::Blackstone, - ]) -}); -pub static SHULKER_BOXES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::ShulkerBox, - Block::BlackShulkerBox, - Block::BlueShulkerBox, - Block::BrownShulkerBox, - Block::CyanShulkerBox, - Block::GrayShulkerBox, - Block::GreenShulkerBox, - Block::LightBlueShulkerBox, - Block::LightGrayShulkerBox, - Block::LimeShulkerBox, - Block::MagentaShulkerBox, - Block::OrangeShulkerBox, - Block::PinkShulkerBox, - Block::PurpleShulkerBox, - Block::RedShulkerBox, - Block::WhiteShulkerBox, - Block::YellowShulkerBox, - ]) -}); -pub static FENCES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::NetherBrickFence, - Block::OakFence, - Block::AcaciaFence, - Block::DarkOakFence, - Block::SpruceFence, - Block::BirchFence, - Block::JungleFence, - Block::CrimsonFence, - Block::WarpedFence, - Block::MangroveFence, - Block::BambooFence, - Block::CherryFence, + Block::IronOre, + Block::DeepslateIronOre, + Block::CopperOre, + Block::DeepslateCopperOre, ]) }); -pub static GEODE_INVALID_BLOCKS: Lazy> = Lazy::new(|| { +pub static OVERWORLD_NATURAL_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Bedrock, - Block::Water, - Block::Lava, - Block::Ice, - Block::PackedIce, - Block::BlueIce, + Block::AcaciaLog, + Block::BirchLog, + Block::OakLog, + Block::JungleLog, + Block::SpruceLog, + Block::DarkOakLog, + Block::MangroveLog, + Block::CherryLog, ]) }); -pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { +pub static PARROTS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Air, Block::JungleLeaves, Block::OakLeaves, Block::SpruceLeaves, @@ -2394,8 +2517,6 @@ pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { Block::FloweringAzaleaLeaves, Block::MangroveLeaves, Block::CherryLeaves, - Block::NetherWartBlock, - Block::WarpedWartBlock, Block::CrimsonStem, Block::StrippedCrimsonStem, Block::CrimsonHyphae, @@ -2438,60 +2559,84 @@ pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { Block::StrippedCherryWood, ]) }); -pub static FROG_PREFER_JUMP_TO: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::LilyPad, Block::BigDripleaf])); -pub static INFINIBURN_OVERWORLD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); -pub static WITHER_SUMMON_BASE_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); -pub static FALL_DAMAGE_RESETTING: Lazy> = Lazy::new(|| { +pub static PIGLIN_REPELLENTS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SweetBerryBush, - Block::Cobweb, - Block::Ladder, - Block::Vine, - Block::Scaffolding, - Block::WeepingVines, - Block::WeepingVinesPlant, - Block::TwistingVines, - Block::TwistingVinesPlant, - Block::CaveVines, - Block::CaveVinesPlant, + Block::SoulFire, + Block::SoulTorch, + Block::SoulLantern, + Block::SoulWallTorch, + Block::SoulCampfire, + ]) +}); +pub static PLANKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakPlanks, + Block::SprucePlanks, + Block::BirchPlanks, + Block::JunglePlanks, + Block::AcaciaPlanks, + Block::DarkOakPlanks, + Block::CrimsonPlanks, + Block::WarpedPlanks, + Block::MangrovePlanks, + Block::BambooPlanks, + Block::CherryPlanks, + ]) +}); +pub static POLAR_BEARS_SPAWNABLE_ON_ALTERNATE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Ice])); +pub static PORTALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::NetherPortal, + Block::EndPortal, + Block::EndGateway, + ]) +}); +pub static PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::LightWeightedPressurePlate, + Block::HeavyWeightedPressurePlate, + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + Block::StonePressurePlate, + Block::PolishedBlackstonePressurePlate, ]) }); -pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { +pub static PREVENT_MOB_SPAWNING_INSIDE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Dandelion, - Block::Poppy, - Block::BlueOrchid, - Block::Allium, - Block::AzureBluet, - Block::RedTulip, - Block::OrangeTulip, - Block::WhiteTulip, - Block::PinkTulip, - Block::OxeyeDaisy, - Block::Cornflower, - Block::LilyOfTheValley, - Block::WitherRose, - Block::Torchflower, + Block::Rail, + Block::PoweredRail, + Block::DetectorRail, + Block::ActivatorRail, ]) }); -pub static CEILING_HANGING_SIGNS: Lazy> = Lazy::new(|| { +pub static RABBITS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakHangingSign, - Block::SpruceHangingSign, - Block::BirchHangingSign, - Block::AcaciaHangingSign, - Block::CherryHangingSign, - Block::JungleHangingSign, - Block::DarkOakHangingSign, - Block::CrimsonHangingSign, - Block::WarpedHangingSign, - Block::MangroveHangingSign, - Block::BambooHangingSign, + Block::GrassBlock, + Block::Snow, + Block::SnowBlock, + Block::Sand, + ]) +}); +pub static RAILS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Rail, + Block::PoweredRail, + Block::DetectorRail, + Block::ActivatorRail, ]) }); +pub static REDSTONE_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::RedstoneOre, Block::DeepslateRedstoneOre])); pub static REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Air, @@ -2520,231 +2665,81 @@ pub static REPLACEABLE: Lazy> = Lazy::new(|| { Block::HangingRoots, ]) }); -pub static STRIDER_WARM_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Lava])); -pub static ANIMALS_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock])); -pub static INVALID_SPAWN_INSIDE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::EndPortal, Block::EndGateway])); -pub static FENCE_GATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::AcaciaFenceGate, - Block::BirchFenceGate, - Block::DarkOakFenceGate, - Block::JungleFenceGate, - Block::OakFenceGate, - Block::SpruceFenceGate, - Block::CrimsonFenceGate, - Block::WarpedFenceGate, - Block::MangroveFenceGate, - Block::BambooFenceGate, - Block::CherryFenceGate, - ]) -}); -pub static GUARDED_BY_PIGLINS: Lazy> = Lazy::new(|| { +pub static REPLACEABLE_BY_TREES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::GoldBlock, - Block::Barrel, - Block::Chest, - Block::EnderChest, - Block::GildedBlackstone, - Block::TrappedChest, - Block::RawGoldBlock, - Block::ShulkerBox, - Block::BlackShulkerBox, - Block::BlueShulkerBox, - Block::BrownShulkerBox, - Block::CyanShulkerBox, - Block::GrayShulkerBox, - Block::GreenShulkerBox, - Block::LightBlueShulkerBox, - Block::LightGrayShulkerBox, - Block::LimeShulkerBox, - Block::MagentaShulkerBox, - Block::OrangeShulkerBox, - Block::PinkShulkerBox, - Block::PurpleShulkerBox, - Block::RedShulkerBox, - Block::WhiteShulkerBox, - Block::YellowShulkerBox, - Block::GoldOre, - Block::NetherGoldOre, - Block::DeepslateGoldOre, + Block::ShortGrass, + Block::Fern, + Block::DeadBush, + Block::Vine, + Block::GlowLichen, + Block::Sunflower, + Block::Lilac, + Block::RoseBush, + Block::Peony, + Block::TallGrass, + Block::LargeFern, + Block::HangingRoots, + Block::PitcherPlant, + Block::Water, + Block::Seagrass, + Block::TallSeagrass, + Block::WarpedRoots, + Block::NetherSprouts, + Block::CrimsonRoots, + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, ]) }); -pub static AZALEA_GROWS_ON: Lazy> = Lazy::new(|| { +pub static SAND: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SnowBlock, - Block::PowderSnow, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, Block::Sand, Block::RedSand, Block::SuspiciousSand, - Block::SuspiciousSand, - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - ]) -}); -pub static OAK_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - ]) -}); -pub static STONE_BRICKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::StoneBricks, - Block::MossyStoneBricks, - Block::CrackedStoneBricks, - Block::ChiseledStoneBricks, - ]) -}); -pub static LAPIS_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::LapisOre, Block::DeepslateLapisOre])); -pub static IMPERMEABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Glass, - Block::WhiteStainedGlass, - Block::OrangeStainedGlass, - Block::MagentaStainedGlass, - Block::LightBlueStainedGlass, - Block::YellowStainedGlass, - Block::LimeStainedGlass, - Block::PinkStainedGlass, - Block::GrayStainedGlass, - Block::LightGrayStainedGlass, - Block::CyanStainedGlass, - Block::PurpleStainedGlass, - Block::BlueStainedGlass, - Block::BrownStainedGlass, - Block::GreenStainedGlass, - Block::RedStainedGlass, - Block::BlackStainedGlass, - Block::TintedGlass, - ]) -}); -pub static ICE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Ice, - Block::PackedIce, - Block::BlueIce, - Block::FrostedIce, - ]) -}); -pub static ALL_SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, - Block::OakHangingSign, - Block::SpruceHangingSign, - Block::BirchHangingSign, - Block::AcaciaHangingSign, - Block::CherryHangingSign, - Block::JungleHangingSign, - Block::DarkOakHangingSign, - Block::CrimsonHangingSign, - Block::WarpedHangingSign, - Block::MangroveHangingSign, - Block::BambooHangingSign, - Block::OakWallHangingSign, - Block::SpruceWallHangingSign, - Block::BirchWallHangingSign, - Block::AcaciaWallHangingSign, - Block::CherryWallHangingSign, - Block::JungleWallHangingSign, - Block::DarkOakWallHangingSign, - Block::CrimsonWallHangingSign, - Block::WarpedWallHangingSign, - Block::MangroveWallHangingSign, - Block::BambooWallHangingSign, + Block::SuspiciousSand, ]) }); -pub static SIGNS: Lazy> = Lazy::new(|| { +pub static SAPLINGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakSign, - Block::SpruceSign, - Block::BirchSign, - Block::AcaciaSign, - Block::JungleSign, - Block::DarkOakSign, - Block::CrimsonSign, - Block::WarpedSign, - Block::MangroveSign, - Block::BambooSign, - Block::CherrySign, - Block::OakWallSign, - Block::SpruceWallSign, - Block::BirchWallSign, - Block::AcaciaWallSign, - Block::JungleWallSign, - Block::DarkOakWallSign, - Block::CrimsonWallSign, - Block::WarpedWallSign, - Block::MangroveWallSign, - Block::BambooWallSign, - Block::CherryWallSign, + Block::OakSapling, + Block::SpruceSapling, + Block::BirchSapling, + Block::JungleSapling, + Block::AcaciaSapling, + Block::DarkOakSapling, + Block::Azalea, + Block::FloweringAzalea, + Block::MangrovePropagule, + Block::CherrySapling, ]) }); -pub static INFINIBURN_NETHER: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::MagmaBlock])); -pub static NETHER_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { +pub static SCULK_REPLACEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::Sand, + Block::RedSand, + Block::Gravel, Block::SoulSand, Block::SoulSoil, + Block::Calcite, + Block::SmoothBasalt, + Block::Clay, + Block::DripstoneBlock, + Block::EndStone, + Block::RedSandstone, + Block::Sandstone, Block::Stone, Block::Granite, Block::Diorite, Block::Andesite, Block::Tuff, Block::Deepslate, - Block::Netherrack, - Block::Basalt, - Block::Blackstone, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -2754,16 +2749,56 @@ pub static NETHER_CARVER_REPLACEABLES: Lazy> = Lazy::new(|| { Block::MossBlock, Block::Mud, Block::MuddyMangroveRoots, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, Block::CrimsonNylium, Block::WarpedNylium, - Block::NetherWartBlock, - Block::WarpedWartBlock, + Block::Netherrack, + Block::Basalt, + Block::Blackstone, ]) }); -pub static CRYSTAL_SOUND_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock, Block::BuddingAmethyst])); -pub static DIRT: Lazy> = Lazy::new(|| { +pub static SCULK_REPLACEABLE_WORLD_GEN: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Block::DeepslateBricks, + Block::DeepslateTiles, + Block::CobbledDeepslate, + Block::CrackedDeepslateBricks, + Block::CrackedDeepslateTiles, + Block::PolishedDeepslate, + Block::Sand, + Block::RedSand, + Block::Gravel, + Block::SoulSand, + Block::SoulSoil, + Block::Calcite, + Block::SmoothBasalt, + Block::Clay, + Block::DripstoneBlock, + Block::EndStone, + Block::RedSandstone, + Block::Sandstone, + Block::Stone, + Block::Granite, + Block::Diorite, + Block::Andesite, + Block::Tuff, + Block::Deepslate, Block::Dirt, Block::GrassBlock, Block::Podzol, @@ -2773,179 +2808,53 @@ pub static DIRT: Lazy> = Lazy::new(|| { Block::MossBlock, Block::Mud, Block::MuddyMangroveRoots, + Block::Terracotta, + Block::WhiteTerracotta, + Block::OrangeTerracotta, + Block::MagentaTerracotta, + Block::LightBlueTerracotta, + Block::YellowTerracotta, + Block::LimeTerracotta, + Block::PinkTerracotta, + Block::GrayTerracotta, + Block::LightGrayTerracotta, + Block::CyanTerracotta, + Block::PurpleTerracotta, + Block::BlueTerracotta, + Block::BrownTerracotta, + Block::GreenTerracotta, + Block::RedTerracotta, + Block::BlackTerracotta, + Block::CrimsonNylium, + Block::WarpedNylium, + Block::Netherrack, + Block::Basalt, + Block::Blackstone, ]) }); -pub static MOOSHROOMS_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Mycelium])); -pub static PRESSURE_PLATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::LightWeightedPressurePlate, - Block::HeavyWeightedPressurePlate, - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, - Block::StonePressurePlate, - Block::PolishedBlackstonePressurePlate, - ]) -}); -pub static LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, - Block::DarkOakLog, - Block::DarkOakWood, - Block::StrippedDarkOakLog, - Block::StrippedDarkOakWood, - Block::OakLog, - Block::OakWood, - Block::StrippedOakLog, - Block::StrippedOakWood, - Block::AcaciaLog, - Block::AcaciaWood, - Block::StrippedAcaciaLog, - Block::StrippedAcaciaWood, - Block::BirchLog, - Block::BirchWood, - Block::StrippedBirchLog, - Block::StrippedBirchWood, - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, - Block::MangroveLog, - Block::MangroveWood, - Block::StrippedMangroveLog, - Block::StrippedMangroveWood, - Block::CherryLog, - Block::CherryWood, - Block::StrippedCherryLog, - Block::StrippedCherryWood, - ]) -}); -pub static MANGROVE_ROOTS_CAN_GROW_THROUGH: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Mud, - Block::MuddyMangroveRoots, - Block::MangroveRoots, - Block::MossCarpet, - Block::Vine, - Block::MangrovePropagule, - Block::Snow, - ]) -}); -pub static CLIMBABLE: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Ladder, - Block::Vine, - Block::Scaffolding, - Block::WeepingVines, - Block::WeepingVinesPlant, - Block::TwistingVines, - Block::TwistingVinesPlant, - Block::CaveVines, - Block::CaveVinesPlant, - ]) -}); -pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::OakButton, - Block::SpruceButton, - Block::BirchButton, - Block::JungleButton, - Block::AcaciaButton, - Block::DarkOakButton, - Block::CrimsonButton, - Block::WarpedButton, - Block::MangroveButton, - Block::BambooButton, - Block::CherryButton, - ]) -}); -pub static ENCHANTMENT_POWER_PROVIDER: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Bookshelf])); -pub static CAULDRONS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Cauldron, - Block::WaterCauldron, - Block::LavaCauldron, - Block::PowderSnowCauldron, - ]) -}); -pub static SMELTS_TO_GLASS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand])); -pub static WALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { +pub static SHULKER_BOXES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakWallHangingSign, - Block::SpruceWallHangingSign, - Block::BirchWallHangingSign, - Block::AcaciaWallHangingSign, - Block::CherryWallHangingSign, - Block::JungleWallHangingSign, - Block::DarkOakWallHangingSign, - Block::CrimsonWallHangingSign, - Block::WarpedWallHangingSign, - Block::MangroveWallHangingSign, - Block::BambooWallHangingSign, + Block::ShulkerBox, + Block::BlackShulkerBox, + Block::BlueShulkerBox, + Block::BrownShulkerBox, + Block::CyanShulkerBox, + Block::GrayShulkerBox, + Block::GreenShulkerBox, + Block::LightBlueShulkerBox, + Block::LightGrayShulkerBox, + Block::LimeShulkerBox, + Block::MagentaShulkerBox, + Block::OrangeShulkerBox, + Block::PinkShulkerBox, + Block::PurpleShulkerBox, + Block::RedShulkerBox, + Block::WhiteShulkerBox, + Block::YellowShulkerBox, ]) }); -pub static WALL_POST_OVERRIDE: Lazy> = Lazy::new(|| { +pub static SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Torch, - Block::SoulTorch, - Block::RedstoneTorch, - Block::Tripwire, - Block::WhiteBanner, - Block::OrangeBanner, - Block::MagentaBanner, - Block::LightBlueBanner, - Block::YellowBanner, - Block::LimeBanner, - Block::PinkBanner, - Block::GrayBanner, - Block::LightGrayBanner, - Block::CyanBanner, - Block::PurpleBanner, - Block::BlueBanner, - Block::BrownBanner, - Block::GreenBanner, - Block::RedBanner, - Block::BlackBanner, - Block::WhiteWallBanner, - Block::OrangeWallBanner, - Block::MagentaWallBanner, - Block::LightBlueWallBanner, - Block::YellowWallBanner, - Block::LimeWallBanner, - Block::PinkWallBanner, - Block::GrayWallBanner, - Block::LightGrayWallBanner, - Block::CyanWallBanner, - Block::PurpleWallBanner, - Block::BlueWallBanner, - Block::BrownWallBanner, - Block::GreenWallBanner, - Block::RedWallBanner, - Block::BlackWallBanner, - Block::LightWeightedPressurePlate, - Block::HeavyWeightedPressurePlate, Block::OakSign, Block::SpruceSign, Block::BirchSign, @@ -2968,320 +2877,342 @@ pub static WALL_POST_OVERRIDE: Lazy> = Lazy::new(|| { Block::MangroveWallSign, Block::BambooWallSign, Block::CherryWallSign, - Block::OakPressurePlate, - Block::SprucePressurePlate, - Block::BirchPressurePlate, - Block::JunglePressurePlate, - Block::AcaciaPressurePlate, - Block::DarkOakPressurePlate, - Block::CrimsonPressurePlate, - Block::WarpedPressurePlate, - Block::MangrovePressurePlate, - Block::BambooPressurePlate, - Block::CherryPressurePlate, - Block::StonePressurePlate, - Block::PolishedBlackstonePressurePlate, - ]) -}); -pub static HOGLIN_REPELLENTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WarpedFungus, - Block::PottedWarpedFungus, - Block::NetherPortal, - Block::RespawnAnchor, - ]) -}); -pub static FLOWER_POTS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::FlowerPot, - Block::PottedPoppy, - Block::PottedBlueOrchid, - Block::PottedAllium, - Block::PottedAzureBluet, - Block::PottedRedTulip, - Block::PottedOrangeTulip, - Block::PottedWhiteTulip, - Block::PottedPinkTulip, - Block::PottedOxeyeDaisy, - Block::PottedDandelion, - Block::PottedOakSapling, - Block::PottedSpruceSapling, - Block::PottedBirchSapling, - Block::PottedJungleSapling, - Block::PottedAcaciaSapling, - Block::PottedDarkOakSapling, - Block::PottedRedMushroom, - Block::PottedBrownMushroom, - Block::PottedDeadBush, - Block::PottedFern, - Block::PottedCactus, - Block::PottedCornflower, - Block::PottedLilyOfTheValley, - Block::PottedWitherRose, - Block::PottedBamboo, - Block::PottedCrimsonFungus, - Block::PottedWarpedFungus, - Block::PottedCrimsonRoots, - Block::PottedWarpedRoots, - Block::PottedAzaleaBush, - Block::PottedFloweringAzaleaBush, - Block::PottedMangrovePropagule, - Block::PottedCherrySapling, - Block::PottedTorchflower, - ]) -}); -pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::JungleLog, - Block::JungleWood, - Block::StrippedJungleLog, - Block::StrippedJungleWood, - ]) -}); -pub static DRIPSTONE_REPLACEABLE_BLOCKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - ]) -}); -pub static SNOW: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Snow, Block::SnowBlock, Block::PowderSnow])); -pub static TRAPDOORS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::IronTrapdoor, - Block::AcaciaTrapdoor, - Block::BirchTrapdoor, - Block::DarkOakTrapdoor, - Block::JungleTrapdoor, - Block::OakTrapdoor, - Block::SpruceTrapdoor, - Block::CrimsonTrapdoor, - Block::WarpedTrapdoor, - Block::MangroveTrapdoor, - Block::BambooTrapdoor, - Block::CherryTrapdoor, - ]) -}); -pub static AXOLOTLS_SPAWNABLE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Clay])); -pub static TRAIL_RUINS_REPLACEABLE: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Gravel])); -pub static WARPED_STEMS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Block::WarpedStem, - Block::StrippedWarpedStem, - Block::WarpedHyphae, - Block::StrippedWarpedHyphae, ]) }); -pub static SNOW_LAYER_CAN_SURVIVE_ON: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::HoneyBlock, Block::SoulSand, Block::Mud])); -pub static BASE_STONE_NETHER: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Netherrack, Block::Basalt, Block::Blackstone])); -pub static CAMPFIRES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::Campfire, Block::SoulCampfire])); -pub static IRON_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::IronOre, Block::DeepslateIronOre])); -pub static RAILS: Lazy> = Lazy::new(|| { +pub static SLABS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Rail, - Block::PoweredRail, - Block::DetectorRail, - Block::ActivatorRail, + Block::BambooMosaicSlab, + Block::StoneSlab, + Block::SmoothStoneSlab, + Block::StoneBrickSlab, + Block::SandstoneSlab, + Block::PurpurSlab, + Block::QuartzSlab, + Block::RedSandstoneSlab, + Block::BrickSlab, + Block::CobblestoneSlab, + Block::NetherBrickSlab, + Block::PetrifiedOakSlab, + Block::PrismarineSlab, + Block::PrismarineBrickSlab, + Block::DarkPrismarineSlab, + Block::PolishedGraniteSlab, + Block::SmoothRedSandstoneSlab, + Block::MossyStoneBrickSlab, + Block::PolishedDioriteSlab, + Block::MossyCobblestoneSlab, + Block::EndStoneBrickSlab, + Block::SmoothSandstoneSlab, + Block::SmoothQuartzSlab, + Block::GraniteSlab, + Block::AndesiteSlab, + Block::RedNetherBrickSlab, + Block::PolishedAndesiteSlab, + Block::DioriteSlab, + Block::CutSandstoneSlab, + Block::CutRedSandstoneSlab, + Block::BlackstoneSlab, + Block::PolishedBlackstoneBrickSlab, + Block::PolishedBlackstoneSlab, + Block::CobbledDeepslateSlab, + Block::PolishedDeepslateSlab, + Block::DeepslateTileSlab, + Block::DeepslateBrickSlab, + Block::WaxedWeatheredCutCopperSlab, + Block::WaxedExposedCutCopperSlab, + Block::WaxedCutCopperSlab, + Block::OxidizedCutCopperSlab, + Block::WeatheredCutCopperSlab, + Block::ExposedCutCopperSlab, + Block::CutCopperSlab, + Block::WaxedOxidizedCutCopperSlab, + Block::MudBrickSlab, + Block::OakSlab, + Block::SpruceSlab, + Block::BirchSlab, + Block::JungleSlab, + Block::AcaciaSlab, + Block::DarkOakSlab, + Block::CrimsonSlab, + Block::WarpedSlab, + Block::MangroveSlab, + Block::BambooSlab, + Block::CherrySlab, ]) }); -pub static PLANKS: Lazy> = Lazy::new(|| { +pub static SMALL_DRIPLEAF_PLACEABLE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Clay, Block::MossBlock])); +pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakPlanks, - Block::SprucePlanks, - Block::BirchPlanks, - Block::JunglePlanks, - Block::AcaciaPlanks, - Block::DarkOakPlanks, - Block::CrimsonPlanks, - Block::WarpedPlanks, - Block::MangrovePlanks, - Block::BambooPlanks, - Block::CherryPlanks, + Block::Dandelion, + Block::Poppy, + Block::BlueOrchid, + Block::Allium, + Block::AzureBluet, + Block::RedTulip, + Block::OrangeTulip, + Block::WhiteTulip, + Block::PinkTulip, + Block::OxeyeDaisy, + Block::Cornflower, + Block::LilyOfTheValley, + Block::WitherRose, + Block::Torchflower, ]) }); -pub static COMBINATION_STEP_SOUND_BLOCKS: Lazy> = Lazy::new(|| { +pub static SMELTS_TO_GLASS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Sand, Block::RedSand])); +pub static SNAPS_GOAT_HORN: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::MossCarpet, - Block::Snow, - Block::NetherSprouts, - Block::WarpedRoots, - Block::CrimsonRoots, - Block::WhiteCarpet, - Block::OrangeCarpet, - Block::MagentaCarpet, - Block::LightBlueCarpet, - Block::YellowCarpet, - Block::LimeCarpet, - Block::PinkCarpet, - Block::GrayCarpet, - Block::LightGrayCarpet, - Block::CyanCarpet, - Block::PurpleCarpet, - Block::BlueCarpet, - Block::BrownCarpet, - Block::GreenCarpet, - Block::RedCarpet, - Block::BlackCarpet, + Block::Stone, + Block::PackedIce, + Block::IronOre, + Block::CoalOre, + Block::CopperOre, + Block::EmeraldOre, + Block::AcaciaLog, + Block::BirchLog, + Block::OakLog, + Block::JungleLog, + Block::SpruceLog, + Block::DarkOakLog, + Block::MangroveLog, + Block::CherryLog, ]) }); -pub static SCULK_REPLACEABLE: Lazy> = Lazy::new(|| { +pub static SNIFFER_DIGGABLE_BLOCK: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Sand, - Block::RedSand, - Block::Gravel, - Block::SoulSand, - Block::SoulSoil, - Block::Calcite, - Block::SmoothBasalt, - Block::Clay, - Block::DripstoneBlock, - Block::EndStone, - Block::RedSandstone, - Block::Sandstone, - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, Block::Dirt, Block::GrassBlock, Block::Podzol, Block::CoarseDirt, - Block::Mycelium, Block::RootedDirt, Block::MossBlock, Block::Mud, Block::MuddyMangroveRoots, - Block::Terracotta, - Block::WhiteTerracotta, - Block::OrangeTerracotta, - Block::MagentaTerracotta, - Block::LightBlueTerracotta, - Block::YellowTerracotta, - Block::LimeTerracotta, - Block::PinkTerracotta, - Block::GrayTerracotta, - Block::LightGrayTerracotta, - Block::CyanTerracotta, - Block::PurpleTerracotta, - Block::BlueTerracotta, - Block::BrownTerracotta, - Block::GreenTerracotta, - Block::RedTerracotta, - Block::BlackTerracotta, - Block::CrimsonNylium, - Block::WarpedNylium, - Block::Netherrack, - Block::Basalt, - Block::Blackstone, ]) }); -pub static BAMBOO_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::BambooBlock, Block::StrippedBambooBlock])); -pub static MOSS_REPLACEABLE: Lazy> = Lazy::new(|| { +pub static SNIFFER_EGG_HATCH_BOOST: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::MossBlock])); +pub static SNOW: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Snow, Block::SnowBlock, Block::PowderSnow])); +pub static SNOW_LAYER_CAN_SURVIVE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::HoneyBlock, Block::SoulSand, Block::Mud])); +pub static SNOW_LAYER_CANNOT_SURVIVE_ON: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Ice, Block::PackedIce, Block::Barrier])); +pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); +pub static SOUL_SPEED_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); +pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::SpruceLog, + Block::SpruceWood, + Block::StrippedSpruceLog, + Block::StrippedSpruceWood, + ]) +}); +pub static STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::BambooMosaicStairs, + Block::CobblestoneStairs, + Block::SandstoneStairs, + Block::NetherBrickStairs, + Block::StoneBrickStairs, + Block::BrickStairs, + Block::PurpurStairs, + Block::QuartzStairs, + Block::RedSandstoneStairs, + Block::PrismarineBrickStairs, + Block::PrismarineStairs, + Block::DarkPrismarineStairs, + Block::PolishedGraniteStairs, + Block::SmoothRedSandstoneStairs, + Block::MossyStoneBrickStairs, + Block::PolishedDioriteStairs, + Block::MossyCobblestoneStairs, + Block::EndStoneBrickStairs, + Block::StoneStairs, + Block::SmoothSandstoneStairs, + Block::SmoothQuartzStairs, + Block::GraniteStairs, + Block::AndesiteStairs, + Block::RedNetherBrickStairs, + Block::PolishedAndesiteStairs, + Block::DioriteStairs, + Block::BlackstoneStairs, + Block::PolishedBlackstoneBrickStairs, + Block::PolishedBlackstoneStairs, + Block::CobbledDeepslateStairs, + Block::PolishedDeepslateStairs, + Block::DeepslateTileStairs, + Block::DeepslateBrickStairs, + Block::OxidizedCutCopperStairs, + Block::WeatheredCutCopperStairs, + Block::ExposedCutCopperStairs, + Block::CutCopperStairs, + Block::WaxedWeatheredCutCopperStairs, + Block::WaxedExposedCutCopperStairs, + Block::WaxedCutCopperStairs, + Block::WaxedOxidizedCutCopperStairs, + Block::MudBrickStairs, + Block::OakStairs, + Block::SpruceStairs, + Block::BirchStairs, + Block::JungleStairs, + Block::AcaciaStairs, + Block::DarkOakStairs, + Block::CrimsonStairs, + Block::WarpedStairs, + Block::MangroveStairs, + Block::BambooStairs, + Block::CherryStairs, + ]) +}); +pub static STANDING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + ]) +}); +pub static STONE_BRICKS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::StoneBricks, + Block::MossyStoneBricks, + Block::CrackedStoneBricks, + Block::ChiseledStoneBricks, + ]) +}); +pub static STONE_BUTTONS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::StoneButton, Block::PolishedBlackstoneButton])); +pub static STONE_ORE_REPLACEABLES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Block::Stone, Block::Granite, Block::Diorite, Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::CaveVinesPlant, - Block::CaveVines, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, ]) }); -pub static CANDLES: Lazy> = Lazy::new(|| { +pub static STONE_PRESSURE_PLATES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Candle, - Block::WhiteCandle, - Block::OrangeCandle, - Block::MagentaCandle, - Block::LightBlueCandle, - Block::YellowCandle, - Block::LimeCandle, - Block::PinkCandle, - Block::GrayCandle, - Block::LightGrayCandle, - Block::CyanCandle, - Block::PurpleCandle, - Block::BlueCandle, - Block::BrownCandle, - Block::GreenCandle, - Block::RedCandle, - Block::BlackCandle, + Block::StonePressurePlate, + Block::PolishedBlackstonePressurePlate, ]) }); -pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { +pub static STRIDER_WARM_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Lava])); +pub static SWORD_EFFICIENT: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::SpruceLog, - Block::SpruceWood, - Block::StrippedSpruceLog, - Block::StrippedSpruceWood, + Block::ShortGrass, + Block::Fern, + Block::DeadBush, + Block::Vine, + Block::GlowLichen, + Block::Sunflower, + Block::Lilac, + Block::RoseBush, + Block::Peony, + Block::TallGrass, + Block::LargeFern, + Block::HangingRoots, + Block::PitcherPlant, + Block::BrownMushroom, + Block::RedMushroom, + Block::SugarCane, + Block::Pumpkin, + Block::CarvedPumpkin, + Block::JackOLantern, + Block::Melon, + Block::AttachedPumpkinStem, + Block::AttachedMelonStem, + Block::LilyPad, + Block::Cocoa, + Block::PitcherCrop, + Block::SweetBerryBush, + Block::CaveVines, + Block::CaveVinesPlant, + Block::SporeBlossom, + Block::MossCarpet, + Block::PinkPetals, + Block::BigDripleaf, + Block::BigDripleafStem, + Block::SmallDripleaf, + Block::NetherWart, + Block::WarpedFungus, + Block::WarpedRoots, + Block::NetherSprouts, + Block::CrimsonFungus, + Block::WeepingVines, + Block::WeepingVinesPlant, + Block::TwistingVines, + Block::TwistingVinesPlant, + Block::CrimsonRoots, + Block::ChorusPlant, + Block::ChorusFlower, + Block::JungleLeaves, + Block::OakLeaves, + Block::SpruceLeaves, + Block::DarkOakLeaves, + Block::AcaciaLeaves, + Block::BirchLeaves, + Block::AzaleaLeaves, + Block::FloweringAzaleaLeaves, + Block::MangroveLeaves, + Block::CherryLeaves, + Block::OakSapling, + Block::SpruceSapling, + Block::BirchSapling, + Block::JungleSapling, + Block::AcaciaSapling, + Block::DarkOakSapling, + Block::Azalea, + Block::FloweringAzalea, + Block::MangrovePropagule, + Block::CherrySapling, + Block::Dandelion, + Block::Poppy, + Block::BlueOrchid, + Block::Allium, + Block::AzureBluet, + Block::RedTulip, + Block::OrangeTulip, + Block::WhiteTulip, + Block::PinkTulip, + Block::OxeyeDaisy, + Block::Cornflower, + Block::LilyOfTheValley, + Block::WitherRose, + Block::Torchflower, + Block::Beetroots, + Block::Carrots, + Block::Potatoes, + Block::Wheat, + Block::MelonStem, + Block::PumpkinStem, + Block::TorchflowerCrop, + Block::PitcherCrop, ]) }); -pub static OCCLUDES_VIBRATION_SIGNALS: Lazy> = Lazy::new(|| { +pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::WhiteWool, - Block::OrangeWool, - Block::MagentaWool, - Block::LightBlueWool, - Block::YellowWool, - Block::LimeWool, - Block::PinkWool, - Block::GrayWool, - Block::LightGrayWool, - Block::CyanWool, - Block::PurpleWool, - Block::BlueWool, - Block::BrownWool, - Block::GreenWool, - Block::RedWool, - Block::BlackWool, + Block::Sunflower, + Block::Lilac, + Block::Peony, + Block::RoseBush, + Block::PitcherPlant, ]) }); -pub static AZALEA_ROOT_REPLACEABLE: Lazy> = Lazy::new(|| { +pub static TERRACOTTA: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::RedSand, - Block::Clay, - Block::Gravel, - Block::Sand, - Block::SnowBlock, - Block::PowderSnow, - Block::Stone, - Block::Granite, - Block::Diorite, - Block::Andesite, - Block::Tuff, - Block::Deepslate, - Block::Dirt, - Block::GrassBlock, - Block::Podzol, - Block::CoarseDirt, - Block::Mycelium, - Block::RootedDirt, - Block::MossBlock, - Block::Mud, - Block::MuddyMangroveRoots, Block::Terracotta, Block::WhiteTerracotta, Block::OrangeTerracotta, @@ -3301,87 +3232,177 @@ pub static AZALEA_ROOT_REPLACEABLE: Lazy> = Lazy::new(|| { Block::BlackTerracotta, ]) }); -pub static RABBITS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { +pub static TRAIL_RUINS_REPLACEABLE: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::Gravel])); +pub static TRAPDOORS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Snow, - Block::SnowBlock, - Block::Sand, + Block::IronTrapdoor, + Block::AcaciaTrapdoor, + Block::BirchTrapdoor, + Block::DarkOakTrapdoor, + Block::JungleTrapdoor, + Block::OakTrapdoor, + Block::SpruceTrapdoor, + Block::CrimsonTrapdoor, + Block::WarpedTrapdoor, + Block::MangroveTrapdoor, + Block::BambooTrapdoor, + Block::CherryTrapdoor, ]) }); -pub static SAPLINGS: Lazy> = Lazy::new(|| { +pub static UNDERWATER_BONEMEALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::OakSapling, - Block::SpruceSapling, - Block::BirchSapling, - Block::JungleSapling, - Block::AcaciaSapling, - Block::DarkOakSapling, - Block::Azalea, - Block::FloweringAzalea, - Block::MangrovePropagule, - Block::CherrySapling, + Block::Seagrass, + Block::TubeCoralFan, + Block::BrainCoralFan, + Block::BubbleCoralFan, + Block::FireCoralFan, + Block::HornCoralFan, + Block::TubeCoralWallFan, + Block::BrainCoralWallFan, + Block::BubbleCoralWallFan, + Block::FireCoralWallFan, + Block::HornCoralWallFan, + Block::TubeCoral, + Block::BrainCoral, + Block::BubbleCoral, + Block::FireCoral, + Block::HornCoral, ]) }); -pub static LEAVES: Lazy> = Lazy::new(|| { +pub static UNSTABLE_BOTTOM_CENTER: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::JungleLeaves, - Block::OakLeaves, - Block::SpruceLeaves, - Block::DarkOakLeaves, - Block::AcaciaLeaves, - Block::BirchLeaves, - Block::AzaleaLeaves, - Block::FloweringAzaleaLeaves, - Block::MangroveLeaves, - Block::CherryLeaves, + Block::AcaciaFenceGate, + Block::BirchFenceGate, + Block::DarkOakFenceGate, + Block::JungleFenceGate, + Block::OakFenceGate, + Block::SpruceFenceGate, + Block::CrimsonFenceGate, + Block::WarpedFenceGate, + Block::MangroveFenceGate, + Block::BambooFenceGate, + Block::CherryFenceGate, ]) }); -pub static STONE_BUTTONS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::StoneButton, Block::PolishedBlackstoneButton])); -pub static REDSTONE_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::RedstoneOre, Block::DeepslateRedstoneOre])); -pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { +pub static VALID_SPAWN: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::GrassBlock, Block::Podzol])); +pub static VIBRATION_RESONATORS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock])); +pub static WALL_CORALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::CrimsonStem, - Block::StrippedCrimsonStem, - Block::CrimsonHyphae, - Block::StrippedCrimsonHyphae, + Block::TubeCoralWallFan, + Block::BrainCoralWallFan, + Block::BubbleCoralWallFan, + Block::FireCoralWallFan, + Block::HornCoralWallFan, ]) }); -pub static FROGS_SPAWNABLE_ON: Lazy> = Lazy::new(|| { +pub static WALL_HANGING_SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::GrassBlock, - Block::Mud, - Block::MangroveRoots, - Block::MuddyMangroveRoots, + Block::OakWallHangingSign, + Block::SpruceWallHangingSign, + Block::BirchWallHangingSign, + Block::AcaciaWallHangingSign, + Block::CherryWallHangingSign, + Block::JungleWallHangingSign, + Block::DarkOakWallHangingSign, + Block::CrimsonWallHangingSign, + Block::WarpedWallHangingSign, + Block::MangroveWallHangingSign, + Block::BambooWallHangingSign, ]) }); -pub static MAINTAINS_FARMLAND: Lazy> = Lazy::new(|| { +pub static WALL_POST_OVERRIDE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::PumpkinStem, - Block::AttachedPumpkinStem, - Block::MelonStem, - Block::AttachedMelonStem, - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::TorchflowerCrop, - Block::Torchflower, - Block::PitcherCrop, - Block::Wheat, + Block::Torch, + Block::SoulTorch, + Block::RedstoneTorch, + Block::Tripwire, + Block::WhiteBanner, + Block::OrangeBanner, + Block::MagentaBanner, + Block::LightBlueBanner, + Block::YellowBanner, + Block::LimeBanner, + Block::PinkBanner, + Block::GrayBanner, + Block::LightGrayBanner, + Block::CyanBanner, + Block::PurpleBanner, + Block::BlueBanner, + Block::BrownBanner, + Block::GreenBanner, + Block::RedBanner, + Block::BlackBanner, + Block::WhiteWallBanner, + Block::OrangeWallBanner, + Block::MagentaWallBanner, + Block::LightBlueWallBanner, + Block::YellowWallBanner, + Block::LimeWallBanner, + Block::PinkWallBanner, + Block::GrayWallBanner, + Block::LightGrayWallBanner, + Block::CyanWallBanner, + Block::PurpleWallBanner, + Block::BlueWallBanner, + Block::BrownWallBanner, + Block::GreenWallBanner, + Block::RedWallBanner, + Block::BlackWallBanner, + Block::LightWeightedPressurePlate, + Block::HeavyWeightedPressurePlate, + Block::OakSign, + Block::SpruceSign, + Block::BirchSign, + Block::AcaciaSign, + Block::JungleSign, + Block::DarkOakSign, + Block::CrimsonSign, + Block::WarpedSign, + Block::MangroveSign, + Block::BambooSign, + Block::CherrySign, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + Block::StonePressurePlate, + Block::PolishedBlackstonePressurePlate, ]) }); -pub static CROPS: Lazy> = Lazy::new(|| { +pub static WALL_SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::Beetroots, - Block::Carrots, - Block::Potatoes, - Block::Wheat, - Block::MelonStem, - Block::PumpkinStem, - Block::TorchflowerCrop, - Block::PitcherCrop, + Block::OakWallSign, + Block::SpruceWallSign, + Block::BirchWallSign, + Block::AcaciaWallSign, + Block::JungleWallSign, + Block::DarkOakWallSign, + Block::CrimsonWallSign, + Block::WarpedWallSign, + Block::MangroveWallSign, + Block::BambooWallSign, + Block::CherryWallSign, ]) }); pub static WALLS: Lazy> = Lazy::new(|| { @@ -3410,11 +3431,186 @@ pub static WALLS: Lazy> = Lazy::new(|| { Block::MudBrickWall, ]) }); -pub static STONE_PRESSURE_PLATES: Lazy> = Lazy::new(|| { +pub static WARPED_STEMS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Block::StonePressurePlate, - Block::PolishedBlackstonePressurePlate, + Block::WarpedStem, + Block::StrippedWarpedStem, + Block::WarpedHyphae, + Block::StrippedWarpedHyphae, + ]) +}); +pub static WART_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::NetherWartBlock, Block::WarpedWartBlock])); +pub static WITHER_IMMUNE: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::Barrier, + Block::Bedrock, + Block::EndPortal, + Block::EndPortalFrame, + Block::EndGateway, + Block::CommandBlock, + Block::RepeatingCommandBlock, + Block::ChainCommandBlock, + Block::StructureBlock, + Block::Jigsaw, + Block::MovingPiston, + Block::Light, + Block::ReinforcedDeepslate, + ]) +}); +pub static WITHER_SUMMON_BASE_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Block::SoulSand, Block::SoulSoil])); +pub static WOLVES_SPAWNABLE_ON: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::GrassBlock, + Block::Snow, + Block::SnowBlock, + Block::CoarseDirt, + Block::Podzol, + ]) +}); +pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakButton, + Block::SpruceButton, + Block::BirchButton, + Block::JungleButton, + Block::AcaciaButton, + Block::DarkOakButton, + Block::CrimsonButton, + Block::WarpedButton, + Block::MangroveButton, + Block::BambooButton, + Block::CherryButton, + ]) +}); +pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakDoor, + Block::SpruceDoor, + Block::BirchDoor, + Block::JungleDoor, + Block::AcaciaDoor, + Block::DarkOakDoor, + Block::CrimsonDoor, + Block::WarpedDoor, + Block::MangroveDoor, + Block::BambooDoor, + Block::CherryDoor, + ]) +}); +pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakFence, + Block::AcaciaFence, + Block::DarkOakFence, + Block::SpruceFence, + Block::BirchFence, + Block::JungleFence, + Block::CrimsonFence, + Block::WarpedFence, + Block::MangroveFence, + Block::BambooFence, + Block::CherryFence, + ]) +}); +pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakPressurePlate, + Block::SprucePressurePlate, + Block::BirchPressurePlate, + Block::JunglePressurePlate, + Block::AcaciaPressurePlate, + Block::DarkOakPressurePlate, + Block::CrimsonPressurePlate, + Block::WarpedPressurePlate, + Block::MangrovePressurePlate, + Block::BambooPressurePlate, + Block::CherryPressurePlate, + ]) +}); +pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakSlab, + Block::SpruceSlab, + Block::BirchSlab, + Block::JungleSlab, + Block::AcaciaSlab, + Block::DarkOakSlab, + Block::CrimsonSlab, + Block::WarpedSlab, + Block::MangroveSlab, + Block::BambooSlab, + Block::CherrySlab, + ]) +}); +pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::OakStairs, + Block::SpruceStairs, + Block::BirchStairs, + Block::JungleStairs, + Block::AcaciaStairs, + Block::DarkOakStairs, + Block::CrimsonStairs, + Block::WarpedStairs, + Block::MangroveStairs, + Block::BambooStairs, + Block::CherryStairs, + ]) +}); +pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::AcaciaTrapdoor, + Block::BirchTrapdoor, + Block::DarkOakTrapdoor, + Block::JungleTrapdoor, + Block::OakTrapdoor, + Block::SpruceTrapdoor, + Block::CrimsonTrapdoor, + Block::WarpedTrapdoor, + Block::MangroveTrapdoor, + Block::BambooTrapdoor, + Block::CherryTrapdoor, + ]) +}); +pub static WOOL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteWool, + Block::OrangeWool, + Block::MagentaWool, + Block::LightBlueWool, + Block::YellowWool, + Block::LimeWool, + Block::PinkWool, + Block::GrayWool, + Block::LightGrayWool, + Block::CyanWool, + Block::PurpleWool, + Block::BlueWool, + Block::BrownWool, + Block::GreenWool, + Block::RedWool, + Block::BlackWool, + ]) +}); +pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Block::WhiteCarpet, + Block::OrangeCarpet, + Block::MagentaCarpet, + Block::LightBlueCarpet, + Block::YellowCarpet, + Block::LimeCarpet, + Block::PinkCarpet, + Block::GrayCarpet, + Block::LightGrayCarpet, + Block::CyanCarpet, + Block::PurpleCarpet, + Block::BlueCarpet, + Block::BrownCarpet, + Block::GreenCarpet, + Block::RedCarpet, + Block::BlackCarpet, ]) }); -pub static VIBRATION_RESONATORS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Block::AmethystBlock])); diff --git a/azalea-registry/src/tags/items.rs b/azalea-registry/src/tags/items.rs index 6d5d37554..ecc801477 100644 --- a/azalea-registry/src/tags/items.rs +++ b/azalea-registry/src/tags/items.rs @@ -6,21 +6,6 @@ use once_cell::sync::Lazy; use crate::Item; -pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakFence, - Item::AcaciaFence, - Item::DarkOakFence, - Item::SpruceFence, - Item::BirchFence, - Item::JungleFence, - Item::CrimsonFence, - Item::WarpedFence, - Item::MangroveFence, - Item::BambooFence, - Item::CherryFence, - ]) -}); pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::AcaciaLog, @@ -29,89 +14,53 @@ pub static ACACIA_LOGS: Lazy> = Lazy::new(|| { Item::StrippedAcaciaWood, ]) }); -pub static CREEPER_IGNITERS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::FlintAndSteel, Item::FireCharge])); -pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakSlab, - Item::SpruceSlab, - Item::BirchSlab, - Item::JungleSlab, - Item::AcaciaSlab, - Item::DarkOakSlab, - Item::CrimsonSlab, - Item::WarpedSlab, - Item::MangroveSlab, - Item::BambooSlab, - Item::CherrySlab, - ]) -}); -pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakStairs, - Item::SpruceStairs, - Item::BirchStairs, - Item::JungleStairs, - Item::AcaciaStairs, - Item::DarkOakStairs, - Item::CrimsonStairs, - Item::WarpedStairs, - Item::MangroveStairs, - Item::BambooStairs, - Item::CherryStairs, - ]) -}); -pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::MangroveLog, - Item::MangroveWood, - Item::StrippedMangroveLog, - Item::StrippedMangroveWood, - ]) -}); -pub static SHOVELS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::DiamondShovel, - Item::StoneShovel, - Item::GoldenShovel, - Item::NetheriteShovel, - Item::WoodenShovel, - Item::IronShovel, - ]) -}); -pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { +pub static ANVIL: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Anvil, Item::ChippedAnvil, Item::DamagedAnvil])); +pub static ARMADILLO_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SpiderEye])); +pub static ARROWS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Arrow, Item::TippedArrow, Item::SpectralArrow])); +pub static AXES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::DarkOakLog, - Item::DarkOakWood, - Item::StrippedDarkOakLog, - Item::StrippedDarkOakWood, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, ]) }); -pub static EMERALD_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::EmeraldOre, Item::DeepslateEmeraldOre])); -pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { +pub static AXOLOTL_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::TropicalFishBucket])); +pub static BAMBOO_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::BambooBlock, Item::StrippedBambooBlock])); +pub static BANNERS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Sunflower, - Item::Lilac, - Item::Peony, - Item::RoseBush, - Item::PitcherPlant, + Item::WhiteBanner, + Item::OrangeBanner, + Item::MagentaBanner, + Item::LightBlueBanner, + Item::YellowBanner, + Item::LimeBanner, + Item::PinkBanner, + Item::GrayBanner, + Item::LightGrayBanner, + Item::CyanBanner, + Item::PurpleBanner, + Item::BlueBanner, + Item::BrownBanner, + Item::GreenBanner, + Item::RedBanner, + Item::BlackBanner, ]) }); -pub static DOORS: Lazy> = Lazy::new(|| { +pub static BEACON_PAYMENT_ITEMS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::IronDoor, - Item::OakDoor, - Item::SpruceDoor, - Item::BirchDoor, - Item::JungleDoor, - Item::AcaciaDoor, - Item::DarkOakDoor, - Item::CrimsonDoor, - Item::WarpedDoor, - Item::MangroveDoor, - Item::BambooDoor, - Item::CherryDoor, + Item::NetheriteIngot, + Item::Emerald, + Item::Diamond, + Item::GoldIngot, + Item::IronIngot, ]) }); pub static BEDS: Lazy> = Lazy::new(|| { @@ -134,79 +83,73 @@ pub static BEDS: Lazy> = Lazy::new(|| { Item::YellowBed, ]) }); -pub static COMPASSES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Compass, Item::RecoveryCompass])); -pub static DECORATED_POT_INGREDIENTS: Lazy> = Lazy::new(|| { +pub static BEE_FOOD: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Brick, - Item::AnglerPotterySherd, - Item::ArcherPotterySherd, - Item::ArmsUpPotterySherd, - Item::BladePotterySherd, - Item::BrewerPotterySherd, - Item::BurnPotterySherd, - Item::DangerPotterySherd, - Item::ExplorerPotterySherd, - Item::FriendPotterySherd, - Item::HeartPotterySherd, - Item::HeartbreakPotterySherd, - Item::HowlPotterySherd, - Item::MinerPotterySherd, - Item::MournerPotterySherd, - Item::PlentyPotterySherd, - Item::PrizePotterySherd, - Item::SheafPotterySherd, - Item::ShelterPotterySherd, - Item::SkullPotterySherd, - Item::SnortPotterySherd, + Item::FloweringAzaleaLeaves, + Item::FloweringAzalea, + Item::MangrovePropagule, + Item::CherryLeaves, + Item::PinkPetals, + Item::ChorusFlower, + Item::SporeBlossom, + Item::Dandelion, + Item::Poppy, + Item::BlueOrchid, + Item::Allium, + Item::AzureBluet, + Item::RedTulip, + Item::OrangeTulip, + Item::WhiteTulip, + Item::PinkTulip, + Item::OxeyeDaisy, + Item::Cornflower, + Item::LilyOfTheValley, + Item::WitherRose, + Item::Torchflower, + Item::Sunflower, + Item::Lilac, + Item::Peony, + Item::RoseBush, + Item::PitcherPlant, ]) }); -pub static COPPER_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::CopperOre, Item::DeepslateCopperOre])); -pub static TRIM_TEMPLATES: Lazy> = Lazy::new(|| { +pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WardArmorTrimSmithingTemplate, - Item::SpireArmorTrimSmithingTemplate, - Item::CoastArmorTrimSmithingTemplate, - Item::EyeArmorTrimSmithingTemplate, - Item::DuneArmorTrimSmithingTemplate, - Item::WildArmorTrimSmithingTemplate, - Item::RibArmorTrimSmithingTemplate, - Item::TideArmorTrimSmithingTemplate, - Item::SentryArmorTrimSmithingTemplate, - Item::VexArmorTrimSmithingTemplate, - Item::SnoutArmorTrimSmithingTemplate, - Item::WayfinderArmorTrimSmithingTemplate, - Item::ShaperArmorTrimSmithingTemplate, - Item::SilenceArmorTrimSmithingTemplate, - Item::RaiserArmorTrimSmithingTemplate, - Item::HostArmorTrimSmithingTemplate, + Item::BirchLog, + Item::BirchWood, + Item::StrippedBirchLog, + Item::StrippedBirchWood, ]) }); -pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { +pub static BOATS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakPressurePlate, - Item::SprucePressurePlate, - Item::BirchPressurePlate, - Item::JunglePressurePlate, - Item::AcaciaPressurePlate, - Item::DarkOakPressurePlate, - Item::CrimsonPressurePlate, - Item::WarpedPressurePlate, - Item::MangrovePressurePlate, - Item::BambooPressurePlate, - Item::CherryPressurePlate, + Item::OakBoat, + Item::SpruceBoat, + Item::BirchBoat, + Item::JungleBoat, + Item::AcaciaBoat, + Item::DarkOakBoat, + Item::MangroveBoat, + Item::BambooRaft, + Item::CherryBoat, + Item::OakChestBoat, + Item::SpruceChestBoat, + Item::BirchChestBoat, + Item::JungleChestBoat, + Item::AcaciaChestBoat, + Item::DarkOakChestBoat, + Item::MangroveChestBoat, + Item::BambooChestRaft, + Item::CherryChestBoat, ]) }); -pub static NOTEBLOCK_TOP_INSTRUMENTS: Lazy> = Lazy::new(|| { +pub static BOOKSHELF_BOOKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::ZombieHead, - Item::SkeletonSkull, - Item::CreeperHead, - Item::DragonHead, - Item::WitherSkeletonSkull, - Item::PiglinHead, - Item::PlayerHead, + Item::Book, + Item::WrittenBook, + Item::EnchantedBook, + Item::WritableBook, + Item::KnowledgeBook, ]) }); pub static BREAKS_DECORATED_POTS: Lazy> = Lazy::new(|| { @@ -244,16 +187,126 @@ pub static BREAKS_DECORATED_POTS: Lazy> = Lazy::new(|| { Item::IronHoe, ]) }); -pub static SAND: Lazy> = Lazy::new(|| { +pub static BUTTONS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Sand, - Item::RedSand, - Item::SuspiciousSand, - Item::SuspiciousSand, - ]) -}); -pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { + Item::OakButton, + Item::SpruceButton, + Item::BirchButton, + Item::JungleButton, + Item::AcaciaButton, + Item::DarkOakButton, + Item::CrimsonButton, + Item::WarpedButton, + Item::MangroveButton, + Item::BambooButton, + Item::CherryButton, + Item::StoneButton, + Item::PolishedBlackstoneButton, + ]) +}); +pub static CAMEL_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Cactus])); +pub static CANDLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Candle, + Item::WhiteCandle, + Item::OrangeCandle, + Item::MagentaCandle, + Item::LightBlueCandle, + Item::YellowCandle, + Item::LimeCandle, + Item::PinkCandle, + Item::GrayCandle, + Item::LightGrayCandle, + Item::CyanCandle, + Item::PurpleCandle, + Item::BlueCandle, + Item::BrownCandle, + Item::GreenCandle, + Item::RedCandle, + Item::BlackCandle, + ]) +}); +pub static CAT_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Cod, Item::Salmon])); +pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::CherryLog, + Item::CherryWood, + Item::StrippedCherryLog, + Item::StrippedCherryWood, + ]) +}); +pub static CHEST_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + ]) +}); +pub static CHEST_BOATS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakChestBoat, + Item::SpruceChestBoat, + Item::BirchChestBoat, + Item::JungleChestBoat, + Item::AcaciaChestBoat, + Item::DarkOakChestBoat, + Item::MangroveChestBoat, + Item::BambooChestRaft, + Item::CherryChestBoat, + ]) +}); +pub static CHICKEN_FOOD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WheatSeeds, + Item::MelonSeeds, + Item::PumpkinSeeds, + Item::BeetrootSeeds, + Item::TorchflowerSeeds, + Item::PitcherPod, + ]) +}); +pub static CLUSTER_MAX_HARVESTABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondPickaxe, + Item::GoldenPickaxe, + Item::IronPickaxe, + Item::NetheritePickaxe, + Item::StonePickaxe, + Item::WoodenPickaxe, + ]) +}); +pub static COAL_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::CoalOre, Item::DeepslateCoalOre])); +pub static COALS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Coal, Item::Charcoal])); +pub static COMPASSES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Compass, Item::RecoveryCompass])); +pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Item::JungleLeaves, + Item::OakLeaves, + Item::SpruceLeaves, + Item::DarkOakLeaves, + Item::AcaciaLeaves, + Item::BirchLeaves, + Item::AzaleaLeaves, + Item::FloweringAzaleaLeaves, + Item::MangroveLeaves, + Item::CherryLeaves, + Item::NetherWartBlock, + Item::WarpedWartBlock, + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, Item::DarkOakLog, Item::DarkOakWood, Item::StrippedDarkOakLog, @@ -288,12 +341,33 @@ pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { Item::StrippedCherryWood, ]) }); -pub static CHERRY_LOGS: Lazy> = Lazy::new(|| { +pub static COPPER_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::CopperOre, Item::DeepslateCopperOre])); +pub static COW_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Wheat])); +pub static CREEPER_DROP_MUSIC_DISCS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::CherryLog, - Item::CherryWood, - Item::StrippedCherryLog, - Item::StrippedCherryWood, + Item::MusicDisc13, + Item::MusicDiscCat, + Item::MusicDiscBlocks, + Item::MusicDiscChirp, + Item::MusicDiscFar, + Item::MusicDiscMall, + Item::MusicDiscMellohi, + Item::MusicDiscStal, + Item::MusicDiscStrad, + Item::MusicDiscWard, + Item::MusicDisc11, + Item::MusicDiscWait, + ]) +}); +pub static CREEPER_IGNITERS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::FlintAndSteel, Item::FireCharge])); +pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, ]) }); pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { @@ -332,333 +406,431 @@ pub static DAMPENS_VIBRATIONS: Lazy> = Lazy::new(|| { Item::BlackCarpet, ]) }); -pub static DIAMOND_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::DiamondOre, Item::DeepslateDiamondOre])); -pub static WOOL: Lazy> = Lazy::new(|| { +pub static DARK_OAK_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WhiteWool, - Item::OrangeWool, - Item::MagentaWool, - Item::LightBlueWool, - Item::YellowWool, - Item::LimeWool, - Item::PinkWool, - Item::GrayWool, - Item::LightGrayWool, - Item::CyanWool, - Item::PurpleWool, - Item::BlueWool, - Item::BrownWool, - Item::GreenWool, - Item::RedWool, - Item::BlackWool, + Item::DarkOakLog, + Item::DarkOakWood, + Item::StrippedDarkOakLog, + Item::StrippedDarkOakWood, ]) }); -pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { +pub static DECORATED_POT_INGREDIENTS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::AcaciaTrapdoor, - Item::BirchTrapdoor, - Item::DarkOakTrapdoor, - Item::JungleTrapdoor, - Item::OakTrapdoor, - Item::SpruceTrapdoor, - Item::CrimsonTrapdoor, - Item::WarpedTrapdoor, - Item::MangroveTrapdoor, - Item::BambooTrapdoor, - Item::CherryTrapdoor, + Item::Brick, + Item::AnglerPotterySherd, + Item::ArcherPotterySherd, + Item::ArmsUpPotterySherd, + Item::BladePotterySherd, + Item::BrewerPotterySherd, + Item::BurnPotterySherd, + Item::DangerPotterySherd, + Item::ExplorerPotterySherd, + Item::FriendPotterySherd, + Item::HeartPotterySherd, + Item::HeartbreakPotterySherd, + Item::HowlPotterySherd, + Item::MinerPotterySherd, + Item::MournerPotterySherd, + Item::PlentyPotterySherd, + Item::PrizePotterySherd, + Item::SheafPotterySherd, + Item::ShelterPotterySherd, + Item::SkullPotterySherd, + Item::SnortPotterySherd, ]) }); -pub static FLOWERS: Lazy> = Lazy::new(|| { +pub static DECORATED_POT_SHERDS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::FloweringAzaleaLeaves, - Item::FloweringAzalea, - Item::MangrovePropagule, - Item::CherryLeaves, - Item::PinkPetals, - Item::ChorusFlower, - Item::SporeBlossom, - Item::Dandelion, - Item::Poppy, - Item::BlueOrchid, - Item::Allium, - Item::AzureBluet, - Item::RedTulip, - Item::OrangeTulip, - Item::WhiteTulip, - Item::PinkTulip, - Item::OxeyeDaisy, - Item::Cornflower, - Item::LilyOfTheValley, - Item::WitherRose, - Item::Torchflower, - Item::Sunflower, - Item::Lilac, - Item::Peony, - Item::RoseBush, - Item::PitcherPlant, + Item::AnglerPotterySherd, + Item::ArcherPotterySherd, + Item::ArmsUpPotterySherd, + Item::BladePotterySherd, + Item::BrewerPotterySherd, + Item::BurnPotterySherd, + Item::DangerPotterySherd, + Item::ExplorerPotterySherd, + Item::FriendPotterySherd, + Item::HeartPotterySherd, + Item::HeartbreakPotterySherd, + Item::HowlPotterySherd, + Item::MinerPotterySherd, + Item::MournerPotterySherd, + Item::PlentyPotterySherd, + Item::PrizePotterySherd, + Item::SheafPotterySherd, + Item::ShelterPotterySherd, + Item::SkullPotterySherd, + Item::SnortPotterySherd, ]) }); -pub static BANNERS: Lazy> = Lazy::new(|| { +pub static DIAMOND_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::DiamondOre, Item::DeepslateDiamondOre])); +pub static DIRT: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WhiteBanner, - Item::OrangeBanner, - Item::MagentaBanner, - Item::LightBlueBanner, - Item::YellowBanner, - Item::LimeBanner, - Item::PinkBanner, - Item::GrayBanner, - Item::LightGrayBanner, - Item::CyanBanner, - Item::PurpleBanner, - Item::BlueBanner, - Item::BrownBanner, - Item::GreenBanner, - Item::RedBanner, - Item::BlackBanner, + Item::Dirt, + Item::GrassBlock, + Item::Podzol, + Item::CoarseDirt, + Item::Mycelium, + Item::RootedDirt, + Item::MossBlock, + Item::Mud, + Item::MuddyMangroveRoots, ]) }); -pub static TERRACOTTA: Lazy> = Lazy::new(|| { +pub static DOORS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Terracotta, - Item::WhiteTerracotta, - Item::OrangeTerracotta, - Item::MagentaTerracotta, - Item::LightBlueTerracotta, - Item::YellowTerracotta, - Item::LimeTerracotta, - Item::PinkTerracotta, - Item::GrayTerracotta, - Item::LightGrayTerracotta, - Item::CyanTerracotta, - Item::PurpleTerracotta, - Item::BlueTerracotta, - Item::BrownTerracotta, - Item::GreenTerracotta, - Item::RedTerracotta, - Item::BlackTerracotta, + Item::IronDoor, + Item::OakDoor, + Item::SpruceDoor, + Item::BirchDoor, + Item::JungleDoor, + Item::AcaciaDoor, + Item::DarkOakDoor, + Item::CrimsonDoor, + Item::WarpedDoor, + Item::MangroveDoor, + Item::BambooDoor, + Item::CherryDoor, ]) }); -pub static COALS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Coal, Item::Charcoal])); -pub static BIRCH_LOGS: Lazy> = Lazy::new(|| { +pub static DYEABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::BirchLog, - Item::BirchWood, - Item::StrippedBirchLog, - Item::StrippedBirchWood, + Item::LeatherHelmet, + Item::LeatherChestplate, + Item::LeatherLeggings, + Item::LeatherBoots, + Item::LeatherHorseArmor, + Item::WolfArmor, ]) }); -pub static PIGLIN_REPELLENTS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::SoulTorch, Item::SoulLantern, Item::SoulCampfire])); -pub static CREEPER_DROP_MUSIC_DISCS: Lazy> = Lazy::new(|| { +pub static EMERALD_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::EmeraldOre, Item::DeepslateEmeraldOre])); +pub static ENCHANTABLE_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::MusicDisc13, - Item::MusicDiscCat, - Item::MusicDiscBlocks, - Item::MusicDiscChirp, - Item::MusicDiscFar, - Item::MusicDiscMall, - Item::MusicDiscMellohi, - Item::MusicDiscStal, - Item::MusicDiscStrad, - Item::MusicDiscWard, - Item::MusicDisc11, - Item::MusicDiscWait, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, ]) }); -pub static SLABS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_BOW: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Bow])); +pub static ENCHANTABLE_CHEST_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::BambooMosaicSlab, - Item::StoneSlab, - Item::SmoothStoneSlab, - Item::StoneBrickSlab, - Item::SandstoneSlab, - Item::PurpurSlab, - Item::QuartzSlab, - Item::RedSandstoneSlab, - Item::BrickSlab, - Item::CobblestoneSlab, - Item::NetherBrickSlab, - Item::PetrifiedOakSlab, - Item::PrismarineSlab, - Item::PrismarineBrickSlab, - Item::DarkPrismarineSlab, - Item::PolishedGraniteSlab, - Item::SmoothRedSandstoneSlab, - Item::MossyStoneBrickSlab, - Item::PolishedDioriteSlab, - Item::MossyCobblestoneSlab, - Item::EndStoneBrickSlab, - Item::SmoothSandstoneSlab, - Item::SmoothQuartzSlab, - Item::GraniteSlab, - Item::AndesiteSlab, - Item::RedNetherBrickSlab, - Item::PolishedAndesiteSlab, - Item::DioriteSlab, - Item::CutSandstoneSlab, - Item::CutRedSandstoneSlab, - Item::BlackstoneSlab, - Item::PolishedBlackstoneBrickSlab, - Item::PolishedBlackstoneSlab, - Item::CobbledDeepslateSlab, - Item::PolishedDeepslateSlab, - Item::DeepslateTileSlab, - Item::DeepslateBrickSlab, - Item::WaxedWeatheredCutCopperSlab, - Item::WaxedExposedCutCopperSlab, - Item::WaxedCutCopperSlab, - Item::OxidizedCutCopperSlab, - Item::WeatheredCutCopperSlab, - Item::ExposedCutCopperSlab, - Item::CutCopperSlab, - Item::WaxedOxidizedCutCopperSlab, - Item::MudBrickSlab, - Item::OakSlab, - Item::SpruceSlab, - Item::BirchSlab, - Item::JungleSlab, - Item::AcaciaSlab, - Item::DarkOakSlab, - Item::CrimsonSlab, - Item::WarpedSlab, - Item::MangroveSlab, - Item::BambooSlab, - Item::CherrySlab, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, ]) }); -pub static ANVIL: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Anvil, Item::ChippedAnvil, Item::DamagedAnvil])); -pub static STAIRS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_CROSSBOW: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Crossbow])); +pub static ENCHANTABLE_DURABILITY: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::BambooMosaicStairs, - Item::CobblestoneStairs, - Item::SandstoneStairs, - Item::NetherBrickStairs, - Item::StoneBrickStairs, - Item::BrickStairs, - Item::PurpurStairs, - Item::QuartzStairs, - Item::RedSandstoneStairs, - Item::PrismarineBrickStairs, - Item::PrismarineStairs, - Item::DarkPrismarineStairs, - Item::PolishedGraniteStairs, - Item::SmoothRedSandstoneStairs, - Item::MossyStoneBrickStairs, - Item::PolishedDioriteStairs, - Item::MossyCobblestoneStairs, - Item::EndStoneBrickStairs, - Item::StoneStairs, - Item::SmoothSandstoneStairs, - Item::SmoothQuartzStairs, - Item::GraniteStairs, - Item::AndesiteStairs, - Item::RedNetherBrickStairs, - Item::PolishedAndesiteStairs, - Item::DioriteStairs, - Item::BlackstoneStairs, - Item::PolishedBlackstoneBrickStairs, - Item::PolishedBlackstoneStairs, - Item::CobbledDeepslateStairs, - Item::PolishedDeepslateStairs, - Item::DeepslateTileStairs, - Item::DeepslateBrickStairs, - Item::OxidizedCutCopperStairs, - Item::WeatheredCutCopperStairs, - Item::ExposedCutCopperStairs, - Item::CutCopperStairs, - Item::WaxedWeatheredCutCopperStairs, - Item::WaxedExposedCutCopperStairs, - Item::WaxedCutCopperStairs, - Item::WaxedOxidizedCutCopperStairs, - Item::MudBrickStairs, - Item::OakStairs, - Item::SpruceStairs, - Item::BirchStairs, - Item::JungleStairs, - Item::AcaciaStairs, - Item::DarkOakStairs, - Item::CrimsonStairs, - Item::WarpedStairs, - Item::MangroveStairs, - Item::BambooStairs, - Item::CherryStairs, + Item::Elytra, + Item::Shield, + Item::Bow, + Item::Crossbow, + Item::Trident, + Item::FlintAndSteel, + Item::Shears, + Item::Brush, + Item::FishingRod, + Item::CarrotOnAStick, + Item::WarpedFungusOnAStick, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, ]) }); -pub static STONE_CRAFTING_MATERIALS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_EQUIPPABLE: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Cobblestone, - Item::Blackstone, - Item::CobbledDeepslate, + Item::Elytra, + Item::CarvedPumpkin, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + Item::PlayerHead, + Item::CreeperHead, + Item::ZombieHead, + Item::SkeletonSkull, + Item::WitherSkeletonSkull, + Item::DragonHead, + Item::PiglinHead, ]) }); -pub static FISHES: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_FIRE_ASPECT: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Cod, - Item::CookedCod, - Item::Salmon, - Item::CookedSalmon, - Item::Pufferfish, - Item::TropicalFish, + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, ]) }); -pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::SoulSand, Item::SoulSoil])); -pub static AXOLOTL_TEMPT_ITEMS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::TropicalFishBucket])); -pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_FISHING: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::FishingRod])); +pub static ENCHANTABLE_FOOT_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WhiteCarpet, - Item::OrangeCarpet, - Item::MagentaCarpet, - Item::LightBlueCarpet, - Item::YellowCarpet, - Item::LimeCarpet, - Item::PinkCarpet, - Item::GrayCarpet, - Item::LightGrayCarpet, - Item::CyanCarpet, - Item::PurpleCarpet, - Item::BlueCarpet, - Item::BrownCarpet, - Item::GreenCarpet, - Item::RedCarpet, - Item::BlackCarpet, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + ]) +}); +pub static ENCHANTABLE_HEAD_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + ]) +}); +pub static ENCHANTABLE_LEG_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + ]) +}); +pub static ENCHANTABLE_MINING: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Shears, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, ]) }); -pub static VILLAGER_PLANTABLE_SEEDS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_MINING_LOOT: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WheatSeeds, - Item::Potato, - Item::Carrot, - Item::BeetrootSeeds, - Item::TorchflowerSeeds, - Item::PitcherPod, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, + Item::DiamondHoe, + Item::StoneHoe, + Item::GoldenHoe, + Item::NetheriteHoe, + Item::WoodenHoe, + Item::IronHoe, ]) }); -pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_SHARP_WEAPON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakDoor, - Item::SpruceDoor, - Item::BirchDoor, - Item::JungleDoor, - Item::AcaciaDoor, - Item::DarkOakDoor, - Item::CrimsonDoor, - Item::WarpedDoor, - Item::MangroveDoor, - Item::BambooDoor, - Item::CherryDoor, + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, ]) }); -pub static COAL_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::CoalOre, Item::DeepslateCoalOre])); -pub static TOOLS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_SWORD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + ]) +}); +pub static ENCHANTABLE_TRIDENT: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Trident])); +pub static ENCHANTABLE_VANISHING: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ + Item::Compass, + Item::CarvedPumpkin, + Item::Elytra, + Item::Shield, + Item::Bow, + Item::Crossbow, Item::Trident, + Item::FlintAndSteel, + Item::Shears, + Item::Brush, + Item::FishingRod, + Item::CarrotOnAStick, + Item::WarpedFungusOnAStick, + Item::PlayerHead, + Item::CreeperHead, + Item::ZombieHead, + Item::SkeletonSkull, + Item::WitherSkeletonSkull, + Item::DragonHead, + Item::PiglinHead, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, Item::DiamondSword, Item::StoneSword, Item::GoldenSword, @@ -691,23 +863,116 @@ pub static TOOLS: Lazy> = Lazy::new(|| { Item::IronHoe, ]) }); -pub static BUTTONS: Lazy> = Lazy::new(|| { +pub static ENCHANTABLE_WEAPON: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakButton, - Item::SpruceButton, - Item::BirchButton, - Item::JungleButton, - Item::AcaciaButton, - Item::DarkOakButton, - Item::CrimsonButton, - Item::WarpedButton, - Item::MangroveButton, - Item::BambooButton, - Item::CherryButton, - Item::StoneButton, - Item::PolishedBlackstoneButton, + Item::DiamondSword, + Item::StoneSword, + Item::GoldenSword, + Item::NetheriteSword, + Item::WoodenSword, + Item::IronSword, + Item::DiamondAxe, + Item::StoneAxe, + Item::GoldenAxe, + Item::NetheriteAxe, + Item::WoodenAxe, + Item::IronAxe, + ]) +}); +pub static FENCE_GATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::AcaciaFenceGate, + Item::BirchFenceGate, + Item::DarkOakFenceGate, + Item::JungleFenceGate, + Item::OakFenceGate, + Item::SpruceFenceGate, + Item::CrimsonFenceGate, + Item::WarpedFenceGate, + Item::MangroveFenceGate, + Item::BambooFenceGate, + Item::CherryFenceGate, + ]) +}); +pub static FENCES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::NetherBrickFence, + Item::OakFence, + Item::AcaciaFence, + Item::DarkOakFence, + Item::SpruceFence, + Item::BirchFence, + Item::JungleFence, + Item::CrimsonFence, + Item::WarpedFence, + Item::MangroveFence, + Item::BambooFence, + Item::CherryFence, + ]) +}); +pub static FISHES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Cod, + Item::CookedCod, + Item::Salmon, + Item::CookedSalmon, + Item::Pufferfish, + Item::TropicalFish, + ]) +}); +pub static FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::FloweringAzaleaLeaves, + Item::FloweringAzalea, + Item::MangrovePropagule, + Item::CherryLeaves, + Item::PinkPetals, + Item::ChorusFlower, + Item::SporeBlossom, + Item::Dandelion, + Item::Poppy, + Item::BlueOrchid, + Item::Allium, + Item::AzureBluet, + Item::RedTulip, + Item::OrangeTulip, + Item::WhiteTulip, + Item::PinkTulip, + Item::OxeyeDaisy, + Item::Cornflower, + Item::LilyOfTheValley, + Item::WitherRose, + Item::Torchflower, + Item::Sunflower, + Item::Lilac, + Item::Peony, + Item::RoseBush, + Item::PitcherPlant, + ]) +}); +pub static FOOT_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + ]) +}); +pub static FOX_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SweetBerries, Item::GlowBerries])); +pub static FREEZE_IMMUNE_WEARABLES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherBoots, + Item::LeatherLeggings, + Item::LeatherChestplate, + Item::LeatherHelmet, + Item::LeatherHorseArmor, ]) }); +pub static FROG_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::SlimeBall])); +pub static GOAT_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Wheat])); pub static GOLD_ORES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::GoldOre, @@ -715,50 +980,30 @@ pub static GOLD_ORES: Lazy> = Lazy::new(|| { Item::DeepslateGoldOre, ]) }); -pub static WART_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::NetherWartBlock, Item::WarpedWartBlock])); -pub static NON_FLAMMABLE_WOOD: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, - Item::CrimsonPlanks, - Item::WarpedPlanks, - Item::CrimsonSlab, - Item::WarpedSlab, - Item::CrimsonPressurePlate, - Item::WarpedPressurePlate, - Item::CrimsonFence, - Item::WarpedFence, - Item::CrimsonTrapdoor, - Item::WarpedTrapdoor, - Item::CrimsonFenceGate, - Item::WarpedFenceGate, - Item::CrimsonStairs, - Item::WarpedStairs, - Item::CrimsonButton, - Item::WarpedButton, - Item::CrimsonDoor, - Item::WarpedDoor, - Item::CrimsonSign, - Item::WarpedSign, - Item::WarpedHangingSign, +pub static HANGING_SIGNS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakHangingSign, + Item::SpruceHangingSign, + Item::BirchHangingSign, + Item::AcaciaHangingSign, + Item::CherryHangingSign, + Item::JungleHangingSign, + Item::DarkOakHangingSign, Item::CrimsonHangingSign, + Item::WarpedHangingSign, + Item::MangroveHangingSign, + Item::BambooHangingSign, ]) }); -pub static PICKAXES: Lazy> = Lazy::new(|| { +pub static HEAD_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::DiamondPickaxe, - Item::StonePickaxe, - Item::GoldenPickaxe, - Item::NetheritePickaxe, - Item::WoodenPickaxe, - Item::IronPickaxe, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, ]) }); pub static HOES: Lazy> = Lazy::new(|| { @@ -771,23 +1016,41 @@ pub static HOES: Lazy> = Lazy::new(|| { Item::IronHoe, ]) }); -pub static FENCES: Lazy> = Lazy::new(|| { +pub static HOGLIN_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::CrimsonFungus])); +pub static HORSE_FOOD: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::NetherBrickFence, - Item::OakFence, - Item::AcaciaFence, - Item::DarkOakFence, - Item::SpruceFence, - Item::BirchFence, - Item::JungleFence, - Item::CrimsonFence, - Item::WarpedFence, - Item::MangroveFence, - Item::BambooFence, - Item::CherryFence, + Item::Wheat, + Item::Sugar, + Item::HayBlock, + Item::Apple, + Item::GoldenCarrot, + Item::GoldenApple, + Item::EnchantedGoldenApple, ]) }); -pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { +pub static HORSE_TEMPT_ITEMS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::GoldenCarrot, + Item::GoldenApple, + Item::EnchantedGoldenApple, + ]) +}); +pub static IGNORED_BY_PIGLIN_BABIES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Leather])); +pub static IRON_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::IronOre, Item::DeepslateIronOre])); +pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::JungleLog, + Item::JungleWood, + Item::StrippedJungleLog, + Item::StrippedJungleWood, + ]) +}); +pub static LAPIS_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::LapisOre, Item::DeepslateLapisOre])); +pub static LEAVES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::JungleLeaves, Item::OakLeaves, @@ -799,8 +1062,26 @@ pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { Item::FloweringAzaleaLeaves, Item::MangroveLeaves, Item::CherryLeaves, - Item::NetherWartBlock, - Item::WarpedWartBlock, + ]) +}); +pub static LECTERN_BOOKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::WrittenBook, Item::WritableBook])); +pub static LEG_ARMOR: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + ]) +}); +pub static LLAMA_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Wheat, Item::HayBlock])); +pub static LLAMA_TEMPT_ITEMS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::HayBlock])); +pub static LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ Item::CrimsonStem, Item::StrippedCrimsonStem, Item::CrimsonHyphae, @@ -843,118 +1124,8 @@ pub static COMPLETES_FIND_TREE_TUTORIAL: Lazy> = Lazy::new(|| { Item::StrippedCherryWood, ]) }); -pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Dandelion, - Item::Poppy, - Item::BlueOrchid, - Item::Allium, - Item::AzureBluet, - Item::RedTulip, - Item::OrangeTulip, - Item::WhiteTulip, - Item::PinkTulip, - Item::OxeyeDaisy, - Item::Cornflower, - Item::LilyOfTheValley, - Item::WitherRose, - Item::Torchflower, - ]) -}); -pub static PIGLIN_FOOD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Porkchop, Item::CookedPorkchop])); -pub static FENCE_GATES: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::AcaciaFenceGate, - Item::BirchFenceGate, - Item::DarkOakFenceGate, - Item::JungleFenceGate, - Item::OakFenceGate, - Item::SpruceFenceGate, - Item::CrimsonFenceGate, - Item::WarpedFenceGate, - Item::MangroveFenceGate, - Item::BambooFenceGate, - Item::CherryFenceGate, - ]) -}); -pub static OAK_LOGS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakLog, - Item::OakWood, - Item::StrippedOakLog, - Item::StrippedOakWood, - ]) -}); -pub static TRIM_MATERIALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::IronIngot, - Item::CopperIngot, - Item::GoldIngot, - Item::LapisLazuli, - Item::Emerald, - Item::Diamond, - Item::NetheriteIngot, - Item::Redstone, - Item::Quartz, - Item::AmethystShard, - ]) -}); -pub static STONE_BRICKS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::StoneBricks, - Item::MossyStoneBricks, - Item::CrackedStoneBricks, - Item::ChiseledStoneBricks, - ]) -}); -pub static STONE_TOOL_MATERIALS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Cobblestone, - Item::Blackstone, - Item::CobbledDeepslate, - ]) -}); -pub static LAPIS_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::LapisOre, Item::DeepslateLapisOre])); -pub static SIGNS: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::OakSign, - Item::SpruceSign, - Item::BirchSign, - Item::AcaciaSign, - Item::JungleSign, - Item::DarkOakSign, - Item::CrimsonSign, - Item::WarpedSign, - Item::MangroveSign, - Item::BambooSign, - Item::CherrySign, - ]) -}); -pub static DIRT: Lazy> = Lazy::new(|| { - HashSet::from_iter(vec![ - Item::Dirt, - Item::GrassBlock, - Item::Podzol, - Item::CoarseDirt, - Item::Mycelium, - Item::RootedDirt, - Item::MossBlock, - Item::Mud, - Item::MuddyMangroveRoots, - ]) -}); -pub static LOGS: Lazy> = Lazy::new(|| { +pub static LOGS_THAT_BURN: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, Item::DarkOakLog, Item::DarkOakWood, Item::StrippedDarkOakLog, @@ -989,40 +1160,131 @@ pub static LOGS: Lazy> = Lazy::new(|| { Item::StrippedCherryWood, ]) }); -pub static AXES: Lazy> = Lazy::new(|| { +pub static MANGROVE_LOGS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::MangroveLog, + Item::MangroveWood, + Item::StrippedMangroveLog, + Item::StrippedMangroveWood, + ]) +}); +pub static MEAT: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Beef, + Item::Chicken, + Item::CookedBeef, + Item::CookedChicken, + Item::CookedMutton, + Item::CookedPorkchop, + Item::CookedRabbit, + Item::Mutton, + Item::Porkchop, + Item::Rabbit, + Item::RottenFlesh, + ]) +}); +pub static MUSIC_DISCS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::MusicDiscPigstep, + Item::MusicDiscOtherside, + Item::MusicDisc5, + Item::MusicDiscRelic, + Item::MusicDisc13, + Item::MusicDiscCat, + Item::MusicDiscBlocks, + Item::MusicDiscChirp, + Item::MusicDiscFar, + Item::MusicDiscMall, + Item::MusicDiscMellohi, + Item::MusicDiscStal, + Item::MusicDiscStrad, + Item::MusicDiscWard, + Item::MusicDisc11, + Item::MusicDiscWait, + ]) +}); +pub static NON_FLAMMABLE_WOOD: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, + Item::CrimsonStem, + Item::StrippedCrimsonStem, + Item::CrimsonHyphae, + Item::StrippedCrimsonHyphae, + Item::CrimsonPlanks, + Item::WarpedPlanks, + Item::CrimsonSlab, + Item::WarpedSlab, + Item::CrimsonPressurePlate, + Item::WarpedPressurePlate, + Item::CrimsonFence, + Item::WarpedFence, + Item::CrimsonTrapdoor, + Item::WarpedTrapdoor, + Item::CrimsonFenceGate, + Item::WarpedFenceGate, + Item::CrimsonStairs, + Item::WarpedStairs, + Item::CrimsonButton, + Item::WarpedButton, + Item::CrimsonDoor, + Item::WarpedDoor, + Item::CrimsonSign, + Item::WarpedSign, + Item::WarpedHangingSign, + Item::CrimsonHangingSign, + ]) +}); +pub static NOTEBLOCK_TOP_INSTRUMENTS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::DiamondAxe, - Item::StoneAxe, - Item::GoldenAxe, - Item::NetheriteAxe, - Item::WoodenAxe, - Item::IronAxe, + Item::ZombieHead, + Item::SkeletonSkull, + Item::CreeperHead, + Item::DragonHead, + Item::WitherSkeletonSkull, + Item::PiglinHead, + Item::PlayerHead, ]) }); -pub static CHEST_BOATS: Lazy> = Lazy::new(|| { +pub static OAK_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakChestBoat, - Item::SpruceChestBoat, - Item::BirchChestBoat, - Item::JungleChestBoat, - Item::AcaciaChestBoat, - Item::DarkOakChestBoat, - Item::MangroveChestBoat, - Item::BambooChestRaft, - Item::CherryChestBoat, + Item::OakLog, + Item::OakWood, + Item::StrippedOakLog, + Item::StrippedOakWood, ]) }); -pub static BOOKSHELF_BOOKS: Lazy> = Lazy::new(|| { +pub static OCELOT_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Cod, Item::Salmon])); +pub static PANDA_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Bamboo])); +pub static PARROT_FOOD: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Book, - Item::WrittenBook, - Item::EnchantedBook, - Item::WritableBook, - Item::KnowledgeBook, + Item::WheatSeeds, + Item::MelonSeeds, + Item::PumpkinSeeds, + Item::BeetrootSeeds, + Item::TorchflowerSeeds, + Item::PitcherPod, ]) }); -pub static ARROWS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Arrow, Item::TippedArrow, Item::SpectralArrow])); +pub static PARROT_POISONOUS_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Cookie])); +pub static PICKAXES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::DiamondPickaxe, + Item::StonePickaxe, + Item::GoldenPickaxe, + Item::NetheritePickaxe, + Item::WoodenPickaxe, + Item::IronPickaxe, + ]) +}); +pub static PIG_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Carrot, Item::Potato, Item::Beetroot])); +pub static PIGLIN_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Porkchop, Item::CookedPorkchop])); pub static PIGLIN_LOVED: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::GoldBlock, @@ -1052,177 +1314,272 @@ pub static PIGLIN_LOVED: Lazy> = Lazy::new(|| { Item::DeepslateGoldOre, ]) }); -pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { +pub static PIGLIN_REPELLENTS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SoulTorch, Item::SoulLantern, Item::SoulCampfire])); +pub static PLANKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakButton, - Item::SpruceButton, - Item::BirchButton, - Item::JungleButton, - Item::AcaciaButton, - Item::DarkOakButton, - Item::CrimsonButton, - Item::WarpedButton, - Item::MangroveButton, - Item::BambooButton, - Item::CherryButton, + Item::OakPlanks, + Item::SprucePlanks, + Item::BirchPlanks, + Item::JunglePlanks, + Item::AcaciaPlanks, + Item::DarkOakPlanks, + Item::CrimsonPlanks, + Item::WarpedPlanks, + Item::MangrovePlanks, + Item::BambooPlanks, + Item::CherryPlanks, ]) }); -pub static SMELTS_TO_GLASS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Sand, Item::RedSand])); -pub static JUNGLE_LOGS: Lazy> = Lazy::new(|| { +pub static RABBIT_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Carrot, Item::GoldenCarrot, Item::Dandelion])); +pub static RAILS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::JungleLog, - Item::JungleWood, - Item::StrippedJungleLog, - Item::StrippedJungleWood, + Item::Rail, + Item::PoweredRail, + Item::DetectorRail, + Item::ActivatorRail, ]) }); -pub static TRAPDOORS: Lazy> = Lazy::new(|| { +pub static REDSTONE_ORES: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::RedstoneOre, Item::DeepslateRedstoneOre])); +pub static SAND: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::IronTrapdoor, - Item::AcaciaTrapdoor, - Item::BirchTrapdoor, - Item::DarkOakTrapdoor, - Item::JungleTrapdoor, - Item::OakTrapdoor, - Item::SpruceTrapdoor, - Item::CrimsonTrapdoor, - Item::WarpedTrapdoor, - Item::MangroveTrapdoor, - Item::BambooTrapdoor, - Item::CherryTrapdoor, + Item::Sand, + Item::RedSand, + Item::SuspiciousSand, + Item::SuspiciousSand, ]) }); -pub static IGNORED_BY_PIGLIN_BABIES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::Leather])); -pub static WARPED_STEMS: Lazy> = Lazy::new(|| { +pub static SAPLINGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::WarpedStem, - Item::StrippedWarpedStem, - Item::WarpedHyphae, - Item::StrippedWarpedHyphae, + Item::OakSapling, + Item::SpruceSapling, + Item::BirchSapling, + Item::JungleSapling, + Item::AcaciaSapling, + Item::DarkOakSapling, + Item::Azalea, + Item::FloweringAzalea, + Item::MangrovePropagule, + Item::CherrySapling, ]) }); -pub static BEACON_PAYMENT_ITEMS: Lazy> = Lazy::new(|| { +pub static SHEEP_FOOD: Lazy> = Lazy::new(|| HashSet::from_iter(vec![Item::Wheat])); +pub static SHOVELS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::NetheriteIngot, - Item::Emerald, - Item::Diamond, - Item::GoldIngot, - Item::IronIngot, + Item::DiamondShovel, + Item::StoneShovel, + Item::GoldenShovel, + Item::NetheriteShovel, + Item::WoodenShovel, + Item::IronShovel, ]) }); -pub static IRON_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::IronOre, Item::DeepslateIronOre])); -pub static BOATS: Lazy> = Lazy::new(|| { +pub static SIGNS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakBoat, - Item::SpruceBoat, - Item::BirchBoat, - Item::JungleBoat, - Item::AcaciaBoat, - Item::DarkOakBoat, - Item::MangroveBoat, - Item::BambooRaft, - Item::CherryBoat, - Item::OakChestBoat, - Item::SpruceChestBoat, - Item::BirchChestBoat, - Item::JungleChestBoat, - Item::AcaciaChestBoat, - Item::DarkOakChestBoat, - Item::MangroveChestBoat, - Item::BambooChestRaft, - Item::CherryChestBoat, + Item::OakSign, + Item::SpruceSign, + Item::BirchSign, + Item::AcaciaSign, + Item::JungleSign, + Item::DarkOakSign, + Item::CrimsonSign, + Item::WarpedSign, + Item::MangroveSign, + Item::BambooSign, + Item::CherrySign, + ]) +}); +pub static SKULLS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::PlayerHead, + Item::CreeperHead, + Item::ZombieHead, + Item::SkeletonSkull, + Item::WitherSkeletonSkull, + Item::DragonHead, + Item::PiglinHead, + ]) +}); +pub static SLABS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::BambooMosaicSlab, + Item::StoneSlab, + Item::SmoothStoneSlab, + Item::StoneBrickSlab, + Item::SandstoneSlab, + Item::PurpurSlab, + Item::QuartzSlab, + Item::RedSandstoneSlab, + Item::BrickSlab, + Item::CobblestoneSlab, + Item::NetherBrickSlab, + Item::PetrifiedOakSlab, + Item::PrismarineSlab, + Item::PrismarineBrickSlab, + Item::DarkPrismarineSlab, + Item::PolishedGraniteSlab, + Item::SmoothRedSandstoneSlab, + Item::MossyStoneBrickSlab, + Item::PolishedDioriteSlab, + Item::MossyCobblestoneSlab, + Item::EndStoneBrickSlab, + Item::SmoothSandstoneSlab, + Item::SmoothQuartzSlab, + Item::GraniteSlab, + Item::AndesiteSlab, + Item::RedNetherBrickSlab, + Item::PolishedAndesiteSlab, + Item::DioriteSlab, + Item::CutSandstoneSlab, + Item::CutRedSandstoneSlab, + Item::BlackstoneSlab, + Item::PolishedBlackstoneBrickSlab, + Item::PolishedBlackstoneSlab, + Item::CobbledDeepslateSlab, + Item::PolishedDeepslateSlab, + Item::DeepslateTileSlab, + Item::DeepslateBrickSlab, + Item::WaxedWeatheredCutCopperSlab, + Item::WaxedExposedCutCopperSlab, + Item::WaxedCutCopperSlab, + Item::OxidizedCutCopperSlab, + Item::WeatheredCutCopperSlab, + Item::ExposedCutCopperSlab, + Item::CutCopperSlab, + Item::WaxedOxidizedCutCopperSlab, + Item::MudBrickSlab, + Item::OakSlab, + Item::SpruceSlab, + Item::BirchSlab, + Item::JungleSlab, + Item::AcaciaSlab, + Item::DarkOakSlab, + Item::CrimsonSlab, + Item::WarpedSlab, + Item::MangroveSlab, + Item::BambooSlab, + Item::CherrySlab, + ]) +}); +pub static SMALL_FLOWERS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::Dandelion, + Item::Poppy, + Item::BlueOrchid, + Item::Allium, + Item::AzureBluet, + Item::RedTulip, + Item::OrangeTulip, + Item::WhiteTulip, + Item::PinkTulip, + Item::OxeyeDaisy, + Item::Cornflower, + Item::LilyOfTheValley, + Item::WitherRose, + Item::Torchflower, ]) }); -pub static RAILS: Lazy> = Lazy::new(|| { +pub static SMELTS_TO_GLASS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Sand, Item::RedSand])); +pub static SNIFFER_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::TorchflowerSeeds])); +pub static SOUL_FIRE_BASE_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::SoulSand, Item::SoulSoil])); +pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Rail, - Item::PoweredRail, - Item::DetectorRail, - Item::ActivatorRail, + Item::SpruceLog, + Item::SpruceWood, + Item::StrippedSpruceLog, + Item::StrippedSpruceWood, ]) }); -pub static TRIMMABLE_ARMOR: Lazy> = Lazy::new(|| { +pub static STAIRS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::NetheriteHelmet, - Item::NetheriteChestplate, - Item::NetheriteLeggings, - Item::NetheriteBoots, - Item::DiamondHelmet, - Item::DiamondChestplate, - Item::DiamondLeggings, - Item::DiamondBoots, - Item::GoldenHelmet, - Item::GoldenChestplate, - Item::GoldenLeggings, - Item::GoldenBoots, - Item::IronHelmet, - Item::IronChestplate, - Item::IronLeggings, - Item::IronBoots, - Item::ChainmailHelmet, - Item::ChainmailChestplate, - Item::ChainmailLeggings, - Item::ChainmailBoots, - Item::LeatherHelmet, - Item::LeatherChestplate, - Item::LeatherLeggings, - Item::LeatherBoots, - Item::TurtleHelmet, + Item::BambooMosaicStairs, + Item::CobblestoneStairs, + Item::SandstoneStairs, + Item::NetherBrickStairs, + Item::StoneBrickStairs, + Item::BrickStairs, + Item::PurpurStairs, + Item::QuartzStairs, + Item::RedSandstoneStairs, + Item::PrismarineBrickStairs, + Item::PrismarineStairs, + Item::DarkPrismarineStairs, + Item::PolishedGraniteStairs, + Item::SmoothRedSandstoneStairs, + Item::MossyStoneBrickStairs, + Item::PolishedDioriteStairs, + Item::MossyCobblestoneStairs, + Item::EndStoneBrickStairs, + Item::StoneStairs, + Item::SmoothSandstoneStairs, + Item::SmoothQuartzStairs, + Item::GraniteStairs, + Item::AndesiteStairs, + Item::RedNetherBrickStairs, + Item::PolishedAndesiteStairs, + Item::DioriteStairs, + Item::BlackstoneStairs, + Item::PolishedBlackstoneBrickStairs, + Item::PolishedBlackstoneStairs, + Item::CobbledDeepslateStairs, + Item::PolishedDeepslateStairs, + Item::DeepslateTileStairs, + Item::DeepslateBrickStairs, + Item::OxidizedCutCopperStairs, + Item::WeatheredCutCopperStairs, + Item::ExposedCutCopperStairs, + Item::CutCopperStairs, + Item::WaxedWeatheredCutCopperStairs, + Item::WaxedExposedCutCopperStairs, + Item::WaxedCutCopperStairs, + Item::WaxedOxidizedCutCopperStairs, + Item::MudBrickStairs, + Item::OakStairs, + Item::SpruceStairs, + Item::BirchStairs, + Item::JungleStairs, + Item::AcaciaStairs, + Item::DarkOakStairs, + Item::CrimsonStairs, + Item::WarpedStairs, + Item::MangroveStairs, + Item::BambooStairs, + Item::CherryStairs, ]) }); -pub static PLANKS: Lazy> = Lazy::new(|| { +pub static STONE_BRICKS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakPlanks, - Item::SprucePlanks, - Item::BirchPlanks, - Item::JunglePlanks, - Item::AcaciaPlanks, - Item::DarkOakPlanks, - Item::CrimsonPlanks, - Item::WarpedPlanks, - Item::MangrovePlanks, - Item::BambooPlanks, - Item::CherryPlanks, + Item::StoneBricks, + Item::MossyStoneBricks, + Item::CrackedStoneBricks, + Item::ChiseledStoneBricks, ]) }); -pub static FOX_FOOD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::SweetBerries, Item::GlowBerries])); -pub static BAMBOO_BLOCKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::BambooBlock, Item::StrippedBambooBlock])); -pub static SNIFFER_FOOD: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::TorchflowerSeeds])); -pub static CANDLES: Lazy> = Lazy::new(|| { +pub static STONE_BUTTONS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::StoneButton, Item::PolishedBlackstoneButton])); +pub static STONE_CRAFTING_MATERIALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::Candle, - Item::WhiteCandle, - Item::OrangeCandle, - Item::MagentaCandle, - Item::LightBlueCandle, - Item::YellowCandle, - Item::LimeCandle, - Item::PinkCandle, - Item::GrayCandle, - Item::LightGrayCandle, - Item::CyanCandle, - Item::PurpleCandle, - Item::BlueCandle, - Item::BrownCandle, - Item::GreenCandle, - Item::RedCandle, - Item::BlackCandle, + Item::Cobblestone, + Item::Blackstone, + Item::CobbledDeepslate, ]) }); -pub static SPRUCE_LOGS: Lazy> = Lazy::new(|| { +pub static STONE_TOOL_MATERIALS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::SpruceLog, - Item::SpruceWood, - Item::StrippedSpruceLog, - Item::StrippedSpruceWood, + Item::Cobblestone, + Item::Blackstone, + Item::CobbledDeepslate, ]) }); +pub static STRIDER_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::WarpedFungus])); +pub static STRIDER_TEMPT_ITEMS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::WarpedFungusOnAStick, Item::WarpedFungus])); pub static SWORDS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ Item::DiamondSword, @@ -1233,85 +1590,125 @@ pub static SWORDS: Lazy> = Lazy::new(|| { Item::IronSword, ]) }); -pub static LECTERN_BOOKS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::WrittenBook, Item::WritableBook])); -pub static DECORATED_POT_SHERDS: Lazy> = Lazy::new(|| { +pub static TALL_FLOWERS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::AnglerPotterySherd, - Item::ArcherPotterySherd, - Item::ArmsUpPotterySherd, - Item::BladePotterySherd, - Item::BrewerPotterySherd, - Item::BurnPotterySherd, - Item::DangerPotterySherd, - Item::ExplorerPotterySherd, - Item::FriendPotterySherd, - Item::HeartPotterySherd, - Item::HeartbreakPotterySherd, - Item::HowlPotterySherd, - Item::MinerPotterySherd, - Item::MournerPotterySherd, - Item::PlentyPotterySherd, - Item::PrizePotterySherd, - Item::SheafPotterySherd, - Item::ShelterPotterySherd, - Item::SkullPotterySherd, - Item::SnortPotterySherd, + Item::Sunflower, + Item::Lilac, + Item::Peony, + Item::RoseBush, + Item::PitcherPlant, ]) }); -pub static SAPLINGS: Lazy> = Lazy::new(|| { +pub static TERRACOTTA: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakSapling, - Item::SpruceSapling, - Item::BirchSapling, - Item::JungleSapling, - Item::AcaciaSapling, - Item::DarkOakSapling, - Item::Azalea, - Item::FloweringAzalea, - Item::MangrovePropagule, - Item::CherrySapling, + Item::Terracotta, + Item::WhiteTerracotta, + Item::OrangeTerracotta, + Item::MagentaTerracotta, + Item::LightBlueTerracotta, + Item::YellowTerracotta, + Item::LimeTerracotta, + Item::PinkTerracotta, + Item::GrayTerracotta, + Item::LightGrayTerracotta, + Item::CyanTerracotta, + Item::PurpleTerracotta, + Item::BlueTerracotta, + Item::BrownTerracotta, + Item::GreenTerracotta, + Item::RedTerracotta, + Item::BlackTerracotta, ]) }); -pub static LEAVES: Lazy> = Lazy::new(|| { +pub static TRAPDOORS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::JungleLeaves, - Item::OakLeaves, - Item::SpruceLeaves, - Item::DarkOakLeaves, - Item::AcaciaLeaves, - Item::BirchLeaves, - Item::AzaleaLeaves, - Item::FloweringAzaleaLeaves, - Item::MangroveLeaves, - Item::CherryLeaves, + Item::IronTrapdoor, + Item::AcaciaTrapdoor, + Item::BirchTrapdoor, + Item::DarkOakTrapdoor, + Item::JungleTrapdoor, + Item::OakTrapdoor, + Item::SpruceTrapdoor, + Item::CrimsonTrapdoor, + Item::WarpedTrapdoor, + Item::MangroveTrapdoor, + Item::BambooTrapdoor, + Item::CherryTrapdoor, + ]) +}); +pub static TRIM_MATERIALS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::IronIngot, + Item::CopperIngot, + Item::GoldIngot, + Item::LapisLazuli, + Item::Emerald, + Item::Diamond, + Item::NetheriteIngot, + Item::Redstone, + Item::Quartz, + Item::AmethystShard, ]) }); -pub static STONE_BUTTONS: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::StoneButton, Item::PolishedBlackstoneButton])); -pub static REDSTONE_ORES: Lazy> = - Lazy::new(|| HashSet::from_iter(vec![Item::RedstoneOre, Item::DeepslateRedstoneOre])); -pub static CRIMSON_STEMS: Lazy> = Lazy::new(|| { +pub static TRIM_TEMPLATES: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::CrimsonStem, - Item::StrippedCrimsonStem, - Item::CrimsonHyphae, - Item::StrippedCrimsonHyphae, + Item::WardArmorTrimSmithingTemplate, + Item::SpireArmorTrimSmithingTemplate, + Item::CoastArmorTrimSmithingTemplate, + Item::EyeArmorTrimSmithingTemplate, + Item::DuneArmorTrimSmithingTemplate, + Item::WildArmorTrimSmithingTemplate, + Item::RibArmorTrimSmithingTemplate, + Item::TideArmorTrimSmithingTemplate, + Item::SentryArmorTrimSmithingTemplate, + Item::VexArmorTrimSmithingTemplate, + Item::SnoutArmorTrimSmithingTemplate, + Item::WayfinderArmorTrimSmithingTemplate, + Item::ShaperArmorTrimSmithingTemplate, + Item::SilenceArmorTrimSmithingTemplate, + Item::RaiserArmorTrimSmithingTemplate, + Item::HostArmorTrimSmithingTemplate, ]) }); -pub static HANGING_SIGNS: Lazy> = Lazy::new(|| { +pub static TRIMMABLE_ARMOR: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::OakHangingSign, - Item::SpruceHangingSign, - Item::BirchHangingSign, - Item::AcaciaHangingSign, - Item::CherryHangingSign, - Item::JungleHangingSign, - Item::DarkOakHangingSign, - Item::CrimsonHangingSign, - Item::WarpedHangingSign, - Item::MangroveHangingSign, - Item::BambooHangingSign, + Item::LeatherBoots, + Item::ChainmailBoots, + Item::GoldenBoots, + Item::IronBoots, + Item::DiamondBoots, + Item::NetheriteBoots, + Item::LeatherLeggings, + Item::ChainmailLeggings, + Item::GoldenLeggings, + Item::IronLeggings, + Item::DiamondLeggings, + Item::NetheriteLeggings, + Item::LeatherChestplate, + Item::ChainmailChestplate, + Item::GoldenChestplate, + Item::IronChestplate, + Item::DiamondChestplate, + Item::NetheriteChestplate, + Item::LeatherHelmet, + Item::ChainmailHelmet, + Item::GoldenHelmet, + Item::IronHelmet, + Item::DiamondHelmet, + Item::NetheriteHelmet, + Item::TurtleHelmet, + ]) +}); +pub static TURTLE_FOOD: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::Seagrass])); +pub static VILLAGER_PLANTABLE_SEEDS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WheatSeeds, + Item::Potato, + Item::Carrot, + Item::BeetrootSeeds, + Item::TorchflowerSeeds, + Item::PitcherPod, ]) }); pub static WALLS: Lazy> = Lazy::new(|| { @@ -1340,42 +1737,173 @@ pub static WALLS: Lazy> = Lazy::new(|| { Item::MudBrickWall, ]) }); -pub static CLUSTER_MAX_HARVESTABLES: Lazy> = Lazy::new(|| { +pub static WARPED_STEMS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::DiamondPickaxe, - Item::GoldenPickaxe, - Item::IronPickaxe, - Item::NetheritePickaxe, - Item::StonePickaxe, - Item::WoodenPickaxe, + Item::WarpedStem, + Item::StrippedWarpedStem, + Item::WarpedHyphae, + Item::StrippedWarpedHyphae, ]) }); -pub static MUSIC_DISCS: Lazy> = Lazy::new(|| { +pub static WART_BLOCKS: Lazy> = + Lazy::new(|| HashSet::from_iter(vec![Item::NetherWartBlock, Item::WarpedWartBlock])); +pub static WOLF_FOOD: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::MusicDiscPigstep, - Item::MusicDiscOtherside, - Item::MusicDisc5, - Item::MusicDiscRelic, - Item::MusicDisc13, - Item::MusicDiscCat, - Item::MusicDiscBlocks, - Item::MusicDiscChirp, - Item::MusicDiscFar, - Item::MusicDiscMall, - Item::MusicDiscMellohi, - Item::MusicDiscStal, - Item::MusicDiscStrad, - Item::MusicDiscWard, - Item::MusicDisc11, - Item::MusicDiscWait, + Item::Beef, + Item::Chicken, + Item::CookedBeef, + Item::CookedChicken, + Item::CookedMutton, + Item::CookedPorkchop, + Item::CookedRabbit, + Item::Mutton, + Item::Porkchop, + Item::Rabbit, + Item::RottenFlesh, ]) }); -pub static FREEZE_IMMUNE_WEARABLES: Lazy> = Lazy::new(|| { +pub static WOODEN_BUTTONS: Lazy> = Lazy::new(|| { HashSet::from_iter(vec![ - Item::LeatherBoots, - Item::LeatherLeggings, - Item::LeatherChestplate, - Item::LeatherHelmet, - Item::LeatherHorseArmor, + Item::OakButton, + Item::SpruceButton, + Item::BirchButton, + Item::JungleButton, + Item::AcaciaButton, + Item::DarkOakButton, + Item::CrimsonButton, + Item::WarpedButton, + Item::MangroveButton, + Item::BambooButton, + Item::CherryButton, + ]) +}); +pub static WOODEN_DOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakDoor, + Item::SpruceDoor, + Item::BirchDoor, + Item::JungleDoor, + Item::AcaciaDoor, + Item::DarkOakDoor, + Item::CrimsonDoor, + Item::WarpedDoor, + Item::MangroveDoor, + Item::BambooDoor, + Item::CherryDoor, + ]) +}); +pub static WOODEN_FENCES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakFence, + Item::AcaciaFence, + Item::DarkOakFence, + Item::SpruceFence, + Item::BirchFence, + Item::JungleFence, + Item::CrimsonFence, + Item::WarpedFence, + Item::MangroveFence, + Item::BambooFence, + Item::CherryFence, + ]) +}); +pub static WOODEN_PRESSURE_PLATES: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakPressurePlate, + Item::SprucePressurePlate, + Item::BirchPressurePlate, + Item::JunglePressurePlate, + Item::AcaciaPressurePlate, + Item::DarkOakPressurePlate, + Item::CrimsonPressurePlate, + Item::WarpedPressurePlate, + Item::MangrovePressurePlate, + Item::BambooPressurePlate, + Item::CherryPressurePlate, + ]) +}); +pub static WOODEN_SLABS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakSlab, + Item::SpruceSlab, + Item::BirchSlab, + Item::JungleSlab, + Item::AcaciaSlab, + Item::DarkOakSlab, + Item::CrimsonSlab, + Item::WarpedSlab, + Item::MangroveSlab, + Item::BambooSlab, + Item::CherrySlab, + ]) +}); +pub static WOODEN_STAIRS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::OakStairs, + Item::SpruceStairs, + Item::BirchStairs, + Item::JungleStairs, + Item::AcaciaStairs, + Item::DarkOakStairs, + Item::CrimsonStairs, + Item::WarpedStairs, + Item::MangroveStairs, + Item::BambooStairs, + Item::CherryStairs, + ]) +}); +pub static WOODEN_TRAPDOORS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::AcaciaTrapdoor, + Item::BirchTrapdoor, + Item::DarkOakTrapdoor, + Item::JungleTrapdoor, + Item::OakTrapdoor, + Item::SpruceTrapdoor, + Item::CrimsonTrapdoor, + Item::WarpedTrapdoor, + Item::MangroveTrapdoor, + Item::BambooTrapdoor, + Item::CherryTrapdoor, + ]) +}); +pub static WOOL: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WhiteWool, + Item::OrangeWool, + Item::MagentaWool, + Item::LightBlueWool, + Item::YellowWool, + Item::LimeWool, + Item::PinkWool, + Item::GrayWool, + Item::LightGrayWool, + Item::CyanWool, + Item::PurpleWool, + Item::BlueWool, + Item::BrownWool, + Item::GreenWool, + Item::RedWool, + Item::BlackWool, + ]) +}); +pub static WOOL_CARPETS: Lazy> = Lazy::new(|| { + HashSet::from_iter(vec![ + Item::WhiteCarpet, + Item::OrangeCarpet, + Item::MagentaCarpet, + Item::LightBlueCarpet, + Item::YellowCarpet, + Item::LimeCarpet, + Item::PinkCarpet, + Item::GrayCarpet, + Item::LightGrayCarpet, + Item::CyanCarpet, + Item::PurpleCarpet, + Item::BlueCarpet, + Item::BrownCarpet, + Item::GreenCarpet, + Item::RedCarpet, + Item::BlackCarpet, ]) }); diff --git a/azalea-world/Cargo.toml b/azalea-world/Cargo.toml index 20e3a261c..b4ded798e 100644 --- a/azalea-world/Cargo.toml +++ b/azalea-world/Cargo.toml @@ -4,29 +4,28 @@ edition = "2021" license = "MIT" name = "azalea-world" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea-world" -version = "0.9.0" +version = "0.10.1" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -simdnbt = { version = "0.4", git = "https://github.com/azalea-rs/simdnbt" } -azalea-block = { path = "../azalea-block", default-features = false, version = "0.9.0" } -azalea-buf = { path = "../azalea-buf", version = "0.9.0" } -azalea-core = { path = "../azalea-core", version = "0.9.0", features = [ +simdnbt = { version = "0.5", git = "https://github.com/azalea-rs/simdnbt" } +azalea-block = { path = "../azalea-block", default-features = false, version = "0.10.0" } +azalea-buf = { path = "../azalea-buf", version = "0.10.0" } +azalea-core = { path = "../azalea-core", version = "0.10.0", features = [ "bevy_ecs", ] } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } -azalea-registry = { path = "../azalea-registry", version = "0.9.0" } -bevy_ecs = "0.13.0" +azalea-registry = { path = "../azalea-registry", version = "0.10.0" } +bevy_ecs = "0.13.2" derive_more = { version = "0.99.17", features = ["deref", "deref_mut"] } tracing = "0.1.40" nohash-hasher = "0.2.0" once_cell = "1.19.0" parking_lot = "^0.12.1" -thiserror = "1.0.57" -uuid = "1.7.0" -serde_json = "1.0.113" -serde = "1.0.196" +thiserror = "1.0.59" +uuid = "1.8.0" +serde_json = "1.0.116" +serde = "1.0.198" rustc-hash = "1.1.0" [dev-dependencies] diff --git a/azalea/Cargo.toml b/azalea/Cargo.toml index d1d9a4f87..2b2341a54 100644 --- a/azalea/Cargo.toml +++ b/azalea/Cargo.toml @@ -4,7 +4,7 @@ edition = "2021" license = "MIT" name = "azalea" repository = "https://github.com/azalea-rs/azalea/tree/main/azalea" -version = "0.9.0" +version = "0.10.1" [package.metadata.release] pre-release-replacements = [ @@ -12,38 +12,38 @@ pre-release-replacements = [ ] [dependencies] -anyhow = "^1.0.79" -async-trait = "0.1.77" -azalea-block = { version = "0.9.0", path = "../azalea-block" } -azalea-chat = { version = "0.9.0", path = "../azalea-chat" } -azalea-client = { version = "0.9.0", path = "../azalea-client", default-features = false } -azalea-core = { version = "0.9.0", path = "../azalea-core" } -azalea-inventory = { version = "0.9.0", path = "../azalea-inventory" } -azalea-physics = { version = "0.9.0", path = "../azalea-physics" } -azalea-protocol = { version = "0.9.0", path = "../azalea-protocol" } -azalea-registry = { version = "0.9.0", path = "../azalea-registry" } -azalea-world = { version = "0.9.0", path = "../azalea-world" } -azalea-auth = { version = "0.9.0", path = "../azalea-auth" } -azalea-brigadier = { version = "0.9.0", path = "../azalea-brigadier" } -azalea-buf = { version = "0.9.0", path = "../azalea-buf" } -bevy_app = "0.13.0" -bevy_ecs = "0.13.0" -bevy_tasks = { version = "0.13.0", features = ["multi-threaded"] } +anyhow = "^1.0.82" +async-trait = "0.1.80" +azalea-block = { version = "0.10.0", path = "../azalea-block" } +azalea-chat = { version = "0.10.0", path = "../azalea-chat" } +azalea-client = { version = "0.10.0", path = "../azalea-client", default-features = false } +azalea-core = { version = "0.10.0", path = "../azalea-core" } +azalea-physics = { version = "0.10.0", path = "../azalea-physics" } +azalea-protocol = { version = "0.10.0", path = "../azalea-protocol" } +azalea-registry = { version = "0.10.0", path = "../azalea-registry" } +azalea-world = { version = "0.10.0", path = "../azalea-world" } +azalea-auth = { version = "0.10.0", path = "../azalea-auth" } +azalea-brigadier = { version = "0.10.0", path = "../azalea-brigadier" } +azalea-buf = { version = "0.10.0", path = "../azalea-buf" } +bevy_app = "0.13.2" +bevy_ecs = "0.13.2" +bevy_tasks = { version = "0.13.2", features = ["multi-threaded"] } derive_more = { version = "0.99.17", features = ["deref", "deref_mut"] } futures = "0.3.30" -futures-lite = "2.2.0" +futures-lite = "2.3.0" tracing = "0.1.40" nohash-hasher = "0.2.0" num-traits = "0.2.18" parking_lot = { version = "^0.12.1", features = ["deadlock_detection"] } -priority-queue = "1.4.0" -thiserror = "^1.0.57" -tokio = "^1.36.0" -uuid = "1.7.0" -bevy_log = "0.13.0" -azalea-entity = { version = "0.9.0", path = "../azalea-entity" } -bevy_time = "0.13.0" +priority-queue = "2.0.2" +thiserror = "^1.0.59" +tokio = "^1.37.0" +uuid = "1.8.0" +bevy_log = "0.13.2" +bevy_time = "0.13.2" rustc-hash = "1.1.0" +azalea-inventory = { version = "0.10.0", path = "../azalea-inventory" } +azalea-entity = { version = "0.10.0", path = "../azalea-entity" } [dev-dependencies] criterion = "0.5.1" diff --git a/azalea/benches/physics.rs b/azalea/benches/physics.rs index 0d4a3f2fa..146b30187 100644 --- a/azalea/benches/physics.rs +++ b/azalea/benches/physics.rs @@ -1,20 +1,10 @@ -use std::{hint::black_box, sync::Arc, time::Duration}; - use azalea::{ - pathfinder::{ - astar::{self, a_star}, - goals::{BlockPosGoal, Goal}, - mining::MiningCache, - simulation::{SimulatedPlayerBundle, Simulation, SimulationSet}, - world::CachedWorld, - }, - BlockPos, Vec3, + pathfinder::simulation::{SimulatedPlayerBundle, SimulationSet}, + Vec3, }; use azalea_core::position::{ChunkBlockPos, ChunkPos}; -use azalea_inventory::Menu; use azalea_world::{Chunk, ChunkStorage, PartialChunkStorage}; use criterion::{criterion_group, criterion_main, Bencher, Criterion}; -use parking_lot::RwLock; #[allow(dead_code)] fn generate_world(partial_chunks: &mut PartialChunkStorage, size: u32) -> ChunkStorage { diff --git a/azalea/examples/testbot/main.rs b/azalea/examples/testbot/main.rs index 86395b7e6..6795e6cf5 100644 --- a/azalea/examples/testbot/main.rs +++ b/azalea/examples/testbot/main.rs @@ -181,10 +181,12 @@ async fn swarm_handle( _state: SwarmState, ) -> anyhow::Result<()> { match &event { - SwarmEvent::Disconnect(account) => { + SwarmEvent::Disconnect(account, join_opts) => { println!("bot got kicked! {}", account.username); tokio::time::sleep(Duration::from_secs(5)).await; - swarm.add_and_retry_forever(account, State::default()).await; + swarm + .add_and_retry_forever_with_opts(account, State::default(), join_opts) + .await; } SwarmEvent::Chat(chat) => { if chat.message().to_string() == "The particle was not visible for anybody" { diff --git a/azalea/src/auto_tool.rs b/azalea/src/auto_tool.rs index bc9bb4747..77345acca 100644 --- a/azalea/src/auto_tool.rs +++ b/azalea/src/auto_tool.rs @@ -2,7 +2,7 @@ use azalea_block::{Block, BlockState}; use azalea_client::{inventory::InventoryComponent, Client}; use azalea_entity::{FluidOnEyes, Physics}; use azalea_inventory::{ItemSlot, Menu}; -use azalea_registry::Fluid; +use azalea_registry::{DataComponentKind, Fluid}; #[derive(Debug)] pub struct BestToolResult { @@ -92,7 +92,11 @@ pub fn accurate_best_tool_in_hotbar_for_block( ItemSlot::Present(item_slot) => { // lazy way to avoid checking durability since azalea doesn't have durability // data yet - if item_slot.nbt.is_none() { + if item_slot + .components + .get(DataComponentKind::Damage) + .is_none() + { this_item_speed = Some(azalea_entity::mining::get_mine_progress( block.as_ref(), item_slot.kind, diff --git a/azalea/src/lib.rs b/azalea/src/lib.rs index 84c215d54..7d8b424c9 100644 --- a/azalea/src/lib.rs +++ b/azalea/src/lib.rs @@ -15,6 +15,8 @@ pub mod pathfinder; pub mod prelude; pub mod swarm; +use std::net::SocketAddr; + use app::Plugins; pub use azalea_auth as auth; pub use azalea_block as blocks; @@ -36,6 +38,7 @@ pub use azalea_world as world; pub use bot::*; use ecs::component::Component; use futures::{future::BoxFuture, Future}; +use protocol::connect::Proxy; use protocol::{resolver::ResolverError, ServerAddress}; use swarm::SwarmBuilder; use thiserror::Error; @@ -183,12 +186,27 @@ where account: Account, address: impl TryInto, ) -> Result { - self.swarm.accounts = vec![account]; + self.swarm.accounts = vec![(account, JoinOpts::default())]; if self.swarm.states.is_empty() { self.swarm.states = vec![S::default()]; } self.swarm.start(address).await } + + /// Do the same as [`Self::start`], but allow passing in custom join + /// options. + pub async fn start_with_opts( + mut self, + account: Account, + address: impl TryInto, + opts: JoinOpts, + ) -> Result { + self.swarm.accounts = vec![(account, opts.clone())]; + if self.swarm.states.is_empty() { + self.swarm.states = vec![S::default()]; + } + self.swarm.start_with_default_opts(address, opts).await + } } impl Default for ClientBuilder { fn default() -> Self { @@ -203,3 +221,55 @@ impl Default for ClientBuilder { /// [`SwarmBuilder`]: swarm::SwarmBuilder #[derive(Component, Clone, Default)] pub struct NoState; + +/// Optional settings when adding an account to a swarm or client. +#[derive(Clone, Debug, Default)] +#[non_exhaustive] +pub struct JoinOpts { + /// The Socks5 proxy that this bot will use. + pub proxy: Option, + /// Override the server address that this specific bot will send in the + /// handshake packet. + pub custom_address: Option, + /// Override the socket address that this specific bot will use to connect + /// to the server. + pub custom_resolved_address: Option, +} + +impl JoinOpts { + pub fn new() -> Self { + Self::default() + } + + pub fn update(&mut self, other: &Self) { + if let Some(proxy) = other.proxy.clone() { + self.proxy = Some(proxy); + } + if let Some(custom_address) = other.custom_address.clone() { + self.custom_address = Some(custom_address); + } + if let Some(custom_resolved_address) = other.custom_resolved_address { + self.custom_resolved_address = Some(custom_resolved_address); + } + } + + /// Set the proxy that this bot will use. + #[must_use] + pub fn proxy(mut self, proxy: Proxy) -> Self { + self.proxy = Some(proxy); + self + } + /// Set the custom address that this bot will send in the handshake packet. + #[must_use] + pub fn custom_address(mut self, custom_address: ServerAddress) -> Self { + self.custom_address = Some(custom_address); + self + } + /// Set the custom resolved address that this bot will use to connect to the + /// server. + #[must_use] + pub fn custom_resolved_address(mut self, custom_resolved_address: SocketAddr) -> Self { + self.custom_resolved_address = Some(custom_resolved_address); + self + } +} diff --git a/azalea/src/pathfinder/mod.rs b/azalea/src/pathfinder/mod.rs index 360c4df51..a1bdaaad3 100644 --- a/azalea/src/pathfinder/mod.rs +++ b/azalea/src/pathfinder/mod.rs @@ -618,7 +618,7 @@ fn check_for_path_obstruction( } } -fn recalculate_near_end_of_path( +pub fn recalculate_near_end_of_path( mut query: Query<(Entity, &mut Pathfinder, &mut ExecutingPath)>, mut walk_events: EventWriter, mut goto_events: EventWriter, diff --git a/azalea/src/swarm/mod.rs b/azalea/src/swarm/mod.rs index 6d3885ef1..451d887c6 100644 --- a/azalea/src/swarm/mod.rs +++ b/azalea/src/swarm/mod.rs @@ -6,6 +6,7 @@ pub mod prelude; use azalea_client::{ chat::ChatPacket, start_ecs_runner, Account, Client, DefaultPlugins, Event, JoinError, + StartClientOpts, }; use azalea_protocol::{resolver, ServerAddress}; use azalea_world::InstanceContainer; @@ -17,7 +18,7 @@ use std::{collections::HashMap, future::Future, net::SocketAddr, sync::Arc, time use tokio::sync::mpsc; use tracing::error; -use crate::{BoxHandleFn, DefaultBotPlugins, HandleFn, NoState, StartError}; +use crate::{BoxHandleFn, DefaultBotPlugins, HandleFn, JoinOpts, NoState, StartError}; /// A swarm is a way to conveniently control many bots at once, while also /// being able to control bots at an individual level when desired. @@ -51,8 +52,8 @@ where SS: Default + Send + Sync + Clone + Resource + 'static, { pub(crate) app: App, - /// The accounts that are going to join the server. - pub(crate) accounts: Vec, + /// The accounts and proxies that are going to join the server. + pub(crate) accounts: Vec<(Account, JoinOpts)>, /// The individual bot states. This must be the same length as `accounts`, /// since each bot gets one state. pub(crate) states: Vec, @@ -257,8 +258,20 @@ where /// Add an account with a custom initial state. Use just /// [`Self::add_account`] to use the Default implementation for the state. #[must_use] - pub fn add_account_with_state(mut self, account: Account, state: S) -> Self { - self.accounts.push(account); + pub fn add_account_with_state(self, account: Account, state: S) -> Self { + self.add_account_with_state_and_opts(account, state, JoinOpts::default()) + } + + /// Same as [`Self::add_account_with_state`], but allow passing in custom + /// join options. + #[must_use] + pub fn add_account_with_state_and_opts( + mut self, + account: Account, + state: S, + join_opts: JoinOpts, + ) -> Self { + self.accounts.push((account, join_opts)); self.states.push(state); self } @@ -296,6 +309,23 @@ where /// /// [`ServerAddress`]: azalea_protocol::ServerAddress pub async fn start(self, address: impl TryInto) -> Result { + // convert the TryInto into a ServerAddress + let address: ServerAddress = match address.try_into() { + Ok(address) => address, + Err(_) => return Err(StartError::InvalidAddress), + }; + + self.start_with_default_opts(address, JoinOpts::default()) + .await + } + + /// Do the same as [`Self::start`], but allow passing in default join + /// options for the bots. + pub async fn start_with_default_opts( + self, + address: impl TryInto, + default_join_opts: JoinOpts, + ) -> Result { assert_eq!( self.accounts.len(), self.states.len(), @@ -303,13 +333,16 @@ where ); // convert the TryInto into a ServerAddress - let address: ServerAddress = match address.try_into() { + let address = match address.try_into() { Ok(address) => address, Err(_) => return Err(StartError::InvalidAddress), }; - // resolve the address - let resolved_address = resolver::resolve_address(&address).await?; + let address: ServerAddress = default_join_opts.custom_address.clone().unwrap_or(address); + let resolved_address: SocketAddr = match default_join_opts.custom_resolved_address { + Some(resolved_address) => resolved_address, + None => resolver::resolve_address(&address).await?, + }; let instance_container = Arc::new(RwLock::new(InstanceContainer::default())); @@ -359,24 +392,27 @@ where tokio::spawn(async move { if let Some(join_delay) = join_delay { // if there's a join delay, then join one by one - for (account, state) in accounts.iter().zip(states) { - swarm_clone.add_and_retry_forever(account, state).await; + for ((account, bot_join_opts), state) in accounts.iter().zip(states) { + let mut join_opts = default_join_opts.clone(); + join_opts.update(bot_join_opts); + swarm_clone + .add_and_retry_forever_with_opts(account, state, &join_opts) + .await; tokio::time::sleep(join_delay).await; } } else { // otherwise, join all at once let swarm_borrow = &swarm_clone; - join_all( - accounts - .iter() - .zip(states) - .map(move |(account, state)| async { - swarm_borrow - .clone() - .add_and_retry_forever(account, state) - .await; - }), - ) + join_all(accounts.iter().zip(states).map( + |((account, bot_join_opts), state)| async { + let mut join_opts = default_join_opts.clone(); + join_opts.update(bot_join_opts); + swarm_borrow + .clone() + .add_and_retry_forever_with_opts(account, state, &join_opts) + .await; + }, + )) .await; } @@ -441,9 +477,9 @@ pub enum SwarmEvent { Init, /// A bot got disconnected from the server. /// - /// You can implement an auto-reconnect by calling [`Swarm::add`] - /// with the account from this event. - Disconnect(Box), + /// You can implement an auto-reconnect by calling [`Swarm::add_with_opts`] + /// with the account and options from this event. + Disconnect(Box, JoinOpts), /// At least one bot received a chat message. Chat(ChatPacket), } @@ -500,10 +536,10 @@ pub type BoxSwarmHandleFn = /// _state: SwarmState, /// ) -> anyhow::Result<()> { /// match &event { -/// SwarmEvent::Disconnect(account) => { +/// SwarmEvent::Disconnect(account, join_opts) => { /// // automatically reconnect after 5 seconds /// tokio::time::sleep(Duration::from_secs(5)).await; -/// swarm.add(account, State::default()).await?; +/// swarm.add_with_opts(account, State::default(), join_opts).await?; /// } /// SwarmEvent::Chat(m) => { /// println!("{}", m.message().to_ansi()); @@ -525,16 +561,38 @@ impl Swarm { account: &Account, state: S, ) -> Result { - let address = self.address.read().clone(); - let resolved_address = *self.resolved_address.read(); + self.add_with_opts(account, state, &JoinOpts::default()) + .await + } + /// Add a new account to the swarm, using custom options. This is useful if + /// you want bots in the same swarm to connect to different addresses. + /// Usually you'll just want [`Self::add`] though. + /// + /// # Errors + /// + /// Returns an `Err` if the bot could not do a handshake successfully. + pub async fn add_with_opts( + &mut self, + account: &Account, + state: S, + join_opts: &JoinOpts, + ) -> Result { + let address = join_opts + .custom_address + .clone() + .unwrap_or_else(|| self.address.read().clone()); + let resolved_address = join_opts + .custom_resolved_address + .unwrap_or_else(|| *self.resolved_address.read()); - let (bot, mut rx) = Client::start_client( - self.ecs_lock.clone(), + let (bot, mut rx) = Client::start_client(StartClientOpts { + ecs_lock: self.ecs_lock.clone(), account, - &address, - &resolved_address, - self.run_schedule_sender.clone(), - ) + address: &address, + resolved_address: &resolved_address, + proxy: join_opts.proxy.clone(), + run_schedule_sender: self.run_schedule_sender.clone(), + }) .await?; // add the state to the client { @@ -548,6 +606,7 @@ impl Swarm { let cloned_bots_tx = self.bots_tx.clone(); let cloned_bot = bot.clone(); let swarm_tx = self.swarm_tx.clone(); + let join_opts = join_opts.clone(); tokio::spawn(async move { while let Some(event) = rx.recv().await { // we can't handle events here (since we can't copy the handler), @@ -561,7 +620,7 @@ impl Swarm { .get_component::() .expect("bot is missing required Account component"); swarm_tx - .send(SwarmEvent::Disconnect(Box::new(account))) + .send(SwarmEvent::Disconnect(Box::new(account), join_opts)) .unwrap(); }); @@ -577,10 +636,22 @@ impl Swarm { &mut self, account: &Account, state: S, + ) -> Client { + self.add_and_retry_forever_with_opts(account, state, &JoinOpts::default()) + .await + } + + /// Same as [`Self::add_and_retry_forever`], but allow passing custom join + /// options. + pub async fn add_and_retry_forever_with_opts( + &mut self, + account: &Account, + state: S, + opts: &JoinOpts, ) -> Client { let mut disconnects = 0; loop { - match self.add(account, state.clone()).await { + match self.add_with_opts(account, state.clone(), opts).await { Ok(bot) => return bot, Err(e) => { disconnects += 1; diff --git a/codegen/.gitignore b/codegen/.gitignore index ee2504d7e..77bd5fb39 100755 --- a/codegen/.gitignore +++ b/codegen/.gitignore @@ -3,3 +3,4 @@ __pycache__ downloads __cache__ +venv diff --git a/codegen/README.md b/codegen/README.md index ba5e54a3b..60b881ced 100755 --- a/codegen/README.md +++ b/codegen/README.md @@ -40,7 +40,7 @@ If it all works, make a pull request. If the version you updated to is a snapsho At the time of writing, the following data generators are used: - [Vanilla data generator](https://wiki.vg/Data_Generators) -- [Burger](https://github.com/Pokechu22/Burger) +- [Burger](https://github.com/mat-1/Burger) - [PixLyzer](https://gitlab.bixilon.de/bixilon/pixlyzer) Some things can be obtained from multiple generators. You should prefer them by the order above (the vanilla generator is the most reliable). diff --git a/codegen/genblocks.py b/codegen/genblocks.py index 5e28b60a4..1af0ad106 100755 --- a/codegen/genblocks.py +++ b/codegen/genblocks.py @@ -9,10 +9,11 @@ version_id = lib.code.version.get_version_id() +# TODO: pixlyzer is broken so we use old data shape_datas = lib.extract.get_pixlyzer_data( - version_id, 'shapes') + '1.20.3-pre4', 'shapes') pixlyzer_block_datas = lib.extract.get_pixlyzer_data( - version_id, 'blocks') + '1.20.3-pre4', 'blocks') mappings = lib.download.get_mappings_for_version(version_id) block_states_burger = lib.extract.get_block_states_burger(version_id) diff --git a/codegen/lib/code/blocks.py b/codegen/lib/code/blocks.py index f96b11166..cda95339c 100755 --- a/codegen/lib/code/blocks.py +++ b/codegen/lib/code/blocks.py @@ -1,5 +1,4 @@ from lib.utils import get_dir_location, to_camel_case -from lib.code.utils import clean_property_name from ..mappings import Mappings from typing import Optional import re @@ -41,7 +40,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat if property_burger is None: print( - 'Warning: The reports have states for a block, but Burger doesn\'t!', block_data_burger) + f'Warning: The reports have states for a block, but Burger doesn\'t! (missing "{property_name}")', block_data_burger) property_struct_name = get_property_struct_name( property_burger, block_data_burger, property_variants, mappings) @@ -56,7 +55,6 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat block_properties[property_struct_name] = property_variants - property_name = clean_property_name(property_name) property_struct_names_to_names[property_struct_name] = property_name properties.update(block_properties) @@ -90,7 +88,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat for block_id in ordered_blocks: block_data_burger = blocks_burger[block_id] block_data_report = blocks_report['minecraft:' + block_id] - block_data_pixlyzer = pixlyzer_block_datas[f'minecraft:{block_id}'] + block_data_pixlyzer = pixlyzer_block_datas.get(f'minecraft:{block_id}', {}) block_properties = block_data_burger.get('states', []) block_properties_burger = block_data_burger.get('states', []) @@ -125,8 +123,7 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, pixlyzer_block_dat assert property_default is not None - property_name = clean_property_name(property_name) - this_property_code = f'{property_name}: {property_default_type}' + this_property_code = f'"{property_name}": {property_default_type}' properties_code += f'\n {this_property_code},' # if there's nothing inside the properties, keep it in one line @@ -202,6 +199,10 @@ def get_property_struct_name(property: Optional[dict], block_data_burger: dict, return 'ChestType' if property_variants == ['compare', 'subtract']: return 'ComparatorType' + if property_variants == ['inactive', 'waiting_for_players', 'active', 'waiting_for_reward_ejection', 'ejecting_reward', 'cooldown']: + return 'TrialSpawnerState' + if property_variants == ['inactive', 'active', 'unlocking', 'ejecting']: + return 'VaultState' if 'harp' in property_variants and 'didgeridoo' in property_variants: return 'Sound' diff --git a/codegen/lib/code/entity.py b/codegen/lib/code/entity.py index 8fa114307..5f0bc3d9e 100644 --- a/codegen/lib/code/entity.py +++ b/codegen/lib/code/entity.py @@ -89,7 +89,7 @@ def generate_entity_metadata(burger_entities_data: dict, mappings: Mappings): with open(DATA_RS_DIR, 'w') as f: f.write('\n'.join(lines)) print('Expected metadata types:\n' + '\n'.join(new_metadata_names)) - print('Updated metadata types in azalea-world/src/entity/data.rs, go make sure they\'re correct and then press enter') + print('Updated metadata types in azalea-entity/src/data.rs, go make sure they\'re correct (check EntityDataSerializers.java) and then press enter') input() metadata_types = parse_metadata_types_from_code() @@ -100,12 +100,17 @@ def generate_entity_metadata(burger_entities_data: dict, mappings: Mappings): // This file is generated from codegen/lib/code/entity.py. // Don't change it manually! +use crate::particle::Particle; + use super::{ - EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, Rotations, - SnifferState, VillagerData + ArmadilloStateKind, EntityDataItem, EntityDataValue, OptionalUnsignedInt, Pose, Quaternion, + Rotations, SnifferState, VillagerData, }; use azalea_chat::FormattedText; -use azalea_core::{particle::Particle, position::{BlockPos, Vec3}, direction::Direction}; +use azalea_core::{ + direction::Direction, + position::{BlockPos, Vec3}, +}; use azalea_inventory::ItemSlot; use bevy_ecs::{bundle::Bundle, component::Component}; use derive_more::{Deref, DerefMut}; @@ -218,8 +223,7 @@ def maybe_rename_field(name: str, index: int) -> str: struct_name = upper_first_letter( to_camel_case(name_or_bitfield)) - type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))[ - 'type_id'] + type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))['type_id'] metadata_type_data = metadata_types[type_id] rust_type = metadata_type_data['type'] @@ -281,8 +285,7 @@ def maybe_rename_field(name: str, index: int) -> str: if name_or_bitfield in single_use_imported_types: field_struct_name = '' - type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))[ - 'type_id'] + type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))['type_id'] metadata_type_data = metadata_types[type_id] rust_type = metadata_type_data['type'] type_name = metadata_type_data['name'] @@ -384,8 +387,7 @@ def generate_fields(this_entity_id: str): ' },') for index, name_or_bitfield in get_entity_metadata_names(this_entity_id, burger_entity_metadata, mappings).items(): - default = next(filter(lambda i: i['index'] == index, entity_metadatas)).get( - 'default', 'Default::default()') + default = next(filter(lambda i: i['index'] == index, entity_metadatas)).get('default', 'Default::default()') if isinstance(name_or_bitfield, str): type_id = next(filter(lambda i: i['index'] == index, entity_metadatas))[ 'type_id'] @@ -454,8 +456,10 @@ def generate_fields(this_entity_id: str): for mask, name in name_or_bitfield.items(): name = maybe_rename_field(name, index) mask = int(mask, 0) - bit_default = 'true' if ( - default & mask != 0) else 'false' + if default is None: + bit_default = 'false' + else: + bit_default = 'true' if (default & mask != 0) else 'false' code.append( f' {name}: {upper_first_letter(to_camel_case(name))}({bit_default}),') code.append(' Self {') diff --git a/codegen/lib/code/shapes.py b/codegen/lib/code/shapes.py index 6906328c5..b50cdcf1e 100755 --- a/codegen/lib/code/shapes.py +++ b/codegen/lib/code/shapes.py @@ -1,6 +1,4 @@ from lib.utils import get_dir_location, to_camel_case -from lib.code.utils import clean_property_name -from .blocks import get_property_struct_name from ..mappings import Mappings COLLISION_BLOCKS_RS_DIR = get_dir_location( @@ -73,9 +71,11 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report, generated_shape_code += generate_code_for_shape(shape_id, shape) - # 1..100 | 200..300 => &SHAPE1, - generated_match_inner_code = '' - shape_ids_to_block_state_ids = {} + # static SHAPES_MAP: [&Lazy; 26644] = [&SHAPE0, &SHAPE1, &SHAPE1, ...] + empty_shapes = [] + full_shapes = [] + + block_state_ids_to_shape_ids = [] for block_id, shape_ids in blocks.items(): if isinstance(shape_ids, int): shape_ids = [shape_ids] @@ -84,19 +84,24 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report, for possible_state, shape_id in zip(block_report_data['states'], shape_ids): block_state_id = possible_state['id'] - if shape_id not in shape_ids_to_block_state_ids: - shape_ids_to_block_state_ids[shape_id] = [] - shape_ids_to_block_state_ids[shape_id].append(block_state_id) + if shape_id == 0 : + empty_shapes.append(block_state_id) + elif shape_id == 1 : + full_shapes.append(block_state_id) + + block_state_ids_to_shape_ids.append((block_state_id, shape_id)) + + + generated_map_code = f'static SHAPES_MAP: [&Lazy; {len(block_state_ids_to_shape_ids)}] = [' - empty_shape_match_code = convert_ints_to_rust_ranges(shape_ids_to_block_state_ids[0]) - block_shape_match_code = convert_ints_to_rust_ranges(shape_ids_to_block_state_ids[1]) + block_state_ids_to_shape_ids = sorted(block_state_ids_to_shape_ids, key=lambda x: x[0]) - # shape 1 is the most common so we have a _ => &SHAPE1 at the end - del shape_ids_to_block_state_ids[1] + empty_shape_match_code = convert_ints_to_rust_ranges(empty_shapes) + block_shape_match_code = convert_ints_to_rust_ranges(full_shapes) - for shape_id, block_state_ids in shape_ids_to_block_state_ids.items(): - generated_match_inner_code += f'{convert_ints_to_rust_ranges(block_state_ids)} => &SHAPE{shape_id},\n' - generated_match_inner_code += '_ => &SHAPE1' + for block_state_id, shape_id in block_state_ids_to_shape_ids: + generated_map_code += f'&SHAPE{shape_id},\n' + generated_map_code += '];' if empty_shape_match_code == '': print('Error: shape 0 was not found') @@ -126,11 +131,10 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report, {generated_shape_code} + impl BlockWithShape for BlockState {{ fn shape(&self) -> &'static VoxelShape {{ - match self.id {{ - {generated_match_inner_code} - }} + SHAPES_MAP.get(self.id as usize).unwrap_or(&&SHAPE1) }} fn is_shape_empty(&self) -> bool {{ @@ -141,8 +145,12 @@ def generate_block_shapes_code(blocks: dict, shapes: dict, block_states_report, matches!(self.id, {block_shape_match_code}) }} }} + +{generated_map_code} ''' + + def generate_code_for_shape(shape_id: str, parts: list[list[float]]): def make_arguments(part: list[float]): diff --git a/codegen/lib/code/tags.py b/codegen/lib/code/tags.py index 40b60ae36..ae4090012 100644 --- a/codegen/lib/code/tags.py +++ b/codegen/lib/code/tags.py @@ -16,7 +16,7 @@ def generate_tags(registries: dict, file_name: str, struct_name: str): ''' - for tag_name, tag in registries.items(): + for tag_name, tag in sorted(registries.items(), key=lambda x: x[0]): tag_name = tag_name.replace('/', '_') static_set_name = to_snake_case(tag_name).upper() generated += f'pub static {static_set_name}: Lazy> = Lazy::new(|| HashSet::from_iter(vec![' diff --git a/codegen/lib/code/utils.py b/codegen/lib/code/utils.py index f4f9ca82d..29adc2472 100755 --- a/codegen/lib/code/utils.py +++ b/codegen/lib/code/utils.py @@ -173,16 +173,3 @@ def write_packet_file(state, packet_name_snake_case, code): def fmt(): os.system(f'cd {get_dir_location("..")} && cargo fmt') - - -def clean_property_name(property_name): - # if the name ends with _, remove that part - ending = property_name.split('_')[-1] - if ending.isdigit(): - property_name = property_name[:-(len(ending) + 1)] - - # `type` is a reserved keyword, so we use kind instead ¯\_(ツ)_/¯ - if property_name == 'type': - property_name = 'kind' - - return property_name diff --git a/codegen/lib/download.py b/codegen/lib/download.py index 319c60809..41576594d 100755 --- a/codegen/lib/download.py +++ b/codegen/lib/download.py @@ -16,7 +16,7 @@ def get_burger(): if not os.path.exists(get_dir_location('__cache__/Burger')): print('\033[92mDownloading Burger...\033[m') os.system( - f'cd {get_dir_location("__cache__")} && git clone https://github.com/pokechu22/Burger && cd Burger && git pull') + f'cd {get_dir_location("__cache__")} && git clone https://github.com/mat-1/Burger && cd Burger && git pull') print('\033[92mInstalling dependencies...\033[m') os.system(f'cd {get_dir_location("__cache__")}/Burger && pip install six jawa') diff --git a/codegen/lib/extract.py b/codegen/lib/extract.py index 608673fad..d3bd46d35 100755 --- a/codegen/lib/extract.py +++ b/codegen/lib/extract.py @@ -1,5 +1,6 @@ # Extracting data from the Minecraft jars +from typing import TYPE_CHECKING from lib.download import get_server_jar, get_burger, get_client_jar, get_pixlyzer, get_yarn_data, get_fabric_api_versions, get_fabric_loader_versions from lib.utils import get_dir_location from zipfile import ZipFile @@ -235,9 +236,9 @@ def get_pixlyzer_data(version_id: str, category: str): assert pom_xml_dependencies != '' pom_xml = open(f'{pixlyzer_dir}/pom.xml', 'r').read() pom_xml = re.sub( - '.*?', f'{pom_xml_dependencies}', pom_xml, flags=re.DOTALL) + r'.*?', f'{pom_xml_dependencies}', pom_xml, flags=re.DOTALL) pom_xml = re.sub( - '.*?', f'{version_id}', pom_xml, flags=re.DOTALL) + r'.*?', f'{version_id}', pom_xml, flags=re.DOTALL) open(f'{pixlyzer_dir}/pom.xml', 'w').write(pom_xml) # compile @@ -275,3 +276,19 @@ def get_en_us_lang(version_id: str): return json.loads( get_file_from_jar(version_id, 'assets/minecraft/lang/en_us.json') ) + +# burger packet id extraction is broken since 1.20.5 (always returns -1, so we have to determine packet id ourselves from the mappings). +# this is very much not ideal. + +if TYPE_CHECKING: from codegen.lib.mappings import Mappings +def get_packet_list(burger_data, mappings: 'Mappings'): + packet_list = list(burger_data[0]['packets']['packet'].values()) + + current_packet_id = 0 + for packet in packet_list: + if packet['id'] == -1: + packet['id'] = current_packet_id + print(packet) + current_packet_id += 1 + + return packet_list diff --git a/codegen/migrate.py b/codegen/migrate.py index 860d860ee..2be85643e 100755 --- a/codegen/migrate.py +++ b/codegen/migrate.py @@ -26,88 +26,89 @@ old_version_id = lib.code.version.get_version_id() old_mappings = lib.download.get_mappings_for_version(old_version_id) old_burger_data = lib.extract.get_burger_data_for_version(old_version_id) -old_packet_list = list(old_burger_data[0]['packets']['packet'].values()) new_version_id = sys.argv[1] new_mappings = lib.download.get_mappings_for_version(new_version_id) new_burger_data = lib.extract.get_burger_data_for_version(new_version_id) -new_packet_list = list(new_burger_data[0]['packets']['packet'].values()) - - -old_packets: dict[PacketIdentifier, str] = {} -old_packets_data: dict[PacketIdentifier, dict] = {} -new_packets: dict[PacketIdentifier, str] = {} -new_packets_data: dict[PacketIdentifier, dict] = {} - -for packet in old_packet_list: - assert packet['class'].endswith('.class') - packet_name = old_mappings.get_class(packet['class'][:-6]) - packet_ident = PacketIdentifier( - packet['id'], packet['direction'].lower(), fix_state(packet['state'])) - old_packets[packet_ident] = packet_name - old_packets_data[packet_ident] = packet -for packet in new_packet_list: - assert packet['class'].endswith('.class') - packet_name = new_mappings.get_class(packet['class'][:-6]) - packet_ident = PacketIdentifier( - packet['id'], packet['direction'].lower(), fix_state(packet['state'])) - new_packets[packet_ident] = packet_name - new_packets_data[packet_ident] = packet - -# find removed packets -removed_packets: list[PacketIdentifier] = [] -for packet, packet_name in old_packets.items(): - if packet_name not in new_packets.values(): - removed_packets.append(packet) - print('Removed packet:', packet, packet_name) -for (direction, state), packets in group_packets(removed_packets).items(): - lib.code.packet.remove_packet_ids(packets, direction, state) - -print() - -# find packets that changed ids -changed_packets: dict[PacketIdentifier, int] = {} -for old_packet, old_packet_name in old_packets.items(): - for new_packet, new_packet_name in new_packets.items(): - if old_packet_name == new_packet_name and old_packet.direction == new_packet.direction and old_packet.state == new_packet.state and old_packet.packet_id != new_packet.packet_id: - changed_packets[old_packet] = new_packet.packet_id - print('Changed packet id:', old_packet, '->', - new_packet, f'({new_packet_name})') - break -for (direction, state), packets in group_packets(list(changed_packets.keys())).items(): - id_map: dict[int, int] = {} - for old_packet_id in packets: - new_packet_id = changed_packets[PacketIdentifier( - old_packet_id, direction, state)] - id_map[old_packet_id] = new_packet_id - lib.code.packet.change_packet_ids(id_map, direction, state) +old_packet_list = lib.extract.get_packet_list(old_burger_data, old_mappings) +new_packet_list = lib.extract.get_packet_list(new_burger_data, new_mappings) + + +# old_packets: dict[PacketIdentifier, str] = {} +# old_packets_data: dict[PacketIdentifier, dict] = {} +# new_packets: dict[PacketIdentifier, str] = {} +# new_packets_data: dict[PacketIdentifier, dict] = {} + +# for packet in old_packet_list: +# assert packet['class'].endswith('.class') +# packet_name = old_mappings.get_class(packet['class'][:-6]) +# packet_ident = PacketIdentifier( +# packet['id'], packet['direction'].lower(), fix_state(packet['state'])) +# old_packets[packet_ident] = packet_name +# old_packets_data[packet_ident] = packet +# for packet in new_packet_list: +# assert packet['class'].endswith('.class') +# packet_name = new_mappings.get_class(packet['class'][:-6]) +# packet_ident = PacketIdentifier( +# packet['id'], packet['direction'].lower(), fix_state(packet['state'])) +# new_packets[packet_ident] = packet_name +# new_packets_data[packet_ident] = packet + +# # find removed packets +# removed_packets: list[PacketIdentifier] = [] +# for packet, packet_name in old_packets.items(): +# if packet_name not in new_packets.values(): +# removed_packets.append(packet) +# print('Removed packet:', packet, packet_name) +# for (direction, state), packets in group_packets(removed_packets).items(): +# lib.code.packet.remove_packet_ids(packets, direction, state) print() -# find added/changed packets -added_or_changed_packets: list[PacketIdentifier] = [] -for new_packet, packet_name in new_packets.items(): - old_packet = None - for old_packet_tmp, old_packet_name in old_packets.items(): - if old_packet_name == packet_name: - old_packet = old_packet_tmp - break - - if packet_name not in old_packets.values(): - added_or_changed_packets.append(new_packet) - print('Added packet:', new_packet, packet_name) - elif old_packet and not lib.code.packet.are_packet_instructions_identical(new_packets_data[new_packet].get('instructions'), old_packets_data[old_packet].get('instructions')): - added_or_changed_packets.append(new_packet) - print('Changed packet:', new_packet, packet_name) -for packet in added_or_changed_packets: - lib.code.packet.generate_packet( - new_burger_data[0]['packets']['packet'], new_mappings, packet.packet_id, packet.direction, packet.state) +# # find packets that changed ids +# changed_packets: dict[PacketIdentifier, int] = {} +# for old_packet, old_packet_name in old_packets.items(): +# for new_packet, new_packet_name in new_packets.items(): +# if old_packet_name == new_packet_name and old_packet.direction == new_packet.direction and old_packet.state == new_packet.state and old_packet.packet_id != new_packet.packet_id: +# changed_packets[old_packet] = new_packet.packet_id +# print('Changed packet id:', old_packet, '->', +# new_packet, f'({new_packet_name})') +# break +# for (direction, state), packets in group_packets(list(changed_packets.keys())).items(): +# id_map: dict[int, int] = {} +# for old_packet_id in packets: +# new_packet_id = changed_packets[PacketIdentifier( +# old_packet_id, direction, state)] +# id_map[old_packet_id] = new_packet_id +# lib.code.packet.change_packet_ids(id_map, direction, state) + + +# print() + +# # find added/changed packets +# added_or_changed_packets: list[PacketIdentifier] = [] +# for new_packet, packet_name in new_packets.items(): +# old_packet = None +# for old_packet_tmp, old_packet_name in old_packets.items(): +# if old_packet_name == packet_name: +# old_packet = old_packet_tmp +# break + +# if packet_name not in old_packets.values(): +# added_or_changed_packets.append(new_packet) +# print('Added packet:', new_packet, packet_name) +# elif old_packet and not lib.code.packet.are_packet_instructions_identical(new_packets_data[new_packet].get('instructions'), old_packets_data[old_packet].get('instructions')): +# added_or_changed_packets.append(new_packet) +# print('Changed packet:', new_packet, packet_name) +# for packet in added_or_changed_packets: +# lib.code.packet.generate_packet( +# new_burger_data[0]['packets']['packet'], new_mappings, packet.packet_id, packet.direction, packet.state) lib.code.version.set_protocol_version( new_burger_data[0]['version']['protocol']) -print('Updated protocol!') +# print('Updated protocol!') old_ordered_blocks = lib.extract.get_ordered_blocks_burger(old_version_id) @@ -118,10 +119,11 @@ block_states_burger = lib.extract.get_block_states_burger(new_version_id) block_states_report = lib.extract.get_block_states_report(new_version_id) + # TODO: pixlyzer is currently broken so uhhhh shape_datas = lib.extract.get_pixlyzer_data( - new_version_id, 'shapes') + '1.20.3-pre4', 'shapes') pixlyzer_block_datas = lib.extract.get_pixlyzer_data( - new_version_id, 'blocks') + '1.20.3-pre4', 'blocks') lib.code.blocks.generate_blocks( block_states_burger, block_states_report, pixlyzer_block_datas, new_ordered_blocks, new_mappings) @@ -136,9 +138,9 @@ import genregistries genregistries.generate(new_version_id) -print('Generating entity metadata...') -burger_entities_data = new_burger_data[0]['entities'] -lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings) +# print('Generating entity metadata...') +# burger_entities_data = new_burger_data[0]['entities'] +# lib.code.entity.generate_entity_metadata(burger_entities_data, new_mappings) print('Finishing touches, setting version in README and formatting code...') lib.code.version.set_version_id(new_version_id)