From 68efa6ff9b819bd64a445a544587ffaa7e96ee4b Mon Sep 17 00:00:00 2001 From: ChuijkYahus <94828194+ChuijkYahus@users.noreply.github.com> Date: Fri, 10 Jul 2026 02:58:11 +0800 Subject: [PATCH] Nodeworks create --- .../nodeworks/26.1/nodeworks/lang/en_us.json | 110 +++++ .../nodeworks/26.1/nodeworks/lang/zh_cn.json | 110 +++++ .../_zh_cn/assets/examples/moving-items.lua | 7 + .../assets/images/inventory_terminal_gui.png | Bin 0 -> 65739 bytes .../inventory_terminal_gui_expanded.png | Bin 0 -> 83431 bytes .../_zh_cn/assets/images/node_gui.png | Bin 0 -> 37411 bytes .../automated-celestine-farm.md | 28 ++ .../example-setups/automated-smelting.md | 34 ++ .../_zh_cn/example-setups/cobble-gen.md | 35 ++ .../_zh_cn/example-setups/index.md | 9 + .../example-setups/milky-soul-ball-farm.md | 35 ++ .../_zh_cn/example-setups/moving-items.md | 105 +++++ .../_zh_cn/example-setups/smeltery-subnet.md | 37 ++ .../nodeworksguide/_zh_cn/getting-started.md | 37 ++ .../nodeworks/nodeworksguide/_zh_cn/index.md | 29 ++ .../items-blocks/antenna_coil_assembly.md | 21 + .../_zh_cn/items-blocks/blank_card.md | 21 + .../_zh_cn/items-blocks/breaker.md | 58 +++ .../_zh_cn/items-blocks/broadcast_antenna.md | 47 +++ .../_zh_cn/items-blocks/budding_celestine.md | 36 ++ .../_zh_cn/items-blocks/card_programmer.md | 34 ++ .../items-blocks/celestine_antenna_array.md | 21 + .../_zh_cn/items-blocks/celestine_block.md | 21 + .../_zh_cn/items-blocks/celestine_ore.md | 20 + .../items-blocks/celestine_receiver_dish.md | 21 + .../_zh_cn/items-blocks/celestine_shard.md | 19 + .../items-blocks/charged_beam_catalyst.md | 23 + .../_zh_cn/items-blocks/craft_requester.md | 48 +++ .../_zh_cn/items-blocks/crafting_cpu.md | 79 ++++ .../_zh_cn/items-blocks/device_frame.md | 21 + .../_zh_cn/items-blocks/diagnostic_tool.md | 47 +++ .../items-blocks/dimension_range_upgrade.md | 21 + .../_zh_cn/items-blocks/export_chest.md | 47 +++ .../_zh_cn/items-blocks/grapple_beam.md | 25 ++ .../_zh_cn/items-blocks/import_chest.md | 49 +++ .../_zh_cn/items-blocks/index.md | 36 ++ .../_zh_cn/items-blocks/inventory_terminal.md | 46 ++ .../_zh_cn/items-blocks/io_card.md | 45 ++ .../_zh_cn/items-blocks/link_crystal.md | 25 ++ .../_zh_cn/items-blocks/milky_soul_ball.md | 25 ++ .../multi_dimension_range_upgrade.md | 21 + .../_zh_cn/items-blocks/network_controller.md | 38 ++ .../_zh_cn/items-blocks/network_wrench.md | 47 +++ .../_zh_cn/items-blocks/node.md | 56 +++ .../_zh_cn/items-blocks/observer_card.md | 37 ++ .../_zh_cn/items-blocks/pipe.md | 47 +++ .../_zh_cn/items-blocks/placer.md | 45 ++ .../portable_inventory_terminal.md | 50 +++ .../_zh_cn/items-blocks/processing_handler.md | 59 +++ .../_zh_cn/items-blocks/receiver_antenna.md | 34 ++ .../_zh_cn/items-blocks/recipe_sets.md | 76 ++++ .../_zh_cn/items-blocks/redstone_card.md | 31 ++ .../_zh_cn/items-blocks/scripting_terminal.md | 50 +++ .../_zh_cn/items-blocks/storage_blocks.md | 45 ++ .../_zh_cn/items-blocks/storage_card.md | 113 +++++ .../_zh_cn/items-blocks/storage_meter.md | 62 +++ .../_zh_cn/items-blocks/user.md | 52 +++ .../_zh_cn/items-blocks/variable.md | 50 +++ .../_zh_cn/lua-api/breaker-handle.md | 127 ++++++ .../_zh_cn/lua-api/card-handle.md | 327 ++++++++++++++ .../nodeworksguide/_zh_cn/lua-api/channel.md | 68 +++ .../_zh_cn/lua-api/craft-builder.md | 91 ++++ .../_zh_cn/lua-api/handle-list.md | 75 ++++ .../nodeworksguide/_zh_cn/lua-api/importer.md | 153 +++++++ .../nodeworksguide/_zh_cn/lua-api/index.md | 32 ++ .../_zh_cn/lua-api/input-items.md | 51 +++ .../_zh_cn/lua-api/items-handle.md | 227 ++++++++++ .../nodeworksguide/_zh_cn/lua-api/job.md | 57 +++ .../nodeworksguide/_zh_cn/lua-api/network.md | 356 ++++++++++++++++ .../_zh_cn/lua-api/placer-handle.md | 76 ++++ .../nodeworksguide/_zh_cn/lua-api/presets.md | 92 ++++ .../_zh_cn/lua-api/scheduler.md | 70 +++ .../nodeworksguide/_zh_cn/lua-api/stocker.md | 155 +++++++ .../_zh_cn/lua-api/user-handle.md | 126 ++++++ .../_zh_cn/lua-api/variable-handle.md | 199 +++++++++ .../nodeworks-mechanics/autocrafting.md | 125 ++++++ .../_zh_cn/nodeworks-mechanics/cards.md | 16 + .../_zh_cn/nodeworks-mechanics/devices.md | 14 + .../_zh_cn/nodeworks-mechanics/index.md | 9 + .../nodeworks-mechanics/network-storage.md | 56 +++ .../_zh_cn/nodeworks-mechanics/subnets.md | 51 +++ .../assets/examples/moving-items.lua | 7 + .../assets/images/inventory_terminal_gui.png | Bin 0 -> 87537 bytes .../inventory_terminal_gui_expanded.png | Bin 0 -> 84913 bytes .../nodeworksguide/assets/images/node_gui.png | Bin 0 -> 50173 bytes .../automated-celestine-farm.md | 29 ++ .../example-setups/automated-smelting.md | 37 ++ .../example-setups/cobble-gen.md | 38 ++ .../nodeworksguide/example-setups/index.md | 9 + .../example-setups/milky-soul-ball-farm.md | 36 ++ .../example-setups/moving-items.md | 111 +++++ .../example-setups/smeltery-subnet.md | 43 ++ .../nodeworksguide/getting-started.md | 39 ++ .../26.1/nodeworks/nodeworksguide/index.md | 31 ++ .../items-blocks/antenna_coil_assembly.md | 21 + .../nodeworksguide/items-blocks/blank_card.md | 21 + .../nodeworksguide/items-blocks/breaker.md | 69 +++ .../items-blocks/broadcast_antenna.md | 54 +++ .../items-blocks/budding_celestine.md | 38 ++ .../items-blocks/card_programmer.md | 37 ++ .../items-blocks/celestine_antenna_array.md | 21 + .../items-blocks/celestine_block.md | 21 + .../items-blocks/celestine_ore.md | 20 + .../items-blocks/celestine_receiver_dish.md | 21 + .../items-blocks/celestine_shard.md | 19 + .../items-blocks/charged_beam_catalyst.md | 23 + .../items-blocks/craft_requester.md | 54 +++ .../items-blocks/crafting_cpu.md | 119 ++++++ .../items-blocks/device_frame.md | 21 + .../items-blocks/diagnostic_tool.md | 73 ++++ .../items-blocks/dimension_range_upgrade.md | 22 + .../items-blocks/export_chest.md | 60 +++ .../items-blocks/grapple_beam.md | 25 ++ .../items-blocks/import_chest.md | 63 +++ .../nodeworksguide/items-blocks/index.md | 36 ++ .../items-blocks/inventory_terminal.md | 46 ++ .../nodeworksguide/items-blocks/io_card.md | 59 +++ .../items-blocks/link_crystal.md | 25 ++ .../items-blocks/milky_soul_ball.md | 26 ++ .../multi_dimension_range_upgrade.md | 22 + .../items-blocks/network_controller.md | 45 ++ .../items-blocks/network_wrench.md | 59 +++ .../nodeworksguide/items-blocks/node.md | 78 ++++ .../items-blocks/observer_card.md | 52 +++ .../nodeworksguide/items-blocks/pipe.md | 50 +++ .../nodeworksguide/items-blocks/placer.md | 59 +++ .../portable_inventory_terminal.md | 56 +++ .../items-blocks/processing_handler.md | 85 ++++ .../items-blocks/receiver_antenna.md | 40 ++ .../items-blocks/recipe_sets.md | 96 +++++ .../items-blocks/redstone_card.md | 36 ++ .../items-blocks/scripting_terminal.md | 65 +++ .../items-blocks/storage_blocks.md | 54 +++ .../items-blocks/storage_card.md | 146 +++++++ .../items-blocks/storage_meter.md | 69 +++ .../nodeworksguide/items-blocks/user.md | 69 +++ .../nodeworksguide/items-blocks/variable.md | 54 +++ .../nodeworksguide/lua-api/breaker-handle.md | 158 +++++++ .../nodeworksguide/lua-api/card-handle.md | 359 ++++++++++++++++ .../nodeworksguide/lua-api/channel.md | 84 ++++ .../nodeworksguide/lua-api/craft-builder.md | 120 ++++++ .../nodeworksguide/lua-api/handle-list.md | 97 +++++ .../nodeworksguide/lua-api/importer.md | 174 ++++++++ .../nodeworks/nodeworksguide/lua-api/index.md | 34 ++ .../nodeworksguide/lua-api/input-items.md | 67 +++ .../nodeworksguide/lua-api/items-handle.md | 272 ++++++++++++ .../nodeworks/nodeworksguide/lua-api/job.md | 78 ++++ .../nodeworksguide/lua-api/network.md | 399 ++++++++++++++++++ .../nodeworksguide/lua-api/placer-handle.md | 91 ++++ .../nodeworksguide/lua-api/presets.md | 114 +++++ .../nodeworksguide/lua-api/scheduler.md | 72 ++++ .../nodeworksguide/lua-api/stocker.md | 181 ++++++++ .../nodeworksguide/lua-api/user-handle.md | 143 +++++++ .../nodeworksguide/lua-api/variable-handle.md | 219 ++++++++++ .../nodeworks-mechanics/autocrafting.md | 160 +++++++ .../nodeworks-mechanics/cards.md | 17 + .../nodeworks-mechanics/devices.md | 14 + .../nodeworks-mechanics/index.md | 9 + .../nodeworks-mechanics/network-storage.md | 76 ++++ .../nodeworks-mechanics/subnets.md | 82 ++++ 160 files changed, 10427 insertions(+) create mode 100644 projects/assets/nodeworks/26.1/nodeworks/lang/en_us.json create mode 100644 projects/assets/nodeworks/26.1/nodeworks/lang/zh_cn.json create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/examples/moving-items.lua create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/inventory_terminal_gui.png create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/inventory_terminal_gui_expanded.png create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/node_gui.png create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/automated-celestine-farm.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/automated-smelting.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/cobble-gen.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/milky-soul-ball-farm.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/moving-items.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/smeltery-subnet.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/getting-started.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/antenna_coil_assembly.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/blank_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/breaker.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/broadcast_antenna.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/budding_celestine.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/card_programmer.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_antenna_array.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_block.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_ore.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_receiver_dish.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_shard.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/charged_beam_catalyst.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/craft_requester.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/crafting_cpu.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/device_frame.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/diagnostic_tool.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/dimension_range_upgrade.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/export_chest.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/grapple_beam.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/import_chest.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/inventory_terminal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/io_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/link_crystal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/milky_soul_ball.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/multi_dimension_range_upgrade.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_controller.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_wrench.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/node.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/observer_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/pipe.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/placer.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/portable_inventory_terminal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/processing_handler.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/receiver_antenna.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/recipe_sets.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/redstone_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/scripting_terminal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_blocks.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_meter.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/user.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/variable.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/breaker-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/card-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/channel.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/craft-builder.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/handle-list.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/importer.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/input-items.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/items-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/job.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/network.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/placer-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/presets.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/scheduler.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/stocker.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/user-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/variable-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/autocrafting.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/cards.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/devices.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/network-storage.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/subnets.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/examples/moving-items.lua create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/inventory_terminal_gui.png create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/inventory_terminal_gui_expanded.png create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/node_gui.png create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/automated-celestine-farm.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/automated-smelting.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/cobble-gen.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/milky-soul-ball-farm.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/moving-items.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/smeltery-subnet.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/getting-started.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/antenna_coil_assembly.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/blank_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/breaker.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/broadcast_antenna.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/budding_celestine.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/card_programmer.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_antenna_array.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_block.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_ore.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_receiver_dish.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_shard.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/charged_beam_catalyst.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/craft_requester.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/crafting_cpu.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/device_frame.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/diagnostic_tool.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/dimension_range_upgrade.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/export_chest.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/grapple_beam.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/import_chest.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/inventory_terminal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/io_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/link_crystal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/milky_soul_ball.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/multi_dimension_range_upgrade.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_controller.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_wrench.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/node.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/observer_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/pipe.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/placer.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/portable_inventory_terminal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/processing_handler.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/receiver_antenna.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/recipe_sets.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/redstone_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/scripting_terminal.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_blocks.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_card.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_meter.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/user.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/variable.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/breaker-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/card-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/channel.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/craft-builder.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/handle-list.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/importer.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/input-items.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/items-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/job.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/network.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/placer-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/presets.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/scheduler.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/stocker.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/user-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/variable-handle.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/autocrafting.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/cards.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/devices.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/index.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/network-storage.md create mode 100644 projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/subnets.md diff --git a/projects/assets/nodeworks/26.1/nodeworks/lang/en_us.json b/projects/assets/nodeworks/26.1/nodeworks/lang/en_us.json new file mode 100644 index 000000000000..2a011662d173 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/lang/en_us.json @@ -0,0 +1,110 @@ +{ + "block.nodeworks.antenna_segment": "Antenna Segment", + "block.nodeworks.breaker": "Breaker", + "block.nodeworks.broadcast_antenna": "Broadcast Antenna", + "block.nodeworks.budding_celestine": "Budding Celestine", + "block.nodeworks.celestine_block": "Block of Celestine", + "block.nodeworks.celestine_cluster": "Celestine Cluster", + "block.nodeworks.celestine_ore": "Deepslate Celestine Ore", + "block.nodeworks.co_processor": "Crafting Co-Processor", + "block.nodeworks.covered_pipe": "Covered Vacuum Pipe", + "block.nodeworks.craft_requester": "Craft Requester", + "block.nodeworks.crafting_core": "Crafting Core", + "block.nodeworks.crafting_storage": "Crafting Buffer", + "block.nodeworks.device_frame": "Device Frame", + "block.nodeworks.export_chest": "Export Chest", + "block.nodeworks.focus_node": "Focus Node", + "block.nodeworks.import_chest": "Import Chest", + "block.nodeworks.instruction_crafter": "Instruction Crafter", + "block.nodeworks.instruction_storage": "Instruction Storage", + "block.nodeworks.inventory_terminal": "Inventory Terminal", + "block.nodeworks.large_celestine_bud": "Large Celestine Bud", + "block.nodeworks.medium_celestine_bud": "Medium Celestine Bud", + "block.nodeworks.monitor": "Monitor", + "block.nodeworks.network_controller": "Network Controller", + "block.nodeworks.node": "Node", + "block.nodeworks.pipe": "Vacuum Pipe", + "block.nodeworks.placer": "Placer", + "block.nodeworks.processing_handler": "Processing Handler", + "block.nodeworks.processing_storage": "Processing Storage", + "block.nodeworks.receiver_antenna": "Receiver Antenna", + "block.nodeworks.small_celestine_bud": "Small Celestine Bud", + "block.nodeworks.stabilizer": "Crafting Coolant", + "block.nodeworks.storage_meter": "Storage Meter", + "block.nodeworks.substrate": "Crafting Substrate", + "block.nodeworks.terminal": "Scripting Terminal", + "block.nodeworks.user": "User", + "block.nodeworks.variable": "Variable", + "container.nodeworks.breaker": "Breaker Settings", + "container.nodeworks.broadcast_antenna": "Broadcast Antenna", + "container.nodeworks.card_programmer": "Card Programmer", + "container.nodeworks.card_settings": "Card Settings", + "container.nodeworks.craft_requester": "Craft Requester", + "container.nodeworks.crafting_core": "Crafting CPU", + "container.nodeworks.diagnostic": "Network Diagnostic", + "container.nodeworks.export_chest": "Export Chest", + "container.nodeworks.import_chest": "Import Chest", + "container.nodeworks.instruction_set": "Instruction Set", + "container.nodeworks.instruction_storage": "Instruction Storage", + "container.nodeworks.inventory_terminal": "Inventory Terminal", + "container.nodeworks.network_controller": "Network Controller", + "container.nodeworks.node_side": "Node, %s", + "container.nodeworks.placer": "Placer Settings", + "container.nodeworks.portable_inventory_terminal": "Portable Inventory Terminal", + "container.nodeworks.processing_handler": "Processing Handler", + "container.nodeworks.processing_set": "Processing Set", + "container.nodeworks.processing_storage": "Processing Storage", + "container.nodeworks.receiver_antenna": "Receiver Antenna", + "container.nodeworks.storage_card": "Storage Card", + "container.nodeworks.storage_meter": "Storage Meter", + "container.nodeworks.user": "User", + "container.nodeworks.variable": "Variable Settings", + "item.nodeworks.antenna_coil_assembly": "Antenna Coil Assembly", + "item.nodeworks.blank_card": "Blank Card", + "item.nodeworks.card_programmer": "Card Programmer", + "item.nodeworks.celestine_antenna_array": "Celestine Antenna Array", + "item.nodeworks.celestine_receiver_dish": "Celestine Receiver Dish", + "item.nodeworks.celestine_shard": "Celestine Shard", + "item.nodeworks.charged_beam_catalyst": "Charged Beam Catalyst", + "item.nodeworks.diagnostic_tool": "Diagnostic Tool", + "item.nodeworks.dimension_range_upgrade": "Dimension Range Upgrade", + "item.nodeworks.grapple_beam": "Grapple Beam", + "item.nodeworks.instruction_set": "Instruction Set", + "item.nodeworks.io_card": "IO Card", + "item.nodeworks.link_crystal": "Link Crystal", + "item.nodeworks.milky_soul_ball": "Milky Soul Ball", + "item.nodeworks.multi_dimension_range_upgrade": "Multi-Dimension Range Upgrade", + "item.nodeworks.network_wrench": "Network Wrench", + "item.nodeworks.nodeworks_book.tooltip": "Right-click to open the Nodeworks guide.", + "item.nodeworks.nodeworks_book": "Nodeworks Book", + "item.nodeworks.observer_card": "Observer Card", + "item.nodeworks.portable_inventory_terminal": "Portable Inventory Terminal", + "item.nodeworks.processing_set": "Processing Set", + "item.nodeworks.redstone_card": "Redstone Card", + "item.nodeworks.storage_card": "Storage Card", + "jei.nodeworks.category.soul_sand_infusion": "Soul Sand Infusion", + "message.nodeworks.card_reset": "Cleared.", + "message.nodeworks.connected": "Linked.", + "message.nodeworks.diagnostic_no_network": "No network block found", + "message.nodeworks.disconnected": "Unlinked.", + "message.nodeworks.duplicate_controller": "Linking would merge two networks with separate controllers.", + "message.nodeworks.duplicate_controller": "Network already has a controller.", + "message.nodeworks.endpoint_selected": "Selected Focus Node at (%s, %s, %s)", + "message.nodeworks.max_links": "One of the Focus Nodes is at its link cap.", + "message.nodeworks.no_controller": "Network has no controller.", + "message.nodeworks.no_line_of_sight": "No line of sight between Focus Nodes.", + "message.nodeworks.no_selection": "No selection. Shift + right-click a Focus Node's free face first.", + "message.nodeworks.not_focus_node": "Right-click a Focus Node to start a link, then right-click another Focus Node to finish.", + "message.nodeworks.same_endpoint": "Cannot link a Focus Node to itself.", + "message.nodeworks.selection_invalid": "Previously selected Focus Node no longer exists.", + "message.nodeworks.terminal_controller_conflict": "Network has no controller, or multiple controllers are conflicting.", + "message.nodeworks.terminal_in_use": "Terminal is already in use by %s.", + "message.nodeworks.terminal_no_network": "Terminal is not connected to a node network.", + "message.nodeworks.too_far": "Focus Nodes are too far apart (max %s blocks).", + "subtitle.nodeworks.grapple_beam.activate": "Grapple Beam latches", + "subtitle.nodeworks.grapple_beam.deactivate": "Grapple Beam releases", + "tooltip.nodeworks.covered_pipe.camo": "Disguised as %s", + "tooltip.nodeworks.instruction_set.input": "Input:", + "tooltip.nodeworks.instruction_set.output": "Output:", + "tooltip.nodeworks.missing_ingredients": "Missing ingredients in your inventory and network" +} \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/lang/zh_cn.json b/projects/assets/nodeworks/26.1/nodeworks/lang/zh_cn.json new file mode 100644 index 000000000000..14b695012045 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/lang/zh_cn.json @@ -0,0 +1,110 @@ +{ + "block.nodeworks.antenna_segment": "天线段", + "block.nodeworks.breaker": "破坏器", + "block.nodeworks.broadcast_antenna": "广播天线", + "block.nodeworks.budding_celestine": "天青石母岩", + "block.nodeworks.celestine_block": "天青石块", + "block.nodeworks.celestine_cluster": "天青石簇", + "block.nodeworks.celestine_ore": "深层天青石矿石", + "block.nodeworks.co_processor": "合成协处理器", + "block.nodeworks.covered_pipe": "覆层真空管道", + "block.nodeworks.craft_requester": "合成请求器", + "block.nodeworks.crafting_core": "合成核心", + "block.nodeworks.crafting_storage": "合成缓存器", + "block.nodeworks.device_frame": "设备框架", + "block.nodeworks.export_chest": "导出箱", + "block.nodeworks.focus_node": "焦准节点", + "block.nodeworks.import_chest": "导入箱", + "block.nodeworks.instruction_crafter": "指令合成器", + "block.nodeworks.instruction_storage": "指令存储器", + "block.nodeworks.inventory_terminal": "物品栏终端", + "block.nodeworks.large_celestine_bud": "大型天青石芽", + "block.nodeworks.medium_celestine_bud": "中型天青石芽", + "block.nodeworks.monitor": "监控器", + "block.nodeworks.network_controller": "网络控制器", + "block.nodeworks.node": "节点", + "block.nodeworks.pipe": "真空管道", + "block.nodeworks.placer": "放置器", + "block.nodeworks.processing_handler": "处理操作器", + "block.nodeworks.processing_storage": "处理存储器", + "block.nodeworks.receiver_antenna": "接收天线", + "block.nodeworks.small_celestine_bud": "小型天青石芽", + "block.nodeworks.stabilizer": "合成冷却器", + "block.nodeworks.storage_meter": "库存量表", + "block.nodeworks.substrate": "合成载件", + "block.nodeworks.terminal": "脚本终端", + "block.nodeworks.user": "使用器", + "block.nodeworks.variable": "变量器", + "container.nodeworks.breaker": "破坏器设置", + "container.nodeworks.broadcast_antenna": "广播天线", + "container.nodeworks.card_programmer": "卡片编程器", + "container.nodeworks.card_settings": "卡片设置", + "container.nodeworks.craft_requester": "合成请求器", + "container.nodeworks.crafting_core": "合成CPU", + "container.nodeworks.diagnostic": "网络诊断", + "container.nodeworks.export_chest": "导出箱", + "container.nodeworks.import_chest": "导入箱", + "container.nodeworks.instruction_set": "指令集", + "container.nodeworks.instruction_storage": "指令存储器", + "container.nodeworks.inventory_terminal": "物品栏终端", + "container.nodeworks.network_controller": "网络控制器", + "container.nodeworks.node_side": "节点,%s", + "container.nodeworks.placer": "放置器设置", + "container.nodeworks.portable_inventory_terminal": "便携式物品栏终端", + "container.nodeworks.processing_handler": "处理操作器", + "container.nodeworks.processing_set": "处理集", + "container.nodeworks.processing_storage": "处理存储器", + "container.nodeworks.receiver_antenna": "接收天线", + "container.nodeworks.storage_card": "存储卡", + "container.nodeworks.storage_meter": "库存量表", + "container.nodeworks.user": "使用器", + "container.nodeworks.variable": "变量器设置", + "item.nodeworks.antenna_coil_assembly": "天线线圈组", + "item.nodeworks.blank_card": "空白卡", + "item.nodeworks.card_programmer": "卡片编程器", + "item.nodeworks.celestine_antenna_array": "天青石天线阵列", + "item.nodeworks.celestine_receiver_dish": "天青石接收锅", + "item.nodeworks.celestine_shard": "天青石碎片", + "item.nodeworks.charged_beam_catalyst": "充能光束触媒", + "item.nodeworks.diagnostic_tool": "诊断工具", + "item.nodeworks.dimension_range_upgrade": "维度范围升级", + "item.nodeworks.grapple_beam": "抓钩光束", + "item.nodeworks.instruction_set": "指令集", + "item.nodeworks.io_card": "IO卡", + "item.nodeworks.link_crystal": "链接晶体", + "item.nodeworks.milky_soul_ball": "奶液灵魂球", + "item.nodeworks.multi_dimension_range_upgrade": "多维度范围升级", + "item.nodeworks.network_wrench": "网络扳手", + "item.nodeworks.nodeworks_book.tooltip": "右击打开节点工程指南。", + "item.nodeworks.nodeworks_book": "节点工程之书", + "item.nodeworks.observer_card": "侦测卡", + "item.nodeworks.portable_inventory_terminal": "便携式物品栏终端", + "item.nodeworks.processing_set": "处理集", + "item.nodeworks.redstone_card": "红石卡", + "item.nodeworks.storage_card": "存储卡", + "jei.nodeworks.category.soul_sand_infusion": "灵魂沙灌注", + "message.nodeworks.card_reset": "已清除。", + "message.nodeworks.connected": "已链接。", + "message.nodeworks.diagnostic_no_network": "未找到网络方块", + "message.nodeworks.disconnected": "已断开链接。", + "message.nodeworks.duplicate_controller": "链接会导致合并各有控制器的两个网络。", + "message.nodeworks.duplicate_controller": "网络中已有控制器。", + "message.nodeworks.endpoint_selected": "已选中(%s, %s, %s)处的焦准节点", + "message.nodeworks.max_links": "其中一个焦准节点已达到链接上限。", + "message.nodeworks.no_controller": "网络没有控制器。", + "message.nodeworks.no_line_of_sight": "焦准节点之间没有无遮挡直线路径。", + "message.nodeworks.no_selection": "未进行选择。请先Shift+右击焦准节点的临空面。", + "message.nodeworks.not_focus_node": "右击焦准节点以开始链接,再右击其他焦准节点以结束。", + "message.nodeworks.same_endpoint": "无法将焦准节点链接到自身。", + "message.nodeworks.selection_invalid": "先前选择的焦准节点已不存在。", + "message.nodeworks.terminal_controller_conflict": "网络没有控制器,或有多个冲突的控制器。", + "message.nodeworks.terminal_in_use": "%s正在使用终端。", + "message.nodeworks.terminal_no_network": "终端未连接至节点网络。", + "message.nodeworks.too_far": "焦准节点距离过远(最远%s格)。", + "subtitle.nodeworks.grapple_beam.activate": "抓钩光束:抓握", + "subtitle.nodeworks.grapple_beam.deactivate": "抓钩光束:释放", + "tooltip.nodeworks.covered_pipe.camo": "伪装为%s", + "tooltip.nodeworks.instruction_set.input": "输入:", + "tooltip.nodeworks.instruction_set.output": "输出:", + "tooltip.nodeworks.missing_ingredients": "你的物品栏和网络均缺少原材料" +} \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/examples/moving-items.lua b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/examples/moving-items.lua new file mode 100644 index 000000000000..ccc145be1120 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/examples/moving-items.lua @@ -0,0 +1,7 @@ +local input = network:get("input") +local output = network:get("output") + +local allItems = input:find("*") -- 抽取此容器中的所有物品 +if allItems then -- 如果找到了物品 + output:insert(allItems) +end diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/inventory_terminal_gui.png b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/inventory_terminal_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..1c0f30f4803e6e817e80160b25afbb7985470555 GIT binary patch literal 65739 zcmZ_02~?76+XZZy*~#X~vee4V%EZbkbE;!$Woc!}QBfrhTJ=2K_ciQm?|l_{$=-JDYPHo0 z3JPn_ojrX;K|#?8_+7JVIq;JYD;&BNmMQq2JALZv-PG~kKR&C|!+r{Q6;#({H^LOo zY;0foGGW)*B<*;Y;e#z83J0Gvhu!Rye!7fBAitlP@b>d7UFXBx_`%msc<`5;}pN z=w-@qyGP%$MtC#5DzBbqQ=~DN>2%G>`=7pw+p()7)SkQ(b9;IqIWJ0F@~=o9?Vdza z+7E8tI^WlNg;d7Y(|=6Ii}cGO_X3c}UnzZC)=gl8n3`uI&7QdF_e}odv|U!*lk=!T z;?lgfL^f9r&oO8X)m$fq2XAc8@Q7%heE5bwde?z+X(x1*`!pumy}+dZ%-(35@9Q7J zqOVV$EMeAhyGGc%1e+NHB@Ll%-z(@{IPv~rS*MHJj7PO>{)^&;v7Y1e*N+L>xOy^d! z@sc)HGR66aZM6)o@Y=7qvO)Y$W>qsyW=77n5Sa{pR=+5EU+1yii2rQ3usc~u(cITo z;WJI|dS}KfR%c+Y>!?KJ592aREncT>Mf;!1u;Nmiz+R0_Qjh!+UPsc? z*gdP>d))BuvW|HAxH9rqB)e(3Tdk1QbXaX$@Vc=&YA_5TWvQgnY`vLL+1vx#gDqea&a)ipd3U+19mJZzdOP zSRpiBZLxzM{$}hXL}K{^x^6RAcI-#u>>kh~lCg4vh7NvBHt9#sWr#87i!r!RzwQV8 zv84SZMdL@ld)$UDZdeNW{=|H*SzHVMy#htLc}QeZuf7dPbg%7>CxN%k*_sukEWo5l zje7Y9#vk9H1*&e+1VTbV;gTtP`PVq3r|!ZAD6?;R+@pQ|k2991^cxCP52(2DPg|bK z2dR9^u7QsJ*|qVH<%s<_oZ2s;tNpg2=l9N3B(ZkKZpMySL$WSH29Lm#K|i2RPC`=B zTDQTW$E!H7Nb2EVVeg*#8w}APALz^m^C*>-3+Ku!=RY*DhJTnw))n*|1}mh|2VHC32lWGc ztuA*SJujlBDkkgvGW6=N-;I~T`$yM5ARY7Ek6+V2s;PsQZXi}eS(9ryVJWK5d1?Wj z>(+e#85}L``vyPp7WZLwHKlYRu`)or;m~dcg_E2kN-Go;KBj)HP;j{xuA!iC-6q-l zdy8ydXClm}M7a3P-K%wwRio^@IaW8K|v)UV`r5NeonTibq~ z`rO1413`AgwM+fSvO?ejkGTG|_(r=B%iN5*!L1<~H<-s%FAcT`mhJ}Of%k*nDxpjqgGq_A&D@w2|QJ9_#;t$Cmc%C#`mLq zpXr(rePgMaD{quAi>+KdJW9ABrD=^y9}cVm4)j`A-NE$_mnkS5dU_Bz;L5A@`KvPK z&SBn&^?}TJlcpNr+NlKj>#xsTZpZ3-<6mmtQ~E+#X!4MB1Sj>KrLT{ee5B-wth@ZN z!;f5}tyfYBov0$fqpvUz?!*cc*yRMRx`-#xfqI*(;k+SB0l7!SYn;&aN3g(r(rF0e z%SJFCf|YK9?*QJJ*W5g-7{o08-m>M$!unkKfh2w(+ud=~iCW+4 zM7P=Th=|Y0Pvt5NBAYvxyLI|syu%Wev&>#iEmQazb?qdOTlF`#-Zq2y&75U;^Kp`K z@ACZIQ!W>G3mvg2U*WT9Qd!WHQR8#04fV`R0z7%nfUJ?EZq4^|fp~EnA-3s>>aoYno-1nYN7Q+=*t|~zLZY=gYY)DE0Q8Ky8-KX}kR|V?)4(B8R-?)V zWyjH0;C){&%Uf=*Tsm}`gMz|^=E45mOW(}e?IgHc zRGQ zf#Ii*fvlO}%ek2e(YiZdnC}J8vxhuMHJL5bW^N>mhjSGROr#CNcVu8Zs-EehF80?G z7X$v-rww2pYL%kVa!z??XJ;$=fopz|&Gng8!OP^~@ElUvo8b1#pka0A9q2rC?3XV* zG12XNJiX4{pj7qQj!0tQR||&G*%@@Aq{Lc5q57Y4$T`BQ+Ql@T`@DL%KGQz7Q>T=c z=lr9S->H=#{`=gn zBJi!Pi?#nRr5;~sVRLn2sn_edBV1NQ5$1(j)!iDLwqQ%AlQ$GM?(%cEsN*8p|1;GO zq@ZB-Bi^hf~hz__vVh$+{7;64I#q)bWxUiNqOOjxNsK z>Mg1hn}jVytMY2GiG$o8<2!5HQgtV_KN*L#&RrI`VJ1L4eyR+8lK|r&0Fla z)q{V(yjIzJITe}YrW2og9@W+q+h~yiD)qR{?{x+#ZA%X>+4VC;<(?XFl@DI=hp z|Ia^v24b-4yKe<16GQWTy+yBk9*)0p3IVTo&akf^EJ{Yz-HTuxCFSABHBcYZ&2dE6 z$hypzj0ncrLP4A`jA5y^1N(s^t}8p~9Q%1*6bIj`TdJIC!_@Nv%FWUKLpBfw(84!h zMRyHRrXW4rOGzt>(C@W!b90SVKlcVQ3s1}?HouT=Cj8rfdBMzFrQ=M()_KUGRrSRt zf`&8X*k@&`EG32OpQd7u{w^|CAfrn4mW89%Ot ztg#7M?~xp&qr0&lm8_MO-2hJjH&^HNQloy%wj+*1EH`5(>~hsP1kKD47FS|=$Eswv zgLcV!_*NE{L<~ju*Y~|35d>+~q@rc>e;~tmV_QD_(Y@}GBB)|5P-wh>`iKIDWF9J= z`P+=a5;JX#srmCfrt9}M{6U$vjq6rjsmUH>@jDsuR`T3c*wfgX&>0z95u5MlKedfE46^BrG=V&Va2=Fb`7(JwZ3+2Y=SB-7=pjem2lT+L>4Fth;OwRjUJ@OIiD0P-Bm3b0R<0-EtrllhPq^cgf$ar+R8kO8{!G zF5qa_A|rF}2K>0zv-EG;ER}?wPgR*;&;c61PX1e0zyD_omCrCwLr`nl-t~PAU?P!7 zV)^IK*O}cF4?t!&d?ea>I+dC3uaZpOc3eQz;dTSH{l_(P`$zzYo`X35`_XhO{EXsD zBN@9KA=n+G=I`%M>Vhi(q&+YlnWzq}ajs^w;yT&vcm{dl%t>{zfp7avDIX{ponTxxt}U4qZ+@mpA@@k(C_B)TL7Fvptz~yjvmn9c{wGBKFc)Mlm$~ zLDHj-9BWd$MJql7=zPXY2t(RU{*egVEWhGIyn-~dt?lYqxAaaXAM=R~`oma| z1ibX?W!>V}|LaLZ3;9mECHWR~I)8HlgnzWXTFV!;qqMo&L4M-$`o0$*kU}C1Bs`nXtc$`SWoK>gD*G!kC+ASS2v&dGEb3BVBx59Za#C-_57Avk_~wsoXi3;_*w4u ze?N5fMNxUOT(_EaOouhQ#!cQ+p6vOJa{e=B?cb=(GDc>+CNkA6v%>W0rjTXvIOQkHs;QDiRZBBZJ& zGI#zBkT~hTNC@k;7}wvKzl8694<5lmGp29=i`o`I$TyiFT2pbEg)r6CjCaM(Va(us z#5*vdFV?&y!14iK=tEB!s+S&9b$oHTm6y2(AAkWOS!W4&GI1n=1bCjiTK^&GE8o-L z7dy{Azdoz!w1_aC_MQUb;?R%0wTt!kh)U7u5r$_AruEuM?hYaq>7VZ&^Fci{=dokR zgc}x~#JNJZHN&HyOux|-*4h#+i~;n$(^5JWJEWoi`e`lt0Vj54$x4m04|l=e$^-7i zg{8+V1>FboeHZ(bBye^|(<{@*pt*n||N0?Dw?=sP9Ch$m%rRpu#0Kkse!Z3WHu>8! zU@)7@aX|YqhXO?w%D>WtZjibUaC_k9r&bj{CwI! zaL)ea3ilZqjV9GGzrlsPs~l14QC0eWdTM0p<#ZaA4wtHa?zDBc9sK2M8U`ZY>kSO` z(bQ9hZz`H9ZP#i??6956uv*B-T#!j8WYVshBe`tv(s*176&>mypm0C!=n+|o=m;HrW;ZH_SlNvhOniA`Iws{>}+VSzC!#z9mL2sQ3FSYh} zL><%6TR&d=O3Rv-h;|R3s)EJ7^8;q$whBjXMR>Nt5hgqJ-PMaX5%NQAuK6D^dSHgT zFL_8uHQsc-sLBY%1Myt7x$9zmWjTb8)LA6i?N+PRk(t-5QUnp21j4 z=-2}3c8pZx|3PpffXu74j!j&Q&qXep1%@|l2-2QQolL)@x>FZl(7{MEgXfo`R z@Iq6nJ)|5D`#Y(?rCh6Anqk=!8}qnzxm=~g(O1TrIQ_@ym#EHn>Y#^#A?=-=gc2EH zneG~sV5jj~MbE@PVeG6+L`oUf&NA6C^ z9*#qx*H;p(*FVe;ST?GU5mJeI%BmOV)S|1`tyKYL`SW)-03+We(+4K$H6P>|qE`3l z=dEoYJ7(f(amD85ToSB=$$gM38K+4D_zP;zlQy|C+0jS{YQ<1YO`9jZ+87l7(Mku| zTYt!P;$mkm@>iUl$@vO51`Vk;)*3x6@vHCT>!Nu3q^XLP352#kfaq!vIto^zn#HzP%>YHFsnymMWcF$)=jAmaLVAsV;2gB3g**wrxdi+`K?fPtPmX zaxz0>DW29XmS9E#4xhAZ2EfK|g3Sx=ySuv?UQcr*!qmrWzpuA~_yqt&$vyO_BaXn0 z#fS%p+`odlq#psy&8nEL*Cm#J`Eo-v?rOU6$yCwb|52+k z&M0lh9~@Hz>aiaptmdSr2&izd^*}Hym{n$iibPcn9?45Q-%K`_=nR^$2_dg)cAG4NTrw-Pg>KDps2#38-a0T@xwJ!P_oJafl3ml z_ zuG<4@l@q;Fe<5Xb&hRNBBEqs~A9DG<@^lN06%Q;z!@|hqoED$1kUME)^Okb8lsB%7 zf$5%)7^3yQh0DAtuXEEU)VPG{3Pi)qpZQKy^^~%L0RJgJLGTWW9c0=JA>5wPjGzSz zD^^ypY|;s=f==5P{y&lNXoP+-Fdc|$H@j8nW36b4U)WEwsw_904TOM(>L>oJ&XveY z#sy}#OW)BCK7;!}6j`NwQ&%MnrJk!_phZiRVd(v>_<>_y`LxQZ9@=Sss4$|qjVcZ6 z#2XY@pMogjhMLEGSOru;akLe!`}ospd=+P2Qh#(PT^CdO^=mhC3wj+NH{u@W<^A_V z{VnV*gZw(9+ZTmermScE1Zx*p*BRsZRc2{1Fq)qF==!(g7XW;r&=#{4oGT&-&Z%;) z@_sq3e6Ksvo14@KIr-w;4SX@!<1^Q*&=*&ufB0}0F|0F?V@WKakMWZw`6Yc{%X}ju zBH)g*Ozm&{SIPn|v*hqCGh6;2El{MWc0eSU@MzK!`FI{Up3aQ1H0jrNU;Nc)v9q9T zf~rpmkePz~MZ(pvV@EE99x(~Ml=5_o?0^XWuujR4UAmfsSSGIl3Jq~w_Hu&!jgNFx z&zx8l|0nRK2jeUaq)leAYq)wiZ99aA`8nRJZ0KP>)TpmWAgtHGOhYhZ6?ci~CCGaZ z%)4vYjaEr-9O7fYoaKg~hUcKJ5vtu?Y;RqWzvo{b9<=hT@d7UDW3*#;KB)*`V~BbH z;W+OeliT69mTMIa_hn%l%F{DRUUQ;1)ucC#Uc9b!G@sEk7WJpQjL!_BSy+b5MY^LM zasz$>{fqEk=wPn2I!6U~@qephja3*;aZ2{2uWsP!c#AF=-$kUx-_)aDv<#)kl(IW~ z(e;C>?xfq_h=RlhrEpHGNdW4`jc>&DyN+LH5?01Wfn$&WXdnia&p9!Z!tR1h6F}t1 zjBuhFcFG6HSdE?Vt%8;X{{eYP+5nz94vfC$*Phu)3#G2Cg(R3qML2^9c5(_}a?)17 z)_@D#i@BaPF`RXlCfK7VKtnrcW@h-?Ou-us{{fHLBH;q|&4*MygzyJwIK3-;^AcLYFQdwhj76|Vwsd$#V8lKn)O)!;! zZsFg(=n?<(P}R60cJ+zROFYg0!uj}g{uXCcgg$aLm1mjFS>}V<;7`|2p$`9}?cKuZ zA&`}z{`;e^*qzJu-RFz3--i_eG##9~0Pym_U<*tzhbk=LP>~P7kTQCH5RN8sj%jSp z7;yVv75c1C@u4UIMJCC*!NTLV{V3M@z9R+TPLL|F(f&6b6E8?1w~l)n)s9<^L zLhV?sxw)PWO&jdM!;M{;@D|Yq3h8}iS9pEleJc{PM@f>N zXSwso;aj!v{fnn4XW4k3uTQ(bHD1ZhQbZH1KTSTmZhLqw(D;)#Pl`7KS>(5%@}Xfl z0Mb8s&TD*g3B;L$kaI=IOoC{mzmZZg00mf}VnID3C-!4>4YUCy+U_^>mF@g>mR=Fc z<+(KO6O8$QK^i*nMD_LXjaU(o5#x8C`6mJ7JXco~Sb1RPWe;lYng(&FICwbX8+-Z9 zl#0p6`ceMp%dWv+T!^Q~hUvnfso1pk`z7P(>h9MMZ^(9&X;lbO&mV z`lDUU*48+fro}x&L628qGAfYaa^8&W@vhyk7y}&`+n0Pchvzn`SzHx>SmqN)$>31qu3ArHkadR^(4yb;VVp=T$PU<%iD=~B*Xu> z;51E7`Ab0bUR9{S(#8G-HS7d_TpHO;j-v)Y(|tkesmVyw-H1H}VMu>)Vn~D<+pzVg z5RsP+iaM`{yf=Dz>iB)gN#NhEPd*F!skq+!$nAY1Hk}{Fer3D=s2nBvd@5Z%Txf6% zK)9d877vRp!ivl9XI}OblG;_;(;Kn9*#)w;@$Khh+O$=_X={E7XnGKW&UavlA6@n{ z^ef&M3CJq_mM#FD0EnyrjNT0$FfE?caB;hSS0m!-CSs${$abF4m`2<+i4F&4TGrRf)M=s zwf`zqOBHN$m{wN>*B{5X1fJ@3s?~C1)?PzEjSH+RQ2EQ)7B-xYZV}TsrsY&58au=T zp|)W;R|aadvrpwxx&ljJOel^6=UDi#GVI)Ju$G(T0F&4HyjqB)?XZhUe@gA7?`aKJ8Icc7KT2Kk^s{}fc=tx1e$DpOwD7L_d$OPwyhit;+I$tnJ+!>X|mRn|0?D46Qpd9av^)_ zJAZhFW`*P5z8eE#9&^A4tb1VBxTj8=a>;#Z2$GcaT=NS6<3wL!`XEp@|AC@%016l@ ziN!QnSQvvCt6|~C+_`fn(XC*Jl9SK5kkGj2b`Iq);=1?aEFdRq0A&E_2K3hLaxrh5 z40@J(cg?jJ|A>e_BJOVgAIykfk5vOi&F`#GrRO zFnvvOM*DWWg={S|NwiYK{BARmV@c`u))uH%aFSdRG?;M;F`u*XYdFy*BHIpai!F1w zSlZiUVJ|0%iE;!r$t zPajk;*fzZ?%_ggz3eV98kmcZV9)*LyGC*GFp~GAUXX+p)MR~n#GnUZkCzcfudCcENjZ1o5j${YaGfn4P20mOQ_tX5Da?deH{;Ve*{L@4Oz zJL?hD7R0)@y>@ZrCyU6A8Ca?(SnUFOTP78Y%@>UVmyRx35VGzA=WYP~$(Z_S%^uEv zcSUuwK2ev*C0G@F;0)Dy&vYB0^l%PTtvfl+2Vyg9#IpC1Nzn!G=X!;7 zY^68Rn8}a*(CeRY^uoiWiN8WH*7A{#Pp{w?zmvF4uPGXcv(wC{7^lbUI1B>apdWAz zz~w*C08VTjd}}N)<<>YpCPAbO3;Y0R2G=9l+n-R;D70x$l4J}h+OAx2I0S$jS1%G) z*B+KD#OIfKC88BlS&)WlA$kZF5Tc>15Rhh2HkrM`2c>$xyRU}e^uEXB^SCq$iqrx~ zf*U?HP~O9BbW~r&EvBbv+Qeg5-?^hB^4S59R;CipKo|pnyhtCmiOdbqyM-M9dEO>t zVXBZ@Z*N`iBmwNwYF%@Gpf`3IgiM|~;s~hb_ti_F!ENGc!JnYrDo=syGxHC^J^{T} z;@xfib$}*%+Bvslcpz?P%Y0MGy7C~At^-E{OAn|RBf(^<`j!^6Z(4&a!T5?-Nisof z#HdbysA;0iOwgn1aaNFD5i-IgO4iE+ER7RQl=*5E>ze%(EP+)_6>tz@TrZZl(G*0P zWZaR}0}iWziv@BdOO{aPtMt41?(-G()pIQ-Lox{;tA8f|r8clIuk2CJl?g0MZZZMm z3iUNW?N_vEVC^C(A-n@e{UA-zHw}9so7M^{5B=nSz75PspWPhIl-ei%+5r$lufKw) z)7Z{c*}&KIa^Fr9_j~vT)|*X~L5F<_A!+*rs!42QDECW|IiPOfYW!*K#ol7V;;h$) znO$eP2A0^|SIPPE6^MmxZ}||9YS4@8)=iva+O`eg#9ce9repGFCSAcVDMiF%Ct&oVpK#Yky#-51oM!l1+n?EzkR4>mFIo{hpDJJ zU)hX84_j;2TT~F@29wYWZMdd#X<*fyU63!E|B827xp1PeK-z;yJP_d9{6>2N+JBAWa@wP!$ zIuImzN|vmD5i%KLl1VYuTj;shPSh-$3}Z@L(7tHPWSMGsO(-*DVkhPXGsrTe6lNue zHq6#rGh>C^@gh%YzAjdB36x!BvF**K3B*_qDdIe-OROABhW(@%$O7hbGk?Dqk98JoMK2_?=yGy*#Rc(F} zIKFZCo<-X5cfHrEXi#dO9)gSlO3s5Zf(bsPY&`uQXkgdlB+)R!gW-{T<^$R(l%m(T zSt^zbCrk5zL5R`;%Z z7oBMnO(hkkC9z4e63&UeGKbP8R8V5EVw<_Wp8lm5W1CqhBf&yk-Vhko_Ud7JM!aC5 zkOq*$n2v}SFswudc%ra~IyYpU&Q2%}7|Sc9?k}j?u@pdINC>NK?y;P4Ew%mJtABU$ zM3&B?YPt2l%xZvY`O!jOztjQOaPY9Jsx2x8&pnmrMhO6UGQRlM*yjAPuSVQf(|XrR zGU!P}|HNe#&q{07%d$tv9;H6a?uc)#-)4LRd%VFjq8{nZH#4FAwPOJya*A(y8?G!a z#xcvpN4SILUe79?PjRqHk=hhN6HSx9mt;~Vf6M?ik}|f|7gkk5(UzD~fXR=ofvq3R z0dilYDnu=_i$-HiU@Xz?i0nCsOmttoMyKD3`mgt0Gg0GTe`wFhBF0K0r~vTW+i1~y zF0?lo9Oz2jC|;mb0+}vS)_2TI4NTN9B=ul+BIZ88IWl#!zvA<>~gm~1vH_FagG|YkhL09Msc6H1f!vSSeHN-jBi5t?B!{u z9LAXK05hhda*1DVS-Q5haSEdc&5c!W4_7(=M~_c*6jVFzm-EAp|EQAhLvh~zrXk(Z zdoD3=?O+<%H(@RkQ$5=oTR^nwVpL*&@@x?AtU!zw_8T!HPP1io78neQXU~*IM&HSB z23|D^2$Rflvbi?pJ&m3M9n5q1@|d^zcJ1aD(DHlrO-d*!G`h^U1sD zNNL3lCL;FwNCAbYFSyG%D&tK^@i19etmHK;R#*ShAm5i=9x-4N@trt99@1b+3#~*3 zOv^h5dS5uryss@O6+Dtf@ZjeLW#?R)a1GqH+FhshvL}=2oo%dLO3@?#j`_i~7LYMWpnva{_4l1XQmdx~N=OBuB;NfhA@|u}P1P{~;%4wo~1QCR17$ zyeS6-ljWf4zumEevR=IyoaVi`{96@o^OO#thp(&AbH;?2h@v+!YRRe}J4V|UsHs-b zZ?x`$@9F19++ZwV5i$>FnFEy@FA@j#s@%QXXcY#b%Gwen74?HkNsTjrT~TDgjNl}S zC;BTNC|VcfRA+t|s82Q5)BhZhjxz^SwGxCF@R=soJM;`$LXGe^2H>Ab->?VJ8L|5U z9TUJTumFST&WA)YeJo~M)D`N*F^`bgy8vfMbC01y13EN(BQP@A=yY>v(_VerxeJdNRd7>>YxsV$wv3Dt%n6q*> zmg#3s2vg#MmuW6c&AvINJSEkax!n5)gQ+v7#Y`4hy12i+YD{y`8k3O^h-BaNjD)A% ze=0`|QtS$Z(Ui|H?7awr``Zv87qinuTjAjel#+lP)p@?vc}%n2SX7KIErLJbySg$HhE9s=e5K<0DCmV)^XX^V zR)wKq5fcP&xHHHoqPkdlDrf9wFn`vAF^I_xuTTtYWN7Zh&TgCowr7kGcHMX~yfLWjY1O#Wz9E>VI8KOGXE>rSV*j;?zyC9Hf0WcQ4$B5Z7G_HPve z!nuMSgu-iH&Caw;i*0}l3yX+r5XOg9LI)Ne(=-TNhr1&z-9BCE?yv1bZMCUZ zBVfw~!n|8V6HD_>8wH#YP0jSmH>_vLin~idvJ3lwap|Hb1QgZ^O-!3fD9?hW+;*+~&F|mbBTe#RD@Vn-BOlH!+{iEjSw0KjX1bUHM8?%FRZi)Iue<#nN%xc#3pd zUs}VTm(7iQll)mR#G9DR`o^`w;f*b3>b`9~IOF)`X_R2ty5wHlg$ni5;2QPNE#fT- zKc{Tu%v2^MY|ypELlRmph?o(TP>k~51|q`YTX=ou0Y1uB(sPf6|;Zd z6Su|_(KUrMCb2;%Vq^R7p{y{WkjG=Wc0olonyB$F!v!)PB}(^8?~JPqv@nJi^kU5r z3<`-R4tE*45aHq4zbVl4CC)Z8?AN^-Vx!;7y0fV7J6p}q7&KYU|IlBXD*8^DjOD`H zjK92=%Ielv?f4t(0b2*D$x{Mp+FO}mNfAHqy68@+TFu76sFLvF1x#E|=y6n<5G8AU zF(xZFTNty}WCmdt^fCLI*al-5oN(m0-T1&zpXmlVO~?O%clpHOt=NV_b9n#XFlyOJ z@_9jY&<7bSY`Sii_Q|G`-zKGmOT}UO6SQ~Y8D~E2mwx#fu_@#%P4X=?3sW$kQIIuM zFQ&*u<1fhcgj+BQA=m~g8>ne3JAoxh8E9X8AId7#Qur$D0U_pXkr7QFm&YxMhx?k| zf+9avUlT=>qMV=GNoQO-EfSF*te>{-f(U7FZ1@i{d3J(3J%Or;QIGE(&qR1)84;Hk z-M+a66@D}~H@D&%fH!zw-QpQ~5#S+nxZ@m)RwFCKLD>P>Uy}qN4DM(BRKoUXmQRjv z4mPgIUqzM*no?LA^CKAKQE6yeO&rnL_Em(iqI6}q+r=MQCa>NW^jJJ?4O?<4GXL>LCMM(IyNQ-Gpt3$%hDD!-RFq-!}W6%N@xvO z89&)EH=mNmA{Y1vTp+SwCB54ubHX8VB0wCVFMcH=3s(Uu+%g6j|0YLvy3ZP5khsuIo@ zh`I zHy@-gk%T@K6o{0*Im`Nd{Z&lbaEDQ_7%n=gW zEzOus*gVyFLEEhHM649HfJSp%-i&GK-l&%qL~CHpu%x1U57Gr^n7|C-A(*Z;r<894 zGt>|ujKh9>0P{@ZKpbRLGgcRKRIs3^8d>cj-uUGdz{Bi)z1-=Avkr4wI-WFM zIiEj?na-Loe@AoQ1=%{knN~&#H&~cJrlpYSG*vCKf^ zGv8vXtQp#ekx4XwmQlSgZMmN*GA>DGGFevk6JAPyDR%yuJF% zMn&MeV z4)bGvfW=PL%xU|T8qfWW_(kxf{6E+Te3Ir{?t_o$CeWO!8{%-0$ZxKdcowm?(4uhx z7e>8O`o`Je7@Ft6lMbah>G2q(bD;3Jp z_Qd+rra96NDx&EzPv1ayfQ3wH%qm}`uR~9$hdtjFXVK+j7=U6`0P9xxyu4j~cP4*+ zvkrT&$sl&x#-Z7BP@JOjx?Me6=3WWvGu^CKJq-By|5}(Gw}8vjEf1F8oBL!DF;Kl0 zW&TF7E2M!n~Yffx^(ZIMZ$XAIt#iHNzuO1r)!C44edN*$TT z02y*7WH@+(vy5EHZxxm_qPLNh4>t`P+-U5e$KZgJP7!BL82+LIj%Fk)L*y^FwBC&6al~3 zKA(Y52CJEaj1W)NJmtgdE*?%{nVxsgFc$#kJ2GH{I+q?ju0kDbJKXr8v z2uuFk4v%3R^{FW&M-BQR-1mr>Hy@1tttU7jAB~pwH0yJCTbczTiaG8?3sARQS|KN~ z_fT?GtguGzGqb>V`mO%jKHrl5DqFck9D6?3`9PwccRuxGZ*NfXIOLVb(?1vUuoez9ZEq@*_UWs=A?FOE_u;i7rKe=s}oJ#*ezV8KiH3wdq z`nkCOJRn*Lcr;k0QMS2Ea3{bNyNw?7L)Uj+P|Hk;qlRAPqv(KyQ&m$uwi%1kT(V@# zKjIGkFgg$XbvavGeDv!YQWNzv@T_ar@<&!Sv?i@t^3&P7046Zwq~LjA=aAw3YZ}6R zGflFy#D(bR=UbRz9dBam%`?Wg9w0|KBN&c%69CrI-6t#=BwYKWxO@OGQdk4p%+e=E z4q$*E{E&=V+jDdQ1`wI|_?MJkt^Wh?=xT#j4}g*D*jOPzW*o5w78<_G>G=zLxPJsM z?EY(zZ86vGNVKT83E>aow!`J;)j>~R!R{_ejen<_Ifbr1TcHVf5U+)N3%VZGDmA{& z^PKt<;H+OC?QZjv@lX>Jg08{GwmUiu$zpC$H(x9+gK1iZcM-v0Fp`#tn_txUO%Xqc zOfFHb*Z^4q0SrHWK9XVywpdheb)zO$vjmpxd0xKu2`mh+0hqKHs@z?u1G0YM4~Mrb zsf!f|&U2VQQUQ?XOtB;&W972{g%IjR-S*MtO^uBVzHUL;O|!g$0%jnfVh)lHJSCNT zM9ApIG-cq{_Hpdb)g-ALuU`{4q6PffzI$`Qqa$d*4A6B>+N(J)y`pnLq_++AN#<=&=IyDCa8Bw|zX#fW#p zoJQG<@zBnephtu;?+S6%av+u~`+iQVJvZup^b^*&Ecp~LdyM1V8kKgzSJv&@1PBGL ztria_?or2{E-gJkFYZ3qIna_mMnx7&3DvPlx<9X24>u$m5YcSn<~nVJveDmm6%UEq zbv+N3%HFDAEnc|sPqzCQB|-4=DCAgba3PVv;meOb6eu^bRI4$!{@}>Vj-QC{aodj{ zyDhjknD_j~H6Zk^($Wvey&(6~eiNFl%HPuLYls|aC=>_tN6q-wxTU}FN88lt?|Qtg zz=mq|k{t~AyZpjl%9n5Sl>dRIPLsroOQHYEz0i+JRL3xAr*>K!4qkCobq2aIdXd+A zZOKrze8PXVnDGtI9-6W$V}EBqz@&0$iH(=rru&KpK*51Fb&7zfq!NbDi~Y#iMPje@ zfgn^Nh%JWQf@}QJ17>nbY{`89m^hvn0DdOG&U(laj7Zi>%#425j#2_ps!Nma5Nz#w zAn{T3<`JVs68!wj(kH*=1i7QNdi;u6b^v;JG(W(d`RK3G2nM8@;2B>(XqeEb*Ia!B zU#6Vzo)MysmAomQl3QA!z>X0Qy-&WeGhY6TTJFGj^Egg^()i8$Z8WVxi_BA2hp~IG zQTF0D z*u1Hi-XzX@aPTd0=xs=N0$?w26DPrFG#Zot?U6DJ<>{#-)y^VjmALbBV|4CRrsV1Q=+R=Zdy(8UTtJquOs3h}rtb~XqZM;G98M1s zFrTgqI&pXM=R5P3*Z|itEx>@kK%fCGoOOZE7iv+QR=lRmwcoif|LuD*+T zsPhj1!u(ceJ>q2r%Pmy*VV;ZIRZwF2hWRHP>G!cB!y>0_+dk{uZw7q;x1EMW)-60G z5A2|8e5<(PUCS|R_EYnvxA^U#TQGR21d z2;e3XIcDQ(sYs`?bqBKUgG`YwQXD@VjcVw4jx}lQEr!>ZJ(wCisOHjV&5*1u-mZxe zPxVNIXG_Al1lec3qEr6V-Up14pl3`d?A{;ecoLF0fDDS;Kh)jm0(=CcGC` zHw*S6@C`e^0nc@Wq0T)R2;UH((PUHDB$}XLc4p%&(f5XLdbN8W=4=4`5MI^B>8lEt zENCPD4`c5E)YKb&i>e5yG<&FmA|O(N^p1$qi-1ZGBGP*=fuJD0DZL{dr1wtfh?G#1 zP=j;`5PE=6-of90?tSmgoq3O8m<*G0&R6!g_u6Z%JpUP2%9_s7C{BiPh0L{X2;fB> zl|GevrDmvqxLu8qd!Fp}tdzM2jHh=#hWuHkjT2C${C4^XP!$3)WgxaW%<~3WIRiQ0 zi!ffyvqp2FD%HQOZ5gQa-*jzH3KPL1iv zv+9^Cgr?)#f}1`ArF3R>K4aA z^^>nz+Ew4*_yIJw58>`RnKq2|o3Cws2KGQL761l6d>O|t1*5AjhnrJoQ*x1ysy7b~ zT&5&_&YNuF2b7*AD?JX6if59#xW}ftc&Rpl0#$)eJn$DF?g6r6KpvtsK5q#ypS-uG zMW$LV8C0c3*-m)?n<>LM8XpTNptVXT56g{v97`9X`tl7l2VcZ>)Wm-#+M2v9m9DsI zQ>$InwA^XZ+pvPq-Vh4~{`WDTC(Y7-_~~~qF<{e#-0T8o9njy1qfmnWqiIHs;sCaK zp#?FEIq{+85-PXe^6f)+zh5Y`o?+gE4)1bS*Hz(S>Oz2v6m~GV6qe}AT#{a5f$TL{ z-I6{c^iZU6AHjgwlDdpct%GIJ(*JjL(;tBM_RMP5{68&Xw7%s*{gCA?OMsmQU!vyL zulqQ~VJ8f+B#-9?`mZZ1D>j7fza4-h#y#^(7N1@H(!;4Z0q9_wgxJ0)caMRiK-Kvq zzGOxV2JVT>OD{g%3hMJtxm5T|12i@V5!Flbs)@NnFD;a}LkP`lkEZt>wf6yu{0-<)zDi1g{j&Qjlk3 z{=r8oiD zXCMy((1!X+fhC7{aj8v+3I3V2o2L=_VBi!H*?s%026Q248JIe7FG?X}Q*h%1Ao|sP zP;-d!y74caRvRKMIEX$rJavLcapVB2QFgrJD8sDY&BaWn@Ju)BAsme*NbkNDPTTO1 z=9j@8Nf(bd58rq=&|f!Wz$XDjtlY_6FCRtY4_6BlD5(!U8Q}L$QX7PDfxVOIhLP#P za!zd!A;|S2;^FcSEALBJYN5wsaNuRi%oj&fv+>GTJMi9ax@@?;^b4=aj=wt9ho^dl z2qDFDeW3hrXmiXO2B+V<9{yoP7L9$K{yMAtK7&OqDpM(ma`SM&)al~H3RANJFa;ca zT7e8~8rpkGR4=!E$(3sa>?00=?t)_}-ycYbiIfxI71N^Wky_id#0AW$1i)tI#sm73 zOWP805@2()I+&C)FGO7w#XA^W3OJ}9iJMT z!h^JZugMXgKrCIcyF$D}2XA(jNU(Afg%u~#udz;ig*7^jl3DeV*Zclc;hA>vNlPV! zo;OZ0PdGG}%|JHezXTiJZlNJDDs3FLgfBw{Fn0V&ec_(_R+5%)U*5TtG=mkcNu*;ktFg1(O$Z{J8DsPpBp%d7o^aqf*6A%lWl`nYl{!V%TRkVrAX~C z7-p-eD>50Fc}dV&%_v~=wmd-gtavayo6)=Wz&2_I#9oK{_%urv_my-oJ?#- zW^%|*Fiww7Xg-|;b~-J%AwZ|Jd|14t0;c_e6G|dmeq2gpZ)Ge%1EZd47&X9qI=rFA zL}EYTGuz})k;`q;8lVOcDCmXSPS%wy_#x6xwqtbt*g}MKau1pqI;Ro(o5js2X7ZKp zqW~m^1rmP>NcQCZ1vwxiKn(+_JD_&J$5&CyWrX+S$X3utet-&ZrZiolgOmJF4z^VI zvA7tEHgC9(2p7CZOqhvEOxN1;bKf#o<)88WX(4;}tVUfgX!-Nb&(p>5g)~$V_@MNm zA(MHn(B#a~K(MK|$cei1gsE}5nc{v|v`XoCgM}!e*Zrj9M%2Y&6SCV1!j*K<6|XXj z=7~+tvNiImc8_V!MjN5Xg=w_)uks{PAUhyvYi@r??H$Y{)*0oy$~}`NB9sPp)yi_u zeDT^i0<59LS^%5|m6^84iKx^eaZRcT>_rHxzLAgVxM3ESuP~rjUuZfd{Y`ZDhh3=XLQKVM4RFJl>_bqg|zkXQX zy4sGFA@fD2|COvtLEX~s@DkK5JI|dbM(D}9;S{|H+a)&X*9&(14>LV1shuZNv5nhj zz-@#@8WfVxAIF2>q(6$>4?3m69->yB$!1kB$7!64P=78h?3Ae{t?0(#O32Q_{Lddv z`t!AVLeS<9Le@P>F*_|*(r>Mv7J3dxepnEYl1fMxyDf!QLEeDQxbo(ZH$j9^(>Ro6 zugvVw2I9^POTN&89AZb-w)bt8pM#m5EzF01DwOK5A^hZ%bJK)=L@7Ojw=s9yWuKX^ zHmpa>a8kPwQi|x3YcRb-9C#PiKWBTGgV& zQa@zX3|STnuEaGZVJwPW8;bMyy1T7*LJXQDK`N9)QfVFsr@9hp{o~7A*FUIg}?P#fCaOuciD^DX2!&$|-y)9BIY+{UE%KUiH*VB=||m9_V_nG1iu2eStJ} zP}VUUgrMv=zqjswg4PbAEk+Kw=l6z~@>}mk$ZxR;E2{c+v&h-&dr<8{bRqt6Q-4SP zmkME;Ab*)yPe1`_(@EW;q$0Nqg+a-}ZoNgoA(dAtGSpOSCsUW#Wp4xQVC*EWGZiYi z{JD21cOp?srpXm5Fj$DSb{2IwZgX{$fZdqFzINiRGzY0=XD$?1ySK-a7mm)DBjb|> zx`cJ?Z6`v_l6S0VhvfyM-q#9CywJ(S9*BO$6cO(wFOhY)m-8U4#+FYOHvEeZC-t2S z`Eg;496gny7=5k=jpi4IR7t~c{XDZ0@B2i+(AF*7=hx>c=1<-mp6V8lLu{(;UdM;> zQL2Qsx!)BBPME_W_Xj*4cE)=)hKQ!^O?c^{scv+ybZVex0HYv>&JUHcL(}l}>emKwaa+Vahaz1AHyR#cpEy3r}m{zKj z0;myMZ4c|LcfQP?tQLN6r?7K}J-quwLY9|DJb8~MA0#1b4pi{bp?GV{#16;?+O0hd+Pjk;K(c;LvaS>IJ&If z>F$%l-oCC<7R~qI2A4Th$D)HPdQ}W}Cr)9uUBj)h3_{K#2on>Hi*%Qfp0kNrC{*t6aTl!F1bC!;TzZ z=yf*eJWJ!3gg|(2h3RQuWIS{9FX3WjczyTo^t2Oa>(^;ch$8-S7OE5au+p3$YnkA$y9InQ4XjwM`{kCG&NPxx42aPw|(*;BLL}TSk?DW(R4f)NW2~dAh~X6R z+&33Z`_OkO1Bi!~#PO*M2DX|Qc2&6C{>K!MQgXEJjFmtU1I6;!ORzN!>kD+;-Y)&W z)NPW^tKV(tCFTzaV9eSy`~9bU9~Ov0_4U#OY0fEMD(LmgPJV+9lGW#uCR&$g^Cqm zNvc$u$b;E~Qr`tlbU6S~IZQ_b`xJ7Myy{e>7#Xp6X+Z;VEqxg;u{(XZ!AGDVIJAK( zi4@Vn>10spRksdEj~$6LmuSYr?)Uj(limiF4;!d+AV0fv&fiW<$^%*V)BoVKivN-G z4C9t|XWRc5s@7m8=w3L-8xPPc{3SFWvZ@mHqNoItZuR6`jSl&`lQ&913wzJ80@QAa zpV-0<21tL7C(rMLu4dgd1aIJ!Q||j)*!3fDQ|P+2o>C%GCo%$3%dlkL2>>E^8hwxM ztlnfNeO%>PxRqb+z1)>j7^ckf208PvVo4==JD4XQQE;Ua-cR_mG{kvyE zjHj25h*0EoM3 zU|6Z=P~TMh)1jA)9tG*1+?ke?ew&_Nh%23Yu2sRI$eAw?h5u@`6H_*|b85@KL$=;4 zv#YxsVXx1a#MTB>6s}{?8F$SPSsRbbyY&3Z9yq#L)%28+SLY%W#yCLf$HPs`5U|sa zj&!4nIIsTc3GN35Q|Cb^)$79J3Ypt^*I4_~dk>#A4@?fZ4uD}K^k=z9Y(NG(BhZB8 zxpyjraj5lRKJxw)`LX^YHCtic$oDfaq{(~=oBEltIh$3r zf-c2QP;tlVfG3SIpf`f4g~s~rp6`~`;q>vb$CRY|_D>r-YwN{Xtq2IFo~o&lD|1yjuIJ+BUWRCH88&^w-w@PGx2ZB@5Jl45)B1MU zPZ+8;p9EbWI2sL-{G-~lH$O52DF)#v>Gw~+n6(09nmabtd{7oeH+KT#>OJQxJvnUu z3>L0rvXqQGny}-QE?V{bZ+*#@4Ha<>jN>;C_Fu2uRBp31LoYhuqT86`JXgzbz=wN-Z1RC0(|2!cvHK)xqkRkYDBOW({fgqQ zXa#)3>FmU1YRl8+_cUv;aqP-FCXpXlj_gwFW5gw#+h@m}OD5 zmp~5GmS5=iX6b;B_zTQ;l)j!`rHx3BcF{qpCjRti65Sjt%a!QX1rxY=H|X1N6%UN< zX%ZPL)Zbe5c8BeI!z3VL@tHcwYGSk-@5D(gCZbOvuLF&GLJdI$ zE>Redw2rA6ATu7#d<4HctPqkRJT^6IdFb3Yld+;W*<7`-vQEO}`YAENKYf_Dpv9xISKV@C?s7u@!gTmH7sRyLlxsMUlNcIgqh5#0rN zwXK{5fioqBrSoK^uqFljigsGoQW8S*(ZJjhn>4lA71q&?Bb_qC8Gj96yJpR2@;FQw z`zW=fK22}ylbkTy1n|VxZ?YbMLU^>S)*TQli+eK~aT(h8N&5BrL~Xu|8udF;FT>ne znEBhJx(f;7qGgb}dDtobwhwAQfq6UP$Z`qLW&m<@)`mrvuqaf1_{#qWzo1}4jQl@< zw#w~Ml}NyQd^_YVc#AJN>itV8j|bWDO{8~yI85(-XOfR2JzJF8+540(1X%I{w@QFX zz=V*c)6sJ zK5FmrwvYkAl?`a2*BqLe7!252ig3Uw;*A*#ITWuv1U@~3ywJ+J=<0P#uRo%Ce5x9{=6=b6%bsGviu@Up20)U`8RVkZ`0g2+SNNY`ANEnDtSt8IsZE;4Bh zspEYG!9mwEKu1QU3~Ki}K6lKOITmIEQ8Zv2I#a@kdO4wCCp#65a!7Bn_B3?PW&&>I zwV{W~>%!W+1Jsrk2}%sU@bnAc!glOEkh;onHIVlY_Gow zW+ycWP5*}1wQ1zCzYV`(JxflRY1qqbjKPvO0_&nRMt(LVeC5md6muPDzw(OM&gaQU z!_cj+Y9m^s-7Pr{A)X`}xgN`}a_WG;7mtiGciY%L+oMtHMi5xH1>RtHHrd} zv`)>cY%oxE-(_>+qw7)aEKF+`UX3HrVN4<=FHZOBn*q5Ws}$~>fD?jO>z({D8)pSv zT!YJM(o+NKmuo zxYr+=H;;(7lK+6yFyOn?h=Zu<-=7tR_M%T;+8x20fjF)l?paDla^8t?Ekgtih_#!5 ztl8Re08X+nj&LtPyz}0PuKm;=v4T3Qd*TfC;CQ;-#O?GFm=Ce_9i+W!wUW3oGOgMQ zF-W>Tgr1R z-=z7KoD2T0L^aOwo>x@+^K&1B>sxZh4h)aA$o(HlH@qNPtuPad^h%|R>7Azs-|?+c z(}R38zzW_Xg{0i1Vb%E}peDXIQ$)fLut5oA*`^9JoL4=MD;L!#@IGp(qSb7V&TlC^ zPI$Tl&L3ZyAA{Q#CijzNsWFo`D&&6j`CW0Dj1_MvYDwsv?>^T)LF1E5)ndv}o7Vg3 z#{s6#=`R3{{wqS%@6XG>f#GXx^EoT8Jw7ncyyvy;jVqHg8KBz~X~-Twg{u#clELCvNdDhZM5#i4usHU5D;k5K)O{?IYZu_qV#F~*93Wc$Dx( zj@AErebnUGy}?5BosW(!>=|p0oTLzoghUK79lcH6rl^^;C^< zSR;^Tg%Tc30Gbjb2bTn2XM>R|0zcG>Su9VkSt`~Cbi+jh6-Sx!Hl!OwuB9F947>s}cy<+cJg#>qJ&QN;Q3Qgbt{&UT~=s>=n zAl)i9_02KyE$uX>T@7fS5b!?4jgmE&9uzxhds5-*(%7dYT+FA_97(T>lhTW%62mRT zD*mIPTFJ{TGOkZ({~4WUC$m%Cf)Dt7U5c7x`m~eo6s?f?oUG+dnAIL?Gz7Q27FgB4 zMX{lKt6YO7Cx5oOB-{>$@Ae6Ooe!M?nR4^FOb_ zxAuS~edUTiUCa$Mrag`4{+TNUnFY$#n@!+_ft`Wasx5;1*!kP z+BH}y5HB9X8-%?InQQO2s^}XBJGkE?{sKh^z|;JsQ6Be)xU{A(Dz{;|d;B!o=lNb3WAT4et{Q-x;34f02#imo zp5A5=K54)HedvA?QJdeB?8tBHGOv25g@U@aU&g1O0?7-omYnP6)*a7XmmB;u=LS6; z&Sz*^te@R>sL9A3dQ5Fy;JxpUgZRu`e!0h$D|Lb!wHU$n(+`$FsXSnQR3DGiCGMjAI?eeCsu*p34ZFYH*haVxAHN6&?_GOHm z^;D~Un=mV8=j}{Fi9a-4F#0!GCDF*F?wZ>2$?*xn>|_5D9&X`lGe7rFctCZPwkS=j zgtu&5u!SkD7ni=^U+%H)6YqPQM`(?L^Ts0cu%gjfxmxMD_r<^m_ltT3#>^5HA9e++IXeL)OB}l@78)hkh)2wnI$q7)0H^?0S__5(cFg=tt7>^3T8kX3#Tb5X6TB}+TKnuQB{$Ih zInAT3>6XFZ%TW^6c{OT`!FNL<@w-7c958cLIV8iw1z)eff(=l|lK<&@{4VNW}F|U9eM3ZSauraoQDZ6f zvUFpoPK2L(>S3mry2REJUC6@#Ui?@p-xzt*=qP>=` zQ>C*lnF%vSX*wlGf~ogEYX7wv8HK z$Gb~yd{XY)Oa}11L9w+HfPA%f0)R8Ul6rp<(Md9IN3$HP7+*J^_eQf#RJN5YRSLA0 z9Ps^%r0K<1U5nHI3QoDK45m64Z=MX;!JQYA8e4u}Q=EEWRb) zz_7x=5Gw%?iQ`JrrF_y#7zG>!LFQ`ag~=lqBWRVM%vcc@MT6M z`#kF!EsUq8l-YHs5cSnMSDk-id{`51lj8BF>j|>&^t*kC zuVP7}NIv_4#ILo$s%olkMoD@IWk6IFCRt%TBZyZQ&fM|@c-DK7tO|RRxULzN% z4@>$KDa#R!m}GMD{P6A_36@KVuS2N)bJeq~q939|NE$iKYGj#k#Abgrts5`gXQ zC0**Gxp}z{>}jiJ-Lg+Lf>1y9BC38y-ULX%S&X&Z-*iaNs`Gqx8HrjqGO{unWIA3~Wevmm0l{Y)oP?gB-a!!6`y8QgsozalK@XY+8+)jyyQG2u}j|oGf zBX$w5-z|`io4&d5V42n^ieF0qd}BA#GlX0ZHu*ZxSbuIJ**p_E63HzFSz1cm*^q1w zyQtX_OAh1ZUqbQwk=T%{Tv6CDr6i4hwW+DWbj;l0wn$ku8%YzPXGV-1U?0R~;ZXa^ zll=FFtO2W$gXWX|6Ci|nU);S6VEzX2Q}F8>4bxB~)Y2h%$7RALR;MG!2N!R7v!udj z4dzM_-nMka+4VK6u>U%W#^iUfpkrqLi9|1RTFT=_(Lb$p`_T`$#!2ly9x2da5}nf` zXN7Mq$*Kzl=&-Zf4_Tx|xg8{0ir5^|jiKB}5-1m7C?p1rCt^Fu0f!(;<-L7jtN1X6zh!k4TVS3Qe-iatnKcG&9}kn4TFp7}i`8-5rsz9*H<%XfxBF^v zrZ=m(X}nuEE@9nF{$|qL|Bmw- zb3%&B`SGv%X8j8I!y8~{pu|!?CWug&cyn7@#cUcl=?{&{WHI=eSseIu8_TpzZz0HG zxNmwc&>hwB62kb$3z}{j5}scjGOQ*$6oarj8xCRaOrhh~_5hqi-+jJ^{Msf7x-@kP=bvuUAf-87F(BVy+ z=mZjzyUkf*hvX7hy*WWY_!P^~-Or;xcs%ib7q9VvemW#WE#ou))<$U6I|PN-{;GNd z(g~)-cN>R+rJ3-5C8e+ObB;Rq_LD7Ny%Y6|7(Udj!(o3tA4egB35o9d21*;#Fc;{= zYrw4g9r6ZS4|O`qye}hn{zmoQeg?XE% zwh6bDWrnFz>V zldF*`jBfTzuGYbDY$i`xSp-J}di>c1H+y*aOP>@!gEk`Nt;|I$j7c9mxVoA$yWwV4 zP=qsxPu+)%bQP2+xC|>Behjz}!ykC;uMRKJcSMf3ScJ=#4im5fRDc%gJ`Hl!&4hiE z@%$Mmpo1Gt-1rf+;cFoG8D+o8{4cY($dfu_pCHWN64zRd+)2iq=JviIj-ZS^;P zPIYf2&rVlY%r(w5_!+w&EDWrdxPC{2YV9W>pI3xm1&c2q58YK){648ZrcK-S`s$?0 zK}PUwuYr}avQPF_fd0ljzM0YZ&*fxakyBg!I`2E=FwNGLv|Vg9`4+^hzmfEo&PZ5~ zTiHKL5)AT&<2t4>vu*|$L-$I24cW~3HT}Eu)=fX1U%DRrVCL~oj4>8^#?3a))~&o4 zXVzsw*m6lQ0ljK2t~Nt%^lxLgxrBUPyes~cf0t$2qSr@ZHwN}u_?flAGhEQgY_2K4 z#&wlff>mW}zZk&4YDN&+=HBewf6Aiv5cI3PAy0q6kI5W;LQ9Kk8iPmxs?9%C#;HeJ>Bt=?jwT zsvrC!mKZZP!7*py;H5*2+t#U(qhl%8m2;jwt-*x4bg)|TO(xQ{*rS&Co?rjbuD{TO zu4Dl9;o8(to!}8KNv;JQ*A(zGLSTY~Ku)>hmqXTZzu#ZqzYp1uU8|?mRppR2D}+kqUls)x^Q7=p_pE2ioJj-nQ?muN9_|6IT-4+Z@%;JOo1jV;SQa8d9!;3}$iu?1xMe}$Y*y9`g? z9KwQ)(&0g?gbx`99g5r^Kh?5>zKeTv2s(NX<7laDk*wLQ^tbh)8PJnR4TQ~U8fb}w7C@b&r4Th>K%{?5DBLD-3!@u z?ciL-Gk9z>kKp;=?Wcw!m9i8)qQ5=2PAh@B15K`JyhaR_#rX^Ot>%q*Gb0pArui zNu*}D$ysx)C9LSyxAU?y#UG`3G$k^)RV~nqtXbuc68GSvI}k3J`o^D=eTSe_hD?|D zta^hm*vN=RJ}(8S4aPnXf8!?sGxvOvUrqff;!(A5Z>?6J>W z!Ok0viB~Gw|0wgmBTbbVO^|#Lli;AY^`TOYpjkF0I7~d5rmczIApn6Ifg=)j(qum*ebBn4Xc0x!$8 zL%+paXWL#fX1Q_hQBv{iCe3yG4KJ!hZ^A_jr=7~Pg{lJL+>79=on3OFO;zR@1F~xq zN=vx=zorGA8xCP9NA-WSOXRHm3HZzMWP_IOK}KYog{6PT%q=L*3r?v@+xXcVjQ@>W zh~N>Le87AvT9oFHZVD}@i1AS@ecw;#|x-5I4&DQu=`im!p+35C@`y>ywaXZ%` zGFj;M{Tf!vi=SrsetX+9Oi-CQw9-ycmh;Q!Y7ry-k;mR+8wkDG2_?Ds)iLr0KIBid z@a_8a{QhkjQT{dfPX`H?N}57|76SZ4qzT?)p^VM-yy1#_<3H}S(27Py9=ru#13O=T zcXe#;dzF6hlw1$wNWe8bLrmjSRHqj8%Xva`@Hn#u@5u1aJ0lhydY`BgB@q5}bfTep z8ZB8fy*uVCb}xR*DM`NJVEbqzWC2;#Or}Gu+*!#9=99nt)GMm~mnXCpl~$NGl;*}O zn85B{IY}7t!?cD?fw2(8rZsh^^f>&!%JLzi#^UuikHg{u5&A4M^~DTxUS{55#hIHn zVfX&VC9vGc@*=SyI@L)~hj9C;u(h?l~~FkRS7ED@OrGB)j9l37F0d--H!r zu6yr&)nz)BJ}wa=nWO{Gceb&h|63s!!|_%(3qEeOf1cxQc{mnxIA)V*+0V{3M2OdY zUyP1zHuS{3Kjci^oV$udcx)pwotHKz{zT>eM4UA^)o2O9(P-LLqC$vyCZV@CnsG9o9g$d!BAjbW) zhOBaqcI#`;4@fQ9a=?TG#eqKMlm7B$GR3~(>d^ABA+p@8FOGI~Kb()c0+Wm|a&~lb z-*o6ifO9Eb@_$ZXW%dmS**OYvyRW zdxH|>_r|Yz;E3|W_mm&2i%#DWsNUQ4-A#kAPTgzB7|;H5PN5n2pENBU9|HhbO&04= z*|^zgyG1Tk&bHA|&o|wfR)$?3w7&;^6l##HD?d)+mox_Tn8ysJj2U||lT+j~@^Mk)V`F?Vk-A=+Y+5gz-n`46n~`iO8-Jo4ea|nA5nNPvjvJhffH;QRRLg zE5e1h!a9}xGH(I=U|K_Zmb;Pj3tGmXhPf~%IFo7Ff$1AtwWf0S7C+6Q_ZM$eMRa%k z5L6i%3Bn9IlEI2r|i6#U4eTb+>U7eR8Ob7C0((R~j-%r|J zI;Fl5aJ^~T^M5Yq|9Gtk<8rGk&~|cUI1TZmyo=#T`9JD)UPDqy;hn%?iYZYX*Bc0X zc!b!i(J&(sI+JCc4+b4-siB4+yaEJWf^K@7J&oX;faWs3Gc~72I~myT;)AoTtc&!@ zW$PI)ht=iiPiq7o%)HQ*# zKvTkJT)g8o%fYw0hNGi5T#Jbs*AZ`ZsTx0`{!CQhjX)a>1Fixp3(SDpTp7Q|=i6iJ z!%(YV{v_7Rx?-gf?QS>87|C}=+fa+k$KTSj=NH!++)wiquB=iP4PT;Dd-CH&r{F`k zgnTI*$0w|Tk9B4>**b>}RZ1TZ>uTTrrOL zbPr^Jnf?WwaHQKGyX7-&<%w}=z(<5y=8V)I}_p~>-bnXLK z{K9YQC}*`SGH`7mLGrf^$>^;<(zma^W8Y;ye#bBp-T1?IBBRYk{_6f1(F^MN{YF_9 z@di4bLPs`Q^Ou*O27tXkIP15=P2`d^U-8`JjI+!R@8mGe!VDw^%M9lJ{Plwyma*p~ zUu4xuME&Xa#+Mz-A)vuk> zr@?hQp-Rt3wud0+lI}ApIjml$P1vFzl87ozD}whr1M|Y``I~6Jgm;$C*LT&u-&u-B zsdh4*eftG17Uo=VEsy+3Z}JXap4r7_mlM1oU)PW`ac~hUDPVAI7tlmI7i)q;)7{@B ztsq5$Q36`P5q#_(dj_C0NYoVoUT-bwD=xk2I$jE3&U%I&HZ_I(%-So&l3}S7#*Wk4 zy^3j70Vm>lMoe)yp$x}377a`#X@uI7d+55ex7aOo-cKMeyf+2NQ=Ww^I2pqQ4X}Mix~MbD4Ge zC~`FQUZrO?&u(sTZYxErdU>uzySX*we(t~XUq$jj*DaUfWBF=_5`%258l^~Kh*J(5 zS@_QTS@{R+E@t}QtWMuB2G)h^cmyo}4(8TegE>57kT4QsB&xjMUp+rYx1U~h5WOfF zm)?RasQpN;P`DfATyfss)7CbB_jC?Q^^AIR36=k_$86>u_+Jl`UTQ$-QFAoyxj$XO zY25e&(y%;k9>^c!yBg7dje|a9c1UswG`mcLzUKuAFPSVBo4PzAr?^T<^NsaUYrsP; zq~$<<#cL0pK<7}NR3uq`PYrhrkxZaY$4$%q>9DmE=6P3{mEf@+nJm>Zv4fYDjP35(qA1t)ofuQ z&dR9|`^=%J6n_@k;-spSgbr#5HQ~}QX}^loVW$7XxbLdW_}^SHOv3C8I0PQ>e?)~o z<>f!}qpN$pWTvTP!j-=_NDKtyNhCO{b5fb#@tT|%=5%y^O5|f@AArxj5KopEzCTbDL0U} zS#>hlbIucIAfHBNq_qnmNLrcLzfEQnD7dnpqW&ci5KW|Dpn#Fo6%A_s zKFgNnDx)pvGPwY6uH+51iF)$eN)snVmqaEDW`1D5fBJ{9ln$*mp%8@_x|hvdYfj=nrY`ORRT zFb*%7KbSWOYsoFX*hnkBl)tLne){AySHRS4=?D3lYcK2`&M(VL&lG4y+=HryX_qMl~zfWf3;xK+CLH<%i1Q5l4}^ksAg3* z!HaGpj(SlzCvD`$;ACZG@{!EH<$0vIvugt1gP*b>AWGaq>b~knIt-4iJInZPhflMe zJv~p9{58br#CVc-9PHA(@PpdM$x+)y%FGIX?L`oZ0$Z6;wV&6He(jiA<13yqCc4v) zaul7RdIvqji>6R(P(1?xN2! zz;Decq0)WMJsQ#$ujSITwLn#HKR?}cEIELxJ0cbLTJEG@tJFMT6YUR<$wWf+`v`4R zkHRv)&o1VS#F_RaJ{xFSx*MI{yI5P$wQhi1mv=ynerdK!@;XY$8w)?-^|-DQmCmX- z>wbmdjjTREi31Q-87u)!D{|lW`?f=7@vDY3BbtZ&4>1%=?c8zpN5g9Jdf#yAUeNvT zKN%8E{mCQ?cM!Eb6%1YWslkw@W4BGoJ%$M>vXiaB*{)$&Q;TY@V^@oeLC z?=j21=SmcWd0ykO=Ny})a?%N~A-9<(m5=L(W?>K!sEbC(sLQ|il~cnOc*c_yd2j`C za?~#-lTG+Yqt8~SjLlPAAQ-$fxZCxQ?D5p=aD~$k*XkBV7j6i;vXrFpbC&(`51ZsU zzCTg;%q}Ir%OiS)|Gc)`qLAsKNwsLm?-_-witHqYx|)8oc`Xz(bbe2x{!{N6Q}kPmx!4XzrzOUs||w14DeTmk|$@qP`3`08^ULQW+t*_ zlmrfuaj7uNP_3ER%rE&MdOp``yH8)1sc<)%9z{e4XH#iRIW`_*wod+wq!_SHJ073)%Svd5%(4nCEI@$a{; zIRS)f%QouCb^00TU5Vv&sx5K8V9L-rm2#uIS!dI7E1G2OM`T(pVF$lO9eAoAy%zb8 zN)vQ==2qaz%!=PRB|jg?OXD2wkZX>U3pdGh<#@yZ#6@O)T8>mWV#4L`Bo(f^c5 zxpb3OH!rKVm!)smC{;aS%+j%Rd5>&uQpIj$_4Y*X=k$LEyD;$v=6nOLX2qm^VbPN` z;^iqkRTT3ibKP2V;X&`P5;N+Pi~RJ5IPGc!S=gHIgY$yxsm+YzmZE}INQI90MC^+e z^OFE)r@OCf4>6Ji?-Nx#@fe>k@TDR~j`}%<>g=epPGr-!kqOHo#CeC*sf_D@)Y+(% z2_E3HsU9H6T)A*SiibpeAllG{8v=i%^eFNyQGh0*;T+H{j8<=v9S!v!>-|tPu8mPY z3p-#ccmJeML)hNoKIxEmsb~FF66~CnU{_S~jCy$-vrw`YoPYZb#(||QGWLmU3u6CZ zqcUYxNi4}aQ#Uom44eLMF}EhGU_r#}qHPgkFXa%JPc!@v>`r@i9qgQ+=t_`%b6YnC ztppQnU~+fw$J^B^(*F_ZUkto=laWj=3O-cUn#v!eTDK-Idih>on4hjCzwM`kspo~xg82nl?L0RGu3P#cWEAU zvtOviM`fpD?G|+yR9M+97u(+P@M@W+9Y8Eeg~jaGP2^YR>RDL}9N*8(<3T$bI{)6@ zzP|~L??BlPM|ER!9{yjPy>(Pv(bFXwk`NLIfuO--xFvzcCAfQVOK@o19RdM@I|TQ} z8+Q-xK^qA)?hcL1+$O(ozL|M%{&BQrbL&*?+O=y+Q8M|R@hdncuNFj~ zMQ<`?{nWFKY|b?j!`QvFJ#yBs%1z-6&$F<6_;K=% zX~Z0EhHs2?+m&r!Kov6-$F@zjU8>7LVx|5`)!Se08Ue;$1q`7BI7c@%d~VwJxo)rR z`+rrfEL=`ni&#i5XXQd(s->*5^B%s(F4_<8>&@oE1RHNfV9|7k5N?JZuQ5z^jW@ge zbxa+lCLd5=(YOu~Xzpt4v@!0#d7)fqbNwYV7x!LB{{aVCvdrNecG)U3H=!A-`PSjm z-}6rH=PhiO*v3%Pq`9H02J2m|I+Dr``|iQsN7Qbk6|#=i-_pL+nKN#8dVX!$XVTf% zZ6fs~gL=R&#;HV8WEdda?sV%*3ITThWBzmri!WA%`j!ekhVGvUE9_!tSh*}y63*qr ztbLi-Ju1TvCiYls!mJvBM2Di0N-4R=>ezl`*cA!qca4WjnH7$E_FtNXpj@ZzspA*S z;Qk`DU+}!d-T^YmnEw5c$uGtU|Kt+CDAZ&RSCnu!&B6O8g(>$LzQChGptz$e%WWz;5=33`$ ze*|o{_9$+0yzy+iFZ$2*GXL#z8|Z8w4nLXyuX}}aPay*cWgviGwN_YJc%#XO=dP48~T&Evb*5)Z66&f*1tVz~u z?Nh&mc&Ar6);WFer(1UH^#`P}?oE91(_UPdt;Y}bwT&E&Ip=TP@S|o{3PYmYKkB_} z6_p?Gjis}d;SQ3PjKPvi{hVt%q8_vj`SJ)sn+iHI-7*F6-EqC_uh>ak!F#b)mL$!gfYaZ_rPVw9ZgHIo^ZNM} zcJ~uc`&V31JtKjt;o#_ExkrL4sV~g7_47X0j9g;L3Lpng#wnwf?wS*U=S*4JXXA5M z3+LBJSJ+k9&Okl}@BJC*!0&ESyX51z)6>gH3rnq_wNT)38LJNqq(dzC=4Mzl38!`1 z@wfZ2+t(kyKfO~v#T~tZtq_>=$_+ODCN{IZ1)7RQKx@{d-T!0Y3cLU#_Yg@ULIAur zDYKm;R77mk@FSo8MOkQiguv@fosdk~qlevDC)(_?Xdl@Ef7dSTubKnG(sDD+XHBcL)?-csN)I}>>sGUo!#ofZ+16r- z6E}ah53#~>l{BpH`rXhagCZg%YoD9oylD?f|EbK5uEfj|MlC|lG?B%C@nd&GI7Cue zq=toMJ>>gaWF*=uG2(cIK^q~iFem8Del4oc>CUE+sLyokul>6Ra}%SuhJx3HPsH3V z$?nc{3_-M?qA_u-rq{&#tb5|&qT269bDG*~9#Ki&A7-{s&1_NacUmA6-%N)SQ$=(B z`Vcpqn8W$+E{3N;Tq7SiQ3)j^_r&l`M0>{tvB(B1~%UBq^j_6-9M zcN2eJeB9gI_gBA*!d9$t@vBHfsCHGHp9ZkTeEfJ&&*9oLpY*gOU%kL-z(m~2mB0xX zUoBCrNZUWy(RWNKhc3;=6J^2 z%R!Ir&ed6}H>3!gYdzQGlW6EhVk*|$!*T;Vs0o?}Mez4KdYz{Jj=JVQ=zYPk_WIMx zYvd5J0YEgL#}f8k@&@hBgaJKp$r{Hw75`gygbk3$~) zCoN`Ke@}VOp9SIfZwhiU2aDMIr(AHnFyeD{i{OcJ@?*KV<5+Sf`}IuP+tUQl&?$tL z?Jdq@uQ-qMYC37-Ckq&wF7%$&LA1sFPE*%=%8ruw^}1|Box$0)e1?z0h6Y7Kt*_0y zB5DHFecw}bvi~EL(NzjqiKL7h2fIg`4M+ z*mut|loow}u4PzVc?@yCT1~Wl;lK7rg>!KY^!xafm9IJ8!?UOl9(oznP|urUF!8Ev$w~0H{RpB278DV=;hLZo8RT`u>YF<Ro_2W>0*LLiF4-_ z50dN1^VA!CYNYTmSwMe6{r*qD(g{!Ly@ozn; zc=(K=!V%52p5$xZ$!gqq9UPCkC+s_}r2OKJxJQGOinn?)v1mBRIV^;V`lQC$qLhI9 zdu!B-3mPyK6{HpQq)-Vwv)B9v;u$-v>4=``harqI?6Z6M^rDVJ_@(!Te@h`R2H3{f zS;Z0F`7fUb*grBI(rk{1Yc$f=$e3sF2UC(++rEP5$Ni`{lRLT?*hxy>2__1#q+NE0 zCy;s`5;Xf`-`i)?#aZ(;Es5DsID=5ul4O4m-$h+zxWZESjIh+oq}Q4+dZO)Sz;&wXmT9W0(O-KT z*qERk79gVD-lszWHfqd}))HiQrh^7W{bc$VzSBZ6En#>+bKl|L!@$qR{v`@xeHB~+ zAAbIBPBYi%l#0M#$rx7c&>x<~BI%<)@m+K+qAd$0!IBH;>FIuC^$!iC(nw=WDjfpt zNMRh&JU@*6PO5FcUT4mhdJS35RjDydP(2^w39+$G3dCnNQ=FXH{7}4bWcDOh6k45PynEqw@`d#3A++xfkWp=Y z{?#6j`}qfLK;rMMTO)DJl5&u2^%~Wr{1(CE2B;_befa|rECGH*D}YgqF#WIWfRsu} zaM$MR6EKH^aWx3TAX7IK2VJBrA$jMW48DhFoJz+9g;9*had=2lHBDMhqj+z#i*{+E zt9hJGbBw>*ZAF6e59FdeNPbfM!-Fu2zMv*>YYDE{<1iBB2WB&A$47S^z~I*();`C32wFmw$*8cflfC(|I?NLB^0p z(!tw^MXL(gp?SJRJf)M`73bp8cwyC<-om$r1i$*tI|Zyt;eY_v-5LZJ;vo~Rxn@vT$Bf^sHg&DODcl#D}-y;G%a?E}_A4nx7E5g#>+P?<4 zl2-0v?R{?-IL_%4ye<>ekIjmocAv#beHML|dn&$(-gi&l z`sAegP`;R%8oF(I>qjP_8flXGpiK4K(m)vA!QiR8I&WfQXbZ{de)JLpf-2^hEuoa$ zfFw~s;8kLtS#SSl?2(iP`|+3S?;=nCp?3kSev#*x`Op=E}&C_A2dP9{2B4_>YJKMV4$@Eu;%#-<~s?b+`oUm$SUzi zRUefwwMjSiFR7#|qS&jn7~A_Du2(<*O24}N+u!Jp*-}gAm7OBqhOwO?tug;E{Q9{L zZOKnfq8>3{TOTr!Xg-*kdT3-xUy^P&w1cDPo75|`_(P^*R{Kiq-uFCk_}G;#6OzZY z<#2p9hILcvB8gtIM(@&jMxZy4xtj@Nyu2m2?Rhm2OHEMK*uS)TNULxE;q3E{`^ZD1 z@tA%pkn7+ZNwB2N<*3I^Wb@Tt!{#NVqPE#bt364!{~Z03s^z5;*Xi|pyJIT61~gJE z_M6;4tb>apR&3M5JKuTUYd=e3E^a5iVeYx@u>Q3)(LeBwrJ48nxq-t&?(W%z23%0uHsk8 zlZSB{H#TvpX{Wo#qOluK;_hVhl{%T6%)iPhdE?1Y*=DN#21XJEY@1`#*0J{D!sFBu=~KV zxa6O!SLa!%ZEOrwx-EzE%fjlJ7gR2?hUHzW0X%&B2P<>!M7i94lv}#DS-P!8fZ877d+LWgIau;@1I7yOZerS2wkhtTp0%0T9%$1e}H zJv-4iol;Wiy05^OC(`4`T|GyWTHn*|uGi7v%67NKj@p#n3j9}#0Tf06UmF3`=m19| zA_vGJAv^%og!3Eh(gkqWD64O|n@-FJ`ErJTylZMtVLSe#cxj3s>sHv)&`FL1s%Gdu z+D}-yo2EkbhiQ3iI&7wl%`^228mWUA2@dtEf_`=`D4&FWj_o#ig$2vDdrf^lY_L~XS{5mBfq4#lJ}!F{YNn) z4us=mV!>{wnXA4Tq&%x)YItFYmM(*O-tIJsKnZ3z*kPmlSUOd5P^9{k+FNXe9^aQhJ8IX1kt&yGi_Xzx1!W_ z1?CLX{fL%QkNgtnGqjjlZdoS5xSwn@#p+k_o4iN7s?SZIqd4)=>x~k8>%lncxqydjQHgn@lcVYlZ+`-2ez|HjmLT zxgUQTpp5`(3~YIKG~g5fF`~}GaUwZGc(aLemR&*){c(6$>jrAYTNGY|1X0Bjfir=` zjauf*%u;AZ`BJ)R-p^XtdJ+ltSJ3?RxYaRC6NX5dvCuH!_@cJ=gqjo(eM?)6*kw3L*bZN)%iTDdZ+ zVYxFE_sbL0`bn-grm@wtEkiqR6ln<8Q`Qy-Q%4C%c}z|Z{iOE)xOFFY`s^f`M=i~G zNRwqJ6;1~{1tcPXwd$aukqir$R1U!PBF75LO6ojmJ8^hMWwjWe=(~@}ZnkE z7~HzI7~f?Z@6v<;wu{>QH7{a3mG?ltpW|EJ+w-ru1b#146YHOPtl8*Y?3Ami<>E+&aO5u5MoaaW z>@+oV$Jw)nxv3k=RY{{r6GiAW@5XN@Bu=^Km&ln;ejEI|h@*K$J+V{aa0gVDD&FN5 z^F{!h)?(aC9c#?Ioh#eG9~Srxk*jyi?6l{i67;y^=Kj-kMoIteorImZo0eFmj@- z3fubW0Rg42a<(&N5sy_+OS`{6Q z5ja?Fy#cnox8~5~(|MR6cf7j9ahdO6c%V&Id&#ie)i12wSIgDqtDoi*XN7gBhRX|< zx8|ftTF&KZW=-lG-v>#Z%8;M-L7ofp=~ZeYvdWIwkt^D2`qk?+8Vh#WIPeOTtRjv( zQG4;Y5T9BCv=*;U;OB>Kc!UYXXhZbywnQPDkayj3HOw(-du?mNC1LgZvND!!lYF9p zJaA9*+0xQmZ9w~>+eMSk_8lvzju<$|lKn^BszU#%KUjYHzo|bQ-fUz6#Ury}hP9x& zKuSghu5cj3)&Rd@(gvp-9IZ-m4zQub+rQ#`v|L!@^!<%eXIcDR-Pu_4pBdktcOJp3 zWU600RSJG~lf*|=Bd7JiiedLxG~w}`ii%yYIE2Hu;#Tigck$c1Q6{s711VT2Q2?#G z)>lQ9Pd^)>XSUro5gI>CT>|h|omz?1UGMMN!qaCjddEXK#Xk$K#GH?+9S7<&`F`=} zAR?hHGJl^Vx5bFQ>HGFUuHmp<_=aQ*E8ZigtRT>FXROE!Dfo0Oo1ec=1^G?9$J%b^ z;5Q}xb;TO+7pt z;@-~&r(onwb780{MPuX{<03U9q=W_v+z_MNRu5C8GQMj|eT5C80Oyr*%Pp0+_Q1!P z9J?bk052HDkk5i&UBU18v|BuRWgn3PO5Q;K!`)4mnTTRjPHc1Z=Fco8PbWzZ_H5W2 z3a$yf91s0@@o3p9u$Y=nVnSG$;XCKSYSx1!_hvRM%yH?UKWgiPq$CZh8LXcw2F$2@ zo|yLnE9XI2-$0kFXT6Sr$fvP!Y+}-=OC7l}0@%aBj~Li=_r7he@NAQ7LUUOG8@B_D zTMNAn%FSX{S+9Ck8IvS9Y%rO9t{-$_7KkfwK0Q6Ev)0MTrD`|wb2lXRc~7QH&%=8h zB2dr+rF&mGv2Y}x;1fx;o#peEwUe>M-?I}gHjvC{U2MxaK3#X5nLks$e#7eax~<$! zd)eDSaT~q%wpMGDd(o!Vmo3xmtLK}f!YLT%%y&o3Xv6aDleZF}nA@EbKK{#*@N(en z;wmj9N2WiJbkFbFA(PM2+>ayx6$NbY<-^JJw23-zxwNo)k?qG5gc0!SSB)cid);U& zUo)!Pw_dgy4MIZtW!CRTe9>ak(AWHRT?~@LE5fJK)OKEz!TEZmLFsrs;#-k2XPiPewcXq&*R4W93c*_C{?-X)i3;pdx87gOqMa@imgCG@q45)4a zuvUHLF-blRyRzJ`K(8MpS+?Ss=>d z+Vry<|Ng{&5EiVm&HwH<^h_Ie<`(5Ol-Fj1B7uFYRL)~Q z@Rz6Dxp#`_S$x@}4Fa%JPvG7nZ^;6yi8}nT2yEA*hQd>d|J|F(q%dB?(74! zp@b^dwmzFCkr&l;TIdZM7_17aMltX{dQpX^ME_u&j9n(3Q|)yRon(o`ujj=3;^VQE zqf;-aC|7cf2^(_cFDa{D(>J~rl*rtyk8t=#m=b)Xs=*%0UJ}%wsid@yW*)j7e>#3v z*txb;tESY|dTqx_r zmCJ|z_N@xNQoNh?FhM!JO4uw z!PI!Z?oL;#+y=-0*4-kCZ=ydmSNk>Ny4>Cj$Ddq>hqyfRXDoVUZwY5~pu8vYY7U1P zwd2F1c}rPw^%yW{ zmwj25e)a>>VpfHY9Ho^+s&Bl)>lk)taX2O*E3-81=(%b9&=Th%1TNLL|EI2_N^SLf zaC5i%+#bX9P=#h$<)V3XnPJFimI2JT<@PPFJyHhZW@9AFK4on$!PHWKmj5$&GI81q zNDj-vfHTQ+znj7<*+W$(Oi%{vx8kiZZMOoz(l~5GqcHeaYy6)KL;qPEutkAvk4I=V zSWE&OlKQe}Kc4k-U{snEzuW$Nll=|QR>}SbXj*cZ$m%=z2UVl`VNDMoU_6Q3nGr*tak4k3P3LLsEBI5cqRa3buO`a znWJ6CE%6u0k1xL8kAvEQnP-PmtY}g(^MbMXng+%0lKDDhbpKlND>ptxNzP4ZA9G89 z-6W{mX7O#VpwPnw>nNxuZ(yY0qR`v@io5Gi+S_UkL#X3rr-^)`l#;`M?&@ppcv}>Q zq3@6wyV9!tuY=OaP2bRJim=L7$}n`PG{3*WAl7IVm>(dowt-sg9;_zT*&n+PKxcJN z2nlaIDKdwpP8u?QCSNz2F1=CZ10lx;9HUm42lScb6I8_Hj1l`r(PCmEYk;V$)GBqN z6}F-;6`%?6QTLDkeiFc=^HB*dXD+!e@2M^Zo1(oqii?HMPzlJhEf-SLvD7@P34c=t zu6CmN_s!obN+%vK*81rjq(z!(NTcM_p#)OCQ&niF|H)B}uGM9MwHM`>^jT)-JeNvk;Ft#K@gZV=gg8c@RrGsNg&Ea!L9okQvtC#A#W?n?ol$vo#1{)l``uOu=EhYmTtmT0{EwM#H>W-9* z7|8h_tc{%Bi0tu!LAL0pH&Y{i7*rg2lH+vzIi^+EF=+G}?P^RYHu{hZXBxz8e4o`f zm0#|HFBi{+hfygLhCu(ZCkk3P(glw@&gS^WmF=%0NT}`XL4}{_^(fh`r3sR6>>04b z8jRR&WR@MdVe+;awC4O+Gkz-LazA(-H#SyTbW-?Ta1NI32FprkEBJW;Q`?o6+6^1a~~*n4{Nh{v{h@APsM3!MYiKgtI)A99iXz?Yts86htwa-Rr-ouhG zx*cux<%$~;`(mnId-Jm_lAbVZ7L^n?`h{8C>oBrkx|F~ZVlq} z8~78rO?s+lp^VCNioKD~5y3+Y3Ga$i19);-IhMREhU%PB_Y{)*naF$sl>wn&L7RP8QhMDjbNgO`?Sik z*Fu!?H?1$a-NN7VASauQZSktPKVDq`AC$z%YBogE!Wn(PsZk%3{lOMccSm zHC=-7!EsjrdKR=_M*4nxa_G&}-Rif%|0)n7;!d7a+Nkx^Qw$CFhw8gnTxK*LVUJj? zpA>I&k^~DB9Oysb;%y%to!TIN{&Mj<)KL!k$=+E$dJ~QzljJxCHrlXYb|w~2_Gc|s z#ad&EhW=UVWN)5XZJI|bAs3>kfG8`CI6 z57#)PB_12>*9dH%WQVe)3L7ZFP45yoUiQng6Lc4!ugH#BJHF3Z+4bEYJo^;uyerM; zc%+02SzY~@6y*!ktiUS%QPZj5-1GL|gt9=YjP|8FoSLcW`Cie^^1dctO_8taybnE(ut#& zqb|T-K7dG*4E*xcv_TbhmX!r#G|xEmh{PYB)@`BT77Fq7whHaWcgIT$Rkk_65Rirq zK_kjoZ+XH*go-<=W)CT>!^rddj8ZIE0J$g+EJ=!4d6|CFq^m;Zhh4+&~^D}3n*O!aR684bc5u@;K4@~hC1&6)HrACIpyTE zEyPVDI>+Sh5c+re0&f;uHbYFvDSJZPkNZy&1D;!_me}mn*oQAv|9Az`q`qeZFOQ9Z zV(thp?}|71DZVMMQ?6Sz)ATg!JaNGDo3lPTsE2$k6Ovgx2p)mV|Vj1&I1q6D55KX!adUFpnnHQb*xGb6+iNaN%a?g)g!#9)pFuToWjGX3ohW=XL zUK4X({2sYy@>{zltUZ*yc4;oSkP6G;m)j#BbsxFN?N3elf)YSWRfaz0_p`(SjWkri z#Id5zjt-0+b${yA#AJXKFzND9xlMM$t=SeG09asLvcXpPae9MEG0 zD*;8O5>^$FY`ljg!;A6yO9IKan+13%tz7Qtn!L=0RP1z>G?eVt5WKQEQd|Z!jY}LbT zn%v}wEjKT%Ws5kwOVCHLPR}?-=ye3gK40Tv|#?xS!m|m5{v#Pg)gToWcH@ER`H7^ z3O1KRxs1Zj)4qMo7RGeMxRwEpf&SqlVz!0f|0QMg+iwTu0FB=8*(pJ*&I{^T(stOX z&Y(*HPrMC#5H`j9@gJSEo6G)_-6prQQAB$H)))flYsh9%sDFLg@=Ef|fw|Rb-i7*V zUibDW{&H%weyv5YdQB04N{A(|Oi18fcQ-o#4GT$lX>MKv#J(2ALJF~3!L>?so)ZgiRb41zlnxAY1+pbvDv+W>K*eQL{q$Hkr z-T{>WMsdxO7p%U%=5j!LDOLNtu6W=82Fbl&$9ZXvkyDa$}L`v3|H8>$&203!NV$gLn>nul#j)cX9lk)#jqh~-Z zK>Qw3>Z`xz5-;fI5E>ZjG3keviNPTEm}K2#_vC_Iq4BD2JO z#qTiVxcbTkkY=)v$cqyV|1!YwuW&}u$3IcLRat`2Fykey>Iik`72Rshp78kkpj5Bn zN6BIw-4#Orl};#oN}zi98;!x7_sS&y@RUaa4^_C1-v$KdW+m-KoJZ5mr4F~c(yx0K z#zwUhJ0@^VS}3Kh+V;mTMXlhm@}l3HUu(0emYZp>7N{-kGH&RbOoq%?`K-_{(O<+O zRQ>BhQI-!U0;|ue&6$~!QR8hCK4(6$Q1C*stTkqhi}$oFFMmvRGiH> zI?rLXO?*z4xI)556ohw%H=xbVnspBoJz!Ia%CN%QeIIEl#4$BMX1N7co<9OeF8LNw$;jUlxsfW3CNA^q$ zCkL}eC}03aM>=m%q`q43qTN-@RQ)a0pE^9?aenMLM_L*Tu&MwU{=RMxiP(D-*-_M- zzAF+~e|UR))*=V1H~PH#Fphg&A|OUaU^LbhBd|$hJCuXC(5J3*-V-Q|GV0uA=j`0_ zZrJQAP`M9)ABc%HgY2_4t}O~G9kQo<`k|T zK>PuC#|{jRo3~!N?uULrmpOH=Qz|#a^obi#h!x4UQ$NxY=lWQ5LV2AILo(kqpyYLN zwy{(#z%BAGvDQWBHcx~)s$JCix2)i29#+Q@KVd9OY)vLA{#fMa=(P z-M6G7##pp1*m@R;j_b94lAf4_LY6zK_+pcN%oQ0ltg6Mq>K78%XWk;2f3fl;l!~eD zuM7LBf+-hFOi#zCV%xh|^RVh}TaY~t@5L!3MoA4ek#KY&C<#|H{JqCTxA|+Qu1xOD zATv2s=p(vZW`Bnl`_4a~&wQ%oqF0y6s!L~3dH0g;@*t3)h;*~fvN4vIlg8W!OO7gL z95{q47|Ir2JIdsrEgHADCPE!<;m8A}YHzp(6vxkP?np65c(7XomxZ~W!l~2Tqvk5? zQxnyLC~383luFW8bqw~mJv{Fr_c{J&jvq@4JpqsTFB*{L1yl(3pEbl?nE+A9pNep> z(c}2MGS#zp?nvgDY}13#t#3SqPswi_eXA>cpDweuNmDY1!#4_72)T((&woa?T8e5h z&3UfwJ}=Ji8P-pOXUN5^Kq|gzeWK>jp?!JJaazC(p!~|GN5Wlwg7fl482d8!R*h}` z(bK5!DRSDE!WiU^S0YF242?zg%8Qk6JA%+ps&FIzEiz`oBJcYGL8qqI5LYS8l#<)Y zY*c+59c|+_x)Q5Jq zGNp1*Djs|4ITkxwVa@T)#9%5yB-Gta{7yluzGRd6K8m%rABc^>--I#XPvDsTCe-pB ze|l-1)YSeswwfC}G?WjsugIL36xnh&Jiy{AIQ~!w6=NPm^)UK#e;&4)VkaA9AZ$#c z*q@z4qtjOCxyR%6HpFN-xJ~%Y)F~C-+!9^MJBa{6 zfLvFor0;UdtP_58gUZ;G;8M+FV|jXN`p7I$m3g?XHzAi%gz%o4_?LWUwRnXeZkA#%=B)`J(C3gD+V0@M8IR;U2w-{vk*`5n?baWx_Qtj2s*3 z4tkfw7h~!*6YL;4wwG5EADiPRe3sJtdBph|6)>I*PB^f7WOpURTkXe(qFUv>j3u7fZFCBsYj7GvH0(DgK@sM9yutEH(OL3i zzNInz3Vk-?<13%tfnE*MKokos8&KVBH_+|a_ zsemSOu?HI1hPJA~JM3th7zk#GEGx7x;Xp?N`FPv7(-Kah z&4GHO1#6~-gTSfj3$eZ;3pfv z$Q)v0+JyQ>uQoi2#?zIlvq#zirN>7s8&BQmD7Yxq30;9e`z2*QcvBia|8+4n?#CAZyZR<+Y4bRl<^4UbuNX&c#!aV0X z@c*F@jTm3Sn_NNF!6?LU`zu=)p0T+7(JK>`zLTPt^To1?>utf4KYnA+?+g&ybFc1c zcHX!d3@Fo_>^)h|?XEW1I_elcfw1v@lCYO ziC3FFnE^d8=L4$p3A>A`h-hzp+4+;|NI~rppIK#v<^jD-)ak`v#BJl9?wH|ZllrUv zByMB-+{ZJZP={hE!zte)Ov@IJ9J?yda#G~twU&K|^!_F&Y9pAaAxbU)?G07(g;C@e zK9%MC`L@xF$Lmc*1J~3$);pHD=7y)9Z6AE0_0xlWM3THgW=9v2cZTvTVzvH?^WO$9 z6P;p*T0q8`C-bAv#efjW>lsiY3Y7Ks@9I7T^xc~PUF56ybGqGvZ(u&XP|qp*R25l; zxu+3p$82n2u@y(|rU6pblUZck^kf(;;Z{~U;+_JWQR?`|7b zW|xBk0_%yh)4)y{`L=#+Z^gcDo6t*U+Fifq+=F_mwB#7t^O_nwy&}vxlbL*ZzJui@ z3$x%}lizZ2XSEpaLXRqdQ3E05(9qCmRVshpKQAk_f)pbuD_r(3N)yEXc9giucyK-4 z1z_wtQv8>+YU#Gx4q$46nVbLY56*zNg*Ndw&2x_T9UJ~B0ye?JQ^J{*Hbv#edto2FbLxbLlLce5Rci*`tEbVc1c_A~3y4^Fz-Gk+zW_M3d zK${*YsPy>%1L7tcF=XCc9}g>~W;W}NK5;>nhoRX_@i%SXOZBi49{4cN#KwnOf$;Em zo2r@|_~OFx!e5zvZ?J5*lg8PfgiT3O8e3evyAKCzCt{2r<9?(Z%C+LfoPFJ*u?+F7 zm6~+_uv1=f{L#ksJL8$%eZ=_y5%WIX`K44iYW(X!-j_Z+&SyuviTJ&4gjn+1r}x(9 zfx`f0dWUSSL4 z^WfC_>Jzn+zJGzVBL{ZlR=sA2JM5XhkMBDZ&SRv^{a#1SXk&W~E?)dr zad#HbQjx*@nEAVW$*QhKywyx@mgY#MN`Lq7zn!n2KA|V^I1R*O%sz+7ZWlS3KA<;H z)1@?ZJRVVN+q6s3FRv1!W$ymf=}28xs?Q}!@4LM#qU`y@X35V)$Pd=V)by>^#TYzm zz6uNcrlQ|J56%8%5(p-)$r;beb!lt%!zt3+*x%kd}{ zsH=yw1ss7NN;JJsqx`CBbod8rXLI^Br2DH}ngMP-=6VZM@SeBh%^u+Bd#j|^gH-_C z&U^CiImS>CWs4SIa6i)n?X5pyjvJljD#mUlx8NNknl?E)8X<=N0SJD_7(J#}dv56U zDX;PM(dqcpE(yigbvI0Jh6qY9H$qxZM*9O>Y>Z72Z|lNY()7;-_QNT;?@`eO93WcT zzEing6lH%U(TW*v9weY?IaZTX@%83bf3bo&sO9b)LAZIjHwRRg94>cnULqg8FeW;(SJA2?+(*+AtYRrw?K0-`;V@qV!W8s_#~j zW$dTxv#A)r;Ax#{?j&2zGH_HzXYI1DC-*LKD{W?;o^s?$GZ2uZk+9$_3u1V3ZI50I53PuH!d_gHGrJq zp`x$ih}g{8`&%=eMc{)HOxe-f*cJaZhSGX>0r`;KTYUnwd;p8Je$YL?v)Xr0TB(j? zm5V4+k&5ePRFAvcB?(yToG*U2M>WZ9X9K@`H$bAf{4-@PL4A0jH_mZKMN0d9*aPt| zQJ;ODl@~M=US6oj{b9iVTwb6VjuSYLQS_6u3tYaWEc>*p+lE+yY3Q<6$cdnnlWf8| zr9#l`At738+bSaC%vOJGOM%JrEjv^&DnKGiUm_|ku-eWJC~GL?cOrB2Yh}7gQ4$Enm>JqX0=~pGX&-6Dt~qbm zweualgp+*^?&rP0HzL)VVWgp=@k*#dhKvI8%j~!EL>gZLMg1pQj2f9)^XXqLQz;6E z>>2O{a^a616v#ceN0Nit-k(=rsHL-3@FhoLU(teXPt`1}ynxNvuqkqbKbV&9uX#<1 zB1=Kp44xqfcVKjn(&-N;S()t$J&}n2IGAvjx`f z=3BgPMerIH#8JVGvMew;ZeddB_~9*3BXztBemm@Wu}TQT4y2xF=)yCA8}3DKgJ3Fs_QzWLla7t5|MH! z@DEPLKg4Y#pD4`WL=pay&ObV9J}Zkc1bzMP-E(yn(e?RbRiiJIWmNIyJ%Y$J_Rh*; z3$W8i6DT_E=L#a_l-a=w7OqO4Js#xsPM+Y`ydKHFeD_Ic{5A5;t@-J<`*#;`=qhUR z(N+4VmE6E4?8aw@#tdpSx0%=LXS8Rn z(^*4v(p#a}Qw|(o;~zQpUQs-pTICRJFp*AuPhc&>^cg+n?0PAUI+&20t>;+LW20s8u`c^+YThGZRF?vsOR7lk8lT#cJkP{EF9u< z=Jl+bPLskI-6wF5=97@y{nWzZ#uVs6I7TMIT>C(HiY3D1exras>LLJsUnMFM-GVGz-lr%j{(P;lC2`?ZmzKkkbqR0 z^h(>^-1x($cvpg@;P-B3n4=zqT8Kk*C=6LTvKoIG`G(-=`6AnfiL_)H^BU94-kJrz zduETrA`82NwBn9@k61Y$fp^bX+l68ao%1m_z((Z0WU^}6}D*={Hth{~PO9(jXWgcr-0 zhGBm(8^7n(S;X##Kmi$%nKT(hV!WXFD>up@*o43?)(*nO4*+B@X=#%a*9QKjRe6oa zXLg#VeQ$Sy*Aqn={`oZ+6s7<|T^`7IUwGN=z@nl^=bGy4bE<4hynoZ!0JGr8jr=Tx zNdMUpR=BsG;_!yYeUD$16OhbY7>63sH@y&vse6yL2nQ3Dclc6s=`o#Ia^Umv`>_f; zIevk#%TuGd(yh!b0nyW!7JFEoMIiEIYpf~A&yThy65twnJ~c9+mk0(={rH5s-I1k$ zlo9UdOnDfR!l8oNS)I7R*JI&#zOJSSG$2t$nY7qo8&#DzoKKl+lO&Crj-~MrTdHlv zT3C@3+s)hyc_dy$nEVlTpuA7P{Bg$&=UEy2UM(XWRWPj;t^CNMBL15Pq8qw;Gr&D+ zV^*}kX3}94C?hPYJxf5Z%hz;tj9Giubd{_fybzodH6+B{_(1j0VpuPHA-)%QQKuz3nbc( zzX@&K!a2~-u7yzWf*00*7P`R-yT-W3A)M~^K<*{Ww{ z#^Pr7epULceu7y{n3NcxG*^2zuDRuW+SqpwB6AVOerQ!iQ%>JXonH}i7O(%>!9Zq8 z;kIQ5x*@xYnx@^he1B+{L_M4iCEa1$BUGF(c)AhA0MHrT8 zE@LZ8{cuFn=pbO4pn0Di3<{hLU({j|eu}dODBkXkU9SIRjb3JxP8Er9^x>QIniNOz z0Y(84!OlN@rO@^7ob)L?48VH9IZDWwHW)n@`b*A&aBtfRqTRHfJ6|t$neBO zHYZdis@_d{22IXPOiBB@u%i+1X@f~;A*urvB*1&Fj+?KpY z%BFaKj?2HAFIxg`ti|a*0A@;x=Gb~W<)=4;P#jexr^7xepV;6$& zZLXu|xInQ#zEQ`TVnhzemF>#vXZf0GS$7^<0? zz?$O~_i;L*6=%;{+EL%zE_Y1u;~564#0m}8L56zPjkKuGIbZwT4gk+zL}!K-@q6Ws zK_0||J(j9294zv$OZH*`C(sb2zrO%>Srb*x!kQR)_$Vbg`0s@*D9)6h-igpS=U3wv z<1hSLkNjYwi@HQIVK%4Y9!eeVaA|!zKOGrKbkSHO5vvWr&Z^s<8px74+rf^exj5}j z2IgA2Kc=diRaDbdP%~x&lHC%uj3=7h+;(p+-8UgA=WG0cbi}gnbuK#4 zBHq=A*FGYlry=M2*)A~ulRuC`>AHpn&zLWOzdM`CT&l7irZOOh_{!QKBPg5k^HbxP zbEpWh^r4LqeJ#6QwFWh~;J8v#xuvMDpU0rj`l@dRo|uV0NiFa|rGkVIk_qRVDV%ku z2)XzM%aNh$TZ4&!fuZ=(Am?*^o_S<&>JpeB9@ zTz>ckf@7Uu$3A?Rcf=FAM;xp{M=`_~eek{5O zX<6|8>{EtTR`sox=biOO$~b44e64!%g3Ta4_oG6*7PqJ^rKrp9q>TeLws^?hOrLK2 zK0b80x%6qdMl5^Y3ravO;N$MbaZ*WNi^PC2&B{NWzimMGj(=b1`FfoRM9F|l&sUR+ zc0FkWrr8d|?n?dkIjJhBOff9qu~WD+d{wcB2a1$M7+mO$o~YhGArr477=2YowCM8e zrDD##15w7<%>4C^Ijeq8R*;+gb$n^kO7eX+H;*&I)jH)JtrK4ikbyl-6FZbQB-dO) zpy1O-vlW}{Ps7$p_e!pI!1;e>+6rB~t^K(X41=UE{`^Q1NmR|L_>kb2kyG_0tZwQ^ zU3hHoYti$(6uY$b_2?y80zs88?B858?aGV&CY-0oZmN?L%e!(P z-s5jYB~gYoo|8)a*3@~b`71*WmYFH|<@(Hv{&#u0^MX2-L9qtL6^D5!kBYHzmH(S~ zqXJo@1}=)2Q|6NKUIe;v3D|1WvW(a4gweI*7Al^K+{p@HKmo9#Yp>ZP-EdB?ISat- zo2u?P%$h0*z2qVucR~^kEcb`NPIl^N{j}_*nnpKNf4=Y4B~W|bHZhUvGVI@?IehMB z0t;qj^q{oNw)j2jO}x`qlC`DK_4OI?pW%G1+@S~Ciam!~gOG4%TA-X;SRZ%b(y@@AL#y$l%yW&>@RuL1S5d9j z5BBd|^^fU1D`9&IDigZEDh;9Z8l|cF*UfOA^$zTsmzK&s_$~xSqb6-j)VT%8; zO=o2lboOf@dr0ndTgz8Q}|o^j92M?CuDSF}C@Y9r&iACsh2 zzQacTMe%7i))onJ?lyv%KFZ)sI_;yLO!RZT*Zp}rQ#c?@8AWUUleO%NN#2iixyrlsQpcx(wSbkxhT0$yzdtn2|qrNd+QN>gr&FP=GgqvAgYlr3NU zGMq{a*f8?@IAGq<&=EgCsd8@8o8{r0H5uIdBdg~})jqO!in5x|r+*`0CgPP4JZ)eo zEx_dxS&WSAm-5&Z*Jx5%H)@XQDKW(N*=uTot$QJS5Li(cYHrL}%9JGj=;n+Ns=;M$ z*ORoLsUeDRTc^0z>)5%@Pe0XTL-W)-|6y}9MXO)^fZrKk&DVcIC8jz9URM}xt?9pe zYgzrBzjRGS1by9JLwxZ2ImPOK%fIjFm}97EonkEMzh2By?5vw#Negu(^|PXuEkRxc z?U`Y9TT2-sZFEaI^lMDVS4p!hgWMbJ%qC6X(Nc#)|NWzP0!Jt%spJ52$~G0QXp<~{ z-br}oS%13d;Ayt_U$&na&5tu{V!q{0(nkaF2$x;6Sn3ZVWdxHfG*ECH~Oxt>9jHWQ2$$* z`c)d?ir>vK|FHWGmFGmsg+e7djgJO0KgTXY0?ML&De5#BP1c2T5xfj;QQjL;2Qv#_ zDYoOXpKHK37FLYsvhLDsqq&5Jz|N99b~bJkS2!si=-$bcOHKfIE$tZ!AQgy;Xpba^c?EpjjbZHpBuJd^ri(@?Y~$$l#ctAJsY` zDbaksMHo<0NeuixRZv|lzRu=VIe>Oy`WMy{y;e4JDJ5!}02e1r>m${FzSlXJl`ZTt@gy3FBGbrnZ7@uywtBdbz&k%SDL&n zC2E`Md0O|5b@Ja6+PbX|PnfEx6!SAONLTNCY2SDI``lemPpNG9@x}>u7W_1XoUy~} zX2pjHvfkRa-H8e^KP}_5c*$H^vvr=#;za}l)(2AARtRQSrv9ixR6z4xgH9dztDP7( z|IlH2!z{ruy;rquNu)155H6m?OZ*I-RAet=kC}YZc?)hF@*k)OwBLmr%pnz%V~%Jt2qF~}JI z!h>{$1T_XsPB;G6v?LZcvg@PR87O&6pK!Vs=F9FyZm#c(1IVx`N8&E|b%>qiFg7t^ z=;>5v`Eb`C!VA0iJbWI6dih@dGgZiNMW5p!B&|}g4qncMS?~3I&U*+_))w2 zfvqyz__)nr{$Dw=BsZ7&Xic6{O5#8?AJfTNLSL}ccA`i^sJ}PttzJHvk(gdpYTnL7 zDSdT^iIDFNWXv3RqguWz=xtMg9D8c_k!aITjKw}Gbz9&KBrI?ltzfEa;7XhkinFAc z(k}wt1X@i1kIvWv`X~FO7WUxvdrLyU9z@q;=G0_LC4X_j(X%GX z_$(hrQ2z}(eGOh36D2%7=Fc53c4t>2aj%?jhS(cBOB|b@W8puXLAI!O9YcT6l(WO* zq_Yh52h)CWbLQXC@6fyu)YxoDMHcz%jM#o6l26-s!*)BN$N2Ze#monUR^=_INj#4~ zcT^yXO!3MNj9XMohKagF5(75iheOf{@OWW8uNCdH4z6u>!x0|E`wR(#N?hnP5Jteg zS>gZ?zznCpx=|;46zT3-H)E3D_=~~#k)z?Oyy%E|5TBqVi(N6^*60rMjU4qSpsO9f-g?*Nt<|#%QrBBZs_;8QV-hDe-oaB&T!i6}=u$0* z_KJ6^?)WQB{Yb<|*Msmn@dT`HV{!2Tcf54GpSeClLR1=?nZE^_hhV`_CM@7LEed7- zRS{)bgV`19e$7%)ZCcc7Gq z$W%0|=j4TdoEZGvH7N)3_=Jk7bD`A%M_gwBG6nhrQQngU8#f*Y1C|1$rd7>y5BS5k zQS8(P_tkQ5ziTF{A%Va&lKau3>p#7y7 z%lk4%=E?PTR~SE@$_K=%DQ1lo@SV!L#q~+<_!BlgYbxk-5QWO?FNT_5=A7>FoV3iX zP$KQYeS4@p{2Q3VHhRp;f6pCk0B+>3;mNIb=LW!I|NOvmE*Oofb1?;jFHV`z`w{Dn z@gd>Mo!T!(+vT+5R?9*zx9ph46Tgvq|3qr6hJhE1u`3ER&XKj%G*La_7>LC3N=@J~ z$+4*>3-o&9Q^+DV3<*SHl}5NDZUUGWH_`hd)a@YoE$#Q6uk*W~tgy;vtu0ji11Nh) z6e~v6+wRIUa#yRgve5fuOi?EIugOzE@3-%cAMW7}&!Rh; z?uT2Ae7O_E+Ft8DH>}(Zl3ETs2M5PmY&UzLpINuwT%)|PDX&tKehnzm!o;z&JT?PpQ=mqwF#ErV_rBHKXeid_;P!1K zE@S0Wv;asw`AkpR%~HsQns2!|7kr7Rc0r!QVx!^^zAfXCW`N5)&-^$ckdPK(9Nmu} zw~WS1D!Sem@4~^Y$%GPr{*fNg-cDdFsoyy%r4uw?yXudZ58}R2B3Y*UXLR$g=9F56 zp&oTN%srL#*N&CxR5uxMm&C+7&Os2#O~lNC{Cy$X;HbYLS7w-Zj^A2<-pA+49}M;~ zbTKXw(Mw#h83v~wtX%*!|INu?Ldd|i7A+M@{flp?pr+>Ithn#c94TjcL(ecZXxvw3 zD@^EN%XjLsLyVSaFo3s(0r)+~JY-v}0q}Q}^IMu@T$pEPEWwH?8ZpE=DMC*3kV2Ee$mq7pPtu;2TDFCcYZ%AAL#<<5D{!&z zw1-%ocRqK_mW#)$(O>9vGsKu};slQfeUlAL%z66lU2l3=!yR?4J@4S*y-)7a@|N~q zt{ync;5mN=k;Z6OyywQyH`>9YzSfMF=3KsF^|(>*LBCV^iLo=){={Kaz`C(CMF{u% zX0ZI_t`Ei`F9PG#>=?J%DLMadJ+2!-TbxQS`-Okln|52doT(W$y@yIt=Vs(;L?3Bk z1|atQ%=&D;PpK2iKAI%A6X0}xO#(fnDNwgSfJmA>KOrG5SZKQeWhmE}#ZWX0c0Ha{ zIyxGh?0QP`$fwEx+xM{ns~Jyl(aGE&EW>&p?b@g!hPG#nFP0q;x!KrMdhT%n5ARFOH}Vg;s3D9{b6;;w~C*!i-Hf6wB+#q87ehY zdKR+CEi2hNKF8C|)ec@`XpJ8apKe>maUpI*@rX!<>8kkXn^@d7IZ$f4ks5bcV$TN- zVk}c84rLd=#Z%`;QFlc2&;-AxUMJ*&{`;F0$6EcV_k(^C%7qz-)-TXhf-%acrq)*v zHUIRZnk@7NZwV>G`csc3Rr!f3YBd(svLfk;?vTaj1X~F}%jlsg z&@nBhB#4%!q`J5wJW3czaBd*YxqZ6}8zcy0S=N+tK8A=%B`^GvAmhhx-ymN<={G`c zj_}RpA(neoyq$^)rnVgPk{m$D*Jmc9J8W^^#g87tH9e@*h88t@G+!VD6c){9lH1r{0`@#M77^+o)1A>E$nV*Rt$$yEF%VhZ2){PaV*GO%RB` zjj`o#i5pQ`PMf&8Yqi~P=m1^El|fuhU0d_*Y!30=&vt*lChEVieQ##@-t2MuE&s9< z;grjD*;^lk_fvup)Ahl|&)%}fG4CiWk=XH@Id8Y7HN1;Qe28aIipRE+Jr-jq=W8It z;r0FuSPIM}0(|(Gqki$bV39FNEz^N$*fS0w!ANlU{B%4qi`{88R~-GW9M11D9*R@C z4v6a*gmY1b5xY{;5!#W)KVVr`Pd`s~7rKA-VW-{NDP8BpkFX_+fUuQM+DxPy;op0x z?Z^ez5(_06{ym<3+AmOg6)ZBuhq*vv4e-+%1R`b#WBU#DPV#i#ih#-{`oD2>w`+X! z{%z87-kRbYHtj2YTi^DPk3t5$3MDLs{;YXKbh$J8k|T&4$Hs(vv9jrokR z>sloY8|V$wQ#(6VZS@$GYAos(JR_~kwt?!N7&iLNYZIkK7S}^P_op8}oYC*83aP1a zz1Bt!=5CXGbd<7n<~w5}5N8}OY(%v9odrDd0uliDC5dMM>e*}Wz6f7shFx(!d1}>P z=`JhOZ*dxjDla*~ixG~KDudGMdU}SV>Oujf?o}Yz<(>~yXuRu`1MXar%}Byt(N?en z=R;@QUL}^C)({s4#AC=HtYVE-|DM;p=F`W@sw-lflZ@q|rXH>D_lY2L#wc(g8 z`4epB^;w(N$E;c?C@bn*fl~JBql$3mmHv`gsp%xOd-SlDLHyaog0Q&hrY7X;*Z0e3 zF;L9Zju$j&uTyC0FF|ma*G@*rqLK5xNUkeQE2KA#my=k<@RN4a0bQVzR<9tnruXm4 zNl%1J&koIuh$a`B$h5SdzDiFd;d{JOcl}Y*K{5^Ss$s%BJQuxVim}e?S|^V(G2k4B z;_2z>outl5!@X~8=1iDC`cHgcE^}IkGl!TcdLR;O>F6MJq zcBVDF{9iHw+wTNV^dCFz3>12ls5NE8gN{DTp=MN6Ev!+BB-Y1lq z%(I8=4KMci6VU&hETH%&$1=YV-Vt@R3dA^V*yp?ZZ5nKf;j>96^_g=ZC>Z84#aStm z2fG)hv<3NKxHh-k*`e|55mG`JceaM6FF2!vN^VcMQ52^oeYmVkb!3%;9u;$?LtDY~ z-cYBSy^B)*(`FT&-z9o)eO}F61uD}7f{%b4H!|^zXig#Y?RqS3n`ILsPC7}6e|j)E zQ#Di}{+jYiKBv|(=%v$Gu12A)OGb%gZD*z)x>}SPg9AvZMNqt)?=EibTyY2-wx&?O zV)xr*WHn!@pR|=tUFbEg#gR?g*EtQ6v=j;PTn?R)cS*CdX^o0k5w*OYczHazuYz-= zP|0w0)n=(}6mM|4KBT|KPJ+cC*&1c1It6D!elB5&8w?B_O)(<&!xbQhLVISSFM^nnI^pdO!^Ym-_LvH6LQJ_?JnKf9q-x{=C4vBk0if(Pf(03e(B6bb(gfZRIA3T zTQyUaPvy&X-dA-=4?&xkgu9;_8<30nlEr7p#*a4{8>S+GBoa;Rw%X3d_<)3pJa3jA zt+D58Vc?AeakH^XKl8E5|LekeNHA7-wq@GO{q;`=Xfi%Y!9RI`S;#VLCFhsANk4+J zvx*}qYtx~#B*tCA5cfc?N7E~?TqG4)1%j5>{exxfE{){BX>i!fh}MS_LU2K&a-xSv zFD9YI7@TSFUJY%rmn?xamY(xj%fE;Wurc#?7iW2}i_hnMcL;2@g>cAxWKwB@`)O!y z4&pFsEkUCQGv~C!`8zXS4AXA^y$!@$k1y<8=7rwKDFX=QUk0PC0oev)(7VUv(&w^w zjZIY!$Ee#9p0}Oko2b1;?qTa7nr3QB_ArQ(t@Xx)2T|*E^=`*_J8e=_rR28B1g||( zWB;FK6S`at{wJT{^wkb#UTGmu!%6p|0^}wR5_b543I) zx8!_YSzcPyMq1d)O_M&6|9pHWGo*zF|Bre{H^G+a%Og_?`7Y_?8@_F9AU1MtycWo#xrb<@91i zlm{GU{nxf_qxaXEC@q($K1Dyk_ZGXf30;0|Xi?GVG?p~+Olhfz3wiPj#Q=9-C*LG# z=#7Bud)?%8O|)8JKzR5X`9jGqW6IG2DI8~e>p?9eDtWFBQ)6CnUqagn3qEL$gmdeq z3DGM-;pDY>FUlGR5diT=8s0>EER)RAd7@e$aI%N`Q$*5F0=9MB`y z+CKE_WAwm_?)Eefg0%h(vx4)C#gVJ^&mdeXjc^pmL*MG`ij}-@*0Y-dpn;#b-Q<*ErQHM{Ftr&EoA;L(+{e1>P%(DRXOpu zJ{NzdoAcKRqzilm>=L8y^?_|cf!XR3Jp>Qd=DfE~n2dh6-Cs6)s5)uLJwf=Y@hEP< zw9Q9W;>ydXnWih^R(P?KU2UdnG(85uEXCa4G_V2 zYURcI+h4QDGGZ$08~wPvZ5@c>66B+-GJBZ|5{reo>aIL#{zn0NqgRV7+2+r&_fVOA zj+>Vxi5MSY$7k^K-R zsC(T!O{Xrer)PafKkd=`)BK?IlTV)?a82fyI)r3yX+@F+L%lCVf+X3Oh7Hv_tq_5n z1Lid{nXy|{U1xj}vCDNNNROjZ2;bJ_BothAQZS zhBM~gvyi_~OrA;ed+wo2lDWE+GjWm)rw7SCz0I?gBA<0^^S)if^|Wu6VyHfrgJd@C z#^*xYf6_=LrBj4`S>g+K3x6!6W31ASUF(`xE+yvohB5;%7xo(tQ}%C29e(REA|1Up zyc)aEUND<{G>{lg&+vs$<;uij%0)n!?=Ebe>ihx-HPuY;MvH5|3|-WAX(}z_(-VEz zm$?ki$3#OaykZvQiDWQ`vk;B={QS}_n|Tx}@QLgar3e9CrK`6$&5jI-LpNg=r0$?@ zYucFlzr`P<-ZPre($dnJo7jqoqt`zZxSK9NM-e_<3(Vvzby^}Zb^pv|#i_#8=M>J$ z`eGTCo@xy%{EsMuawIBGRr`U*YHl~hbKappuIP@6wWpq@3nj)sXBv*Knf72ys-g!m zs~l#)x#-t_lAMRJeNAhpjU97niy65vz04Jq8H86mcVqj*vhy8L%wp36l=nny0Xc!^ zeNmc7Sht#)9!Lnk$ew210_DH`hW?2y;8qF*jzLVx1Wx^=zMVbR+lNg)BxFlp&9kUK z9TIkgOkuI<`?FZB9TtY|?fijN5@X|3OKr0;fA^i7pmhl>F*_V3o#nPiXuOQ7iu(RC zP#II*JMCqqDD1cCFIo$_E$2T_?{p27CFG3?6ek&EDw(VY*>k!@&w>-~$gjJscVwlJ z$u;d>e(h2GFyWrGK}v$#0z#?U_QFO3_LB|-A$LN)lc4yP&erGoL?XY(x}dM3G`ujx zswjpHjUPa4KY*2V4rwgwI>>ygSMz{1?f+R@Cyg3S?+rP|f4wQ~Sv^E9fx$(!)D&H~J`;h6Xb5?ciG} zo8Je2iBNh8I^*vuA$_^(q9xE4=~$NSC*qyU9ZBpGui^U?+n6`#tlJZNL&k~nlg??- zct|&z3RH#+HuTK@_H+iues*Y3DZS5vL3c5I`pMHocB%D(<6?c5nonPzDp7z9@zAYq z&Qr+uGONj#GjjxepGNrdnD@&hjBH5m)u~)x5cTtsil88evV8urI193ons(Oe0CUd0 zeNRz6o@~TIfR{|W-g(7dmKgYt=f};c0hupwRzoYq+VJ>==nkjktszNFJjufy(>F5# zzig!4BS6Ht#Hk{;;x5UUQh^6g;A$Q{X9K~(pXy@JX4~ihwk4#m45DmXCKb9rGC|C$ zDx2!{F62UR1Ga0blRos~WMdq#N(`PK;u5{9nU9~TY+4>|{=1rWV{x(K;-r||1a@KF zvh0AZTUnXwCAL|iBRd9vrWe{fABl)_=Nvp>V)j`^`p2mX9M;XGM9l4GKX(8oy~0cm zoW(vQhZ=FXd4+EZrWjH;i=0u3lr~VaNSvWL<{up#bJfP6_&W388qIh|`g&kej6YT_ z!g&A7u?+J)7T-|u=kkh!>XdVM$etq0hd~I=kt7?=lPg)?5Nwk zIV`8MXY7IstQgBE{HT;9A1W4bs&@wHZX2{dN(zGoay!)UMHlDSC4o>k+(o5`C8I)%t=ZXmE=lDW*ode%(ji z))s7wT4;T|ub10@_ph#V&0?EZyVwUg;{p3VoZbF-j7%moAQ?ByiPHjT)!wMvH(_&& z+I6BiJcm^{u4sJr_Cds2YaKls_ooxiE*$UF73SPS7tPTo8*F@)s=0G?^@r78e*blL z)uJzE0TNcSS@(wZ?IM%>O5vOP5tIFlq5g4N${`8gdU^1?xV_F!%`1;@Rp;MLIWut4 zzVX9{52vrwPw?~oEUmt)w=-T3Yt()G2>UU`R=zMYxY(iD;Y~nW(A?=m zqDOlqf6a9=tjx}IhNIv&Fy_)Grsi*s`N_XtU2O;%=5PJs=GG6lyyvVshE6BjeqOmh zu-mnEIW0ibM7lqVl+6jV&#tOn|74wE{HG?(p10ek-T#`>M4Y=CO7HGwR$eNGpaS9= zm(|34$$|y`9haUm*u z*HNl2$S-K~yb_W3K(n+&=y7uLWOt={pY5*50ZaP*ht(fqZ-$k*Mux}UtY+V|q?-=0 z3vsnW>|>wKCH9Yvg`A-9=md5B#?Z2^&_`WLHrJ(Aajb|^a(o<{0M6>eWxBhhlfggz zWMJ^F@o9?M<;GR;?k&kOA>ZNVqu^OIK}prLfEm zcOBjx78iZ!5ESi?)n0>(AzpipueI(w7G)Z=uCjIC^WRF{T2^i=&f1=Kt=e8NpHO=k zp4~RzE8jTM@l8e7qe-X89}Y(*`J#s;C~R9-gJ;O0%oj4M$gtAESQI}|oFS~5xIq;` z9DEi!@LAV4?=&#DYMtRKkuKBCGPwHMvbBjBFlWAjK?*(Pdf#w@XT;y+LmpR%2wIcX zEAf@>16q-UAGHAxg>QWI2S{)~1Lm+uZ(rVUS5-MYM9e zA9}$H#jMQ=xVws77UcW}iL;4JV44?Cc)wZ9afcg6_V%%ezvoo|cU3mY^n$&!1jF|${3an8li z&}OFbMp4AZA7q%h;GAxpy&eV*#pBb%hG5MX4J-EDL18O=+6a6;-&PQ&njIRZ^Wj{5 zTCuQp>D|hzJLdFj)vwV>mOAehLvvL7;e*sSnL4X^kqMaW`_(?CP-c`@5ba}2%Ppof zZ2O8~#ViAZMMnSqi02MAs?vUDL~Lv~p{lBp`6&%XRAadqIg+EYz)38c#b(-x#As!3 zGwiu%K^DtA9Jii*uAuhin?G6Fhtxa>9YPjbL{c)(tT96M-)Xo?>nkEic`f~LO~ z`~n8EzIejl9g|eO3JlWzS)?L@5<-C>orQe;EYDVGf8XNW-+#&~+$Q{v>)EpVY?s~( zAN>u(N0{531&>u6v4(SZ(!}5@yme**KSX2up5}7%f0j=x)O;9XjHr4qlicN2xVSUy z?y-2$(!NVl-xcBFb(>QdZTRM1@=KF|Fdz7ZXKfYh#dG>DdCW~Hi|b3atRr%F_jrgj z9YdwV&(1>Mk9Wx)b|{~%EmjMbyy4CFx>+qD`yM_Ahibl5sjLmMq_YhSHq9APH{8fx z|Kad{&V4-0p~hYsvfWgaNm!myFS0c-SpPa_=5)LyA-)&&b0`!?M7QL}*Hm12j%{Px zAf#o%GWWQOAPqK_(66u(5%aY&EA!^j| znu-cLiCQ1|5?ttgRyoY*{`juTNO6LyCp7ZyoDgAv zje&vl4YPgV#{%n1(+;0%!!_q1zGrBid~zp*UJm@HZ9g~nx>6d*R4$(SN04Lec-t>t z)s6m_2hzRr-&*$lEL~Ku*w>qyg(cd;m56f6MTQ3C8RB~48f+yl;eEoo~hQD zG)H4AaPlUn!B+0aa>`*;IvF{>#Ng`PGwmP{Jlu3&nmoTE)xVTC++5naxHI_a8L5#u zBj@D#alf9#izd4%4ucmzr7yo+oX8f8N_23e(umZsUCEaHzFUO>Jr43q3OE|x-d=}L zAQ|3xpX@i8T-V417Pwzdkvw_P*~o-Xw_hf-^0&<#+(oU5fgjliO#+Hf-Ct`Vzf&eQ zA?OZr)B_TUiUO5+y!L7D>+)eRhchT~r3t$p8=)Ul({rRo2G!R0zaFJ_(d{)%QSO5W z5}rbVLR8{{JKNOF3xn&+Y$P7pG0Zt(KJ8Uq#G&y_(w{N?>c@gId&`Y1`@+^vds?w4DdMfNVx$05lA z!a((#Jmejf=BEsZm#1eu3WLFveW9g+tN1Et4O3j%%(P&TM18rjvw5c3}WX-W5LJl z`#XngABtAI;Rr@JuN5089J5NZ5o##qyVPvl9I44`evLh^w>CAWwshF+Jf!$#uDbfQ z6CQIP?i_X025~u}hqi>gfxpxmwV^MWvHSvjFs3N?Jr!XbnIQkgs|Wmp9BOe$jSR(H zjOq6aNJk_&>eJAdGrj3PwRgX!yDgHL=m&D`*|3SIfdMV$H&t0V6kBeGElPFqI3}Ru zqt}27t)?yT!kP}vVZ6yqo4Mf=oYxIqWpjjMP0?6y(GOrx=I{SHsiv7r+hW00X{u^X z0-sdM(jgum9{NL72njPQugvj!)I}(t!ZKFFwpr}#kU5nO@1O6bjTveY=kJ9pKu(#{W^)6sJsdqZUPgXM}(7BH%G}x z=8(TnAQ-lHZdw*Xz#T!Xn@QA!um7bDy;lbNNL_y3esEg|iLE0|zt_WJa!PsviacAt;)ilG+BLa)n^NFIwd4r1ux znZ%Dk)W%s2o!iWponwZ_RDbvX9rNKr;?xqGfQ zzGpQS`W3C(17EA(z{RqY>uhSjYv9orH}Gh7c6K~6>s-c+1GtuM6R>g@tyoea9I|L>QfZ#&x-n3j;>HjTAf9!po|*rXlFhKH8|mGt9tUj z`;#>$Is7DJ{RjUL_iVP{$v~e&;^~!`H8yCFKM)%Mm;h;HVP}g8)Iukc^sYe1-+?4KjT_WY04X^&vE?aEFBZum|jlNRJ&Tbu~q=F3uzUipZ;-$H2OfRt*9_?wjrE~Dz}x1FQ0t{X1j?D6U?ro! zl*Wgqb7*3C}HN>?{gg!zF==lbtzD1p{`~E(YzZ8uv#>4V+ zGYWXRP?an+#wuj+U@7*4&*iiL5oAYU-5xMZRQZ>NW8X&bkL!Plr+76_e_RnQb6U zY5lUFxyCKkAxJY^18a7m?nu7?(#&ajz*ofn^>ME+T_EGDEXWKO7m+`stX%C94%u0h zON<$B6_k`ye>AuDZ(E~zA5~{;>hwYG@6FHj^6!l`yA^DKa1cSehz#@`gN!4o%Tv%l zC)O|i-$w35MY^J$lMv6pwd;@A&rkVOMg#!*&ThQYl|W+}Jt z!dW*4;sd+Cx!Nk+I1EAUVGYt$>8F_Cd|t;v zHWpigX20!-Qd#l8GkKk!5%OYTtyx+E5(abU^sEuhEr8*jO51W%+!=XglOgjsd$?&ojV;iy$(je2>PZjXCFWwW za!OFV1qKt(fvL)1f;r+VtXlXWL^}l8&-MVv^5EOApz=A0i~QkpeCeU0oUS#Z13u#q;_>EQt?6dLp^Y7+9)9W{vO=&} zB~#X@TPtJ}vkfd{(cfhSX6E{ere13v)0JIhW$CKL=IiTTym(kmQ+W^yp;ngYW8>T*StzxBn zIoyi=)0%vcYd5|6dd_B-CfeESLh`c;#{9}rrGSxLzwe7o2&w5IZj7)*YX@@W*iANqTH zy+yIG`@VjDroS%*Mewa_UH<=3X9Fe?(}ep{8JJ9q|1$KpJbi7I2fm=|+(?X(b)v@; z-lB6N7oA#4tK+9u?Vl2{6UeGk_#@YgAFo2dAGs($9*XRZ@XftEJ(&1J`J;hB11rQ; zx*VY$wt$T?vI4h=-f@QIqobh+8dg(79z7}iU-|5VMr}pGuoV=xg6^XwRXPwo-58=y z$#)g2YEMc0DRB?;m_E)Ws5{_3mWGlHCq88n|K4+os~K!8i) zPd4`5b&U0)<(iu?qc)Q9h#gjV)&~2uV__%91pwCFYL+Nw9XSD`Q293hN3>zMqDoWi zY@`$AXlrJNgi}s6sE8f@t5R71QYOvNyg$`Fg5z3KliiH z!+2g5d2R88Q)EI6VDvD6pJ2t|;1YRG?EhK^{ivscv+DDC>Um+e;k8~J?Z%bDrO$ak z_?&8AuzH{NT0?2t$2I7A=g1cN0^w_l2Ne!LT#u5{3PK39m!>RfP|EP0i68!t=}?H) z@`4N$7H=0p;aG{g*!Ni0lq>AA{UvUxGOL4qkS(%`j$%fSwd$vaaoeW@VJK*zYA0L< zz#RQBTmec#`jHtBrkxsC?zPOX1AF=ISIoT8?XqGv{J*zh*k>x53FR~J{X4?X9Upn+ z{cN4JpuYsOY>Dc(zn<`xobq3YBFDOx;>|XPGCO7{qu0uBTn@oJL}6Dp`5u5_p|^%xTMvgN z!^Lr`&pR>?z2(-ve0hw!4In$lLFZ2I^pGRrFXE&u9`&H+<=b`nTfRa7g6w9-=TEzT^{oAZbltTf}N_PpY%S%MHHnj@nQ-#3WDtIoSg-N zrj^!W0*@K(VU_hLv_$@W`f>u#U*X?$xk85x4-iXTe z;!GViEHYGdN?F)7N+Bv9G%4|NuUe>#S=N1&JI4`xI}y|Oo`YbhDsID=J}^~7@mpj( z4oR{VXCiE@t;5eB^f%PmQa>Dg6z#LyyQz6;YvGf-CYi&R*C#Q&eEt1pZT2f}wXY1-Xa88v&n?nDG@chk6-D)z3qF^XmC=N(_okFqF{JyP9ep*9p9?t3EbylC&A z?Ial@LeWe9d>M5n?auaWZ#RE#ZJc=b5^p!bp7yEMC`ru%$d_McUgPY`yl66!neFDL!1uwe`s$U$!+OfK;cLK#9%OJhlzR?Y4D%$C+33KSv*RAo7+!5njX@1 zP}1)dj`VTnA9X%SF3hR55L<`j{!Z9|QItFZ3Dxb5udX#B9PfN|>S)YKGB#3+r2 zl+&77p4}|v%hJ;H-e-m6+(aV)<$q`w)cufYP|`r{wPfTUUO@|nH^b^blTvPb2` zWrbVAQ0JqL_|;x$&gvX{Gh$41j%z2#_l_w1aHA_}F5sjvR5FniNr_8M@sdSju^fW9 zPI?r9cZ|iW54dv%*N}@EI?Rf|-2;`k+Q|n~1Ou=dL>75QwM2FD&+1{OGM{**g#huZ z8D^wWMws8aakWX*q-o_xBO;a0G)mi2xOdQB*L z!9g}@VY382)Iu+=@PG%Hf-nw36CE=&M{xGme6RDIfb%IOQ4)0>ZRpmL7o@3;*O`Us5k1pd9m#_>gg%`;;&aC5-e~G-ka%jc+45fVVX+y<4KNPk^An?)V z#0Hb_x~19NXGH-F?E!oRE;&Gi+@#vf@ZnmaZe53`VYsSa<0gyt!~1HF!uP-Fssh6y zFC-k_HPk`0yS0jT3d)oqMsOR~zG(Qm2p^PQv%aUiN4>D!LsVywfgu0_wgR%IUpm|@GqVn_O}_WCaNzj7(L_q?p=32&)! za{TxjmC0MzusiYJF;@SHk3YnqCzivRJ*?Y+LSE?QI@AJG2Oh#gUy+LIkEZUin$q}R z{YP!~jq-mMjjpJJqWne%L*+iiyrSeV^sIBDriyR|5mjQPT5(QOGT9qd`7oAjp4f2$ zf#z1^hoMb-``-Jsi!CDG$`Y$@GB_SXw?rn9M^3=;b=00Z-L8hUj+!rsmfgWZ;n*M7 zCgYD{x5baTBUW_N=f`Fz#nTVHvAb|HEamVRH!))c;fDe$xYGOn{x>}%eW)8Um9LuQ zEk(q?C-8hqTdR@>NRU`vHh`n$PJAXw&P&)M5AJ>subuuA!fbC>O0*gk28BeLmzk7C zNTpI*{Pe_ND_SshWrSLSULzV_{znI!?K2WHG-mzEC%k<}gB=tqVlZ8# zDG)@>rDj6K)~io%8wROZ#eP!W6Sp*F6!ZSC(s+(%qNVD~!6;r!rX>^;2-DM5KeOyI zV^^xcR$a~A4)lQQzUoXvr{Tq5GD3qGucZv)c2JhES7V`JGMYC-LC8oRTRzy9WZ9?JNK6 zHoI-k+G0=I8HOlWsCqEBwCZuC;Rb+aG7)YC9)O<%>jG%BB0c?Vjp-blD_MTEXY2l8 zT)Bx?%DD;_-bludpQ?pIY`T>HeMe~8dnQmSeg9Q88uRlZBbqyUeh8&(w^WwPWK`j z(?d=-hph_oSmVC>I`2Hv9j6y$_3$mp67X-Lvmjj@g{PV~wx>HUa~Gt^ypvxt4|=30 zXH9)&`sRF%HCz8;%9Koz(tMzCHM+IUNr^RR6@&8X~(OgCOK3+mKQMyMsS8@pu z|GLi%yj_$x-tl6IViwR;Hn@*JJkM9~!Ht3@a)0Tn3R_B=;OSK)PE`a6LM|+vE|t|- zTUkv@2I~_ssF;{8LRf_`%`Z$bU;hc1g@JO&y(w0A_qG{1a0y6~hC@+cpICo@Jb7%m zIyg8uUNM?alJN)#Y%f7B_GmmBHTQJ0T@H~b0Q;*S8!IhQg$=x(8(>F1~ac(8OCtZ$Tv)Epxx0 z1ytC;;r!EUfTq9ks27oh6!oV!f|5p{{Lhl+dmhI=FxtpUk$gf(yMebix8|PF9~#mu zK)fRM0P5Z*GMo&Gk8m;NO$AkE=e(TIP2<&gx}nF{@QwI#>(EF2gL7u4D2#R7^Xhr8 z%|Bs$y9lZn*@wW6<`Lq(eHjE6ay2oiH;}oz&*)t#2co(--tUMY!Y+CIW>$<)-+(a6 z)Jv9jvW^g`1yoN-E7y6vdcD*?Zk+gp_mhvmuXS8!DddTH{>d^LjR@56-Qe;k>i_1N z0s2@l-|Ikw9zruD{Tz3KjY4v5wqZOfG<0*B$qGk&brkOwB!t)}D4pEacQK7D2l>xO-$?37;40_{X#M&8q%WvL8MuH%ryB z{xA6FT6pcmpAZHdn#HdI_)r1wWhNy2fN;G$@eo2TDniP*r5@=>`cC)Mgx1A(D47p> z`i;Qql7OW{oBDW9p5ydFeH zKmI9HrD&$c;|TYh93hDRe;ZXna$W2U1GSqgfz4-6f>4A^@2&kWZ z;9{)cQMg=Gz>P=t$y1$*4`S%x;jogKsB9cL@4}txGx9B!@T$qbC05oJ+s>0*^m+1+ zzvhPQod>?~BSZOK##oTYPRq+6%WEH0w2Bk1({uYaMJ!zzWDSdjt#;?se{kmX%P9f` z+D2M)zD(O5NK=z&l6bCt9=Cda7340yPo9RAG-4FQxH=0d$IJgHGo2>usESvZX(Q-e zRV18tn1NAk-q<56O0&SRdJdom$v=wJ{ zc3#rKU0`C7Rc#)ZU+x5siY>7>WWD|ke}G6_3-{`1b{-$4=RfF=2KAHn5GY7|FXQFs zrg%QJmHx#=T!!Quvro+ej7It<>zHz=y4()EytY;3EV~w`kYp14ZIBdBl|xt4@}hz|+Ykcrxy>9HFS4S8u5srFrFU)=OwAFQGfvf4=j4OLvcqUj_}8%Ju4 z5w6k-@^q>B(qrRBXBB1n?`1F2%j=%U(L{C#*U9lJWOo)y&YYGg!{|c{0#?=BswDk_ z%#u3Xss|D`6d`EXGqy^hoswJvgvEBvIs9Yduo@Y^`_IG(P}=o#oT{6m_*=+mKdKCUg(n(9+KK=6=_M&58_GZRyFkQ)tdzf2{~{ zQ2LX#>bn+=?o9MSYcw%b5#NRGsAG;~ofwG$RwS1U+DK`x7fm_U8q%Bt%Zjr*0KYyw zL6zqAQl6G*KbmOQl)>t6G1BYhv&HTRoh>t0$}4kV*)lAablB@MOp7b*)#kj*{dViTp$@j0XG%%A z>#4CSr$a#hh+n1m4?QkngP6R;AYrQk@rjq7s}Pj%`@NNpKUtIC zOW@v!zC8!fMI0%9yV++gD_^z1Rff;UC@eklP`eXXACUHq>-u$fdq*fs5lvR~Q8fbT zuTv{7nZOP*vR>w(FOQULZ@lp3XbFteQ}5BHSm=*h*M_)|Io%d1_ds9v^xgkjhC zE(aNx88ctvjZ?loNmD~uVi~VTN89dWbI%;omTqa^)T@`uv=@>Y=}*j@J(mZqN>>yT zQz?)Ev5k!QH8U^z;U9V_C=}T~mxaBkZHO(gu$AGr;m%7>g~9ASwpK=f;|**<810KE zp>-ro=Wzr_4tt9JsEISvq;;U_fMTeyjn8`<(ot8%gdkZILFRUnc={1bAxZEJHSRP+ zc&Ij?Tw30rycE&mdT=_MNxzR>+Y%MGBa6iP9dTJX6rIHqWA@Zo4Ec(WBA5`&sCyPG zuV>Z0;(i*Ah;b!vui%TH@l2pOexW?u(A>CuLIqVbjKvOgL`PUhHuuxG>Nf5qFQ0T& zdMK`gD(7T-cT04%FSjG6OF>kfpz8u@@k%3I8YB#Lx#MM&%6K4VTUk8Q$m6EZC|are zRZM6VsXoJ0jPmvtSZnK{3 z3>qfAwJ$?~+GfE_@5@&(@)508IM&&kjM6_bPRg|qnoA*w5%u|ZnOC$9oy+K- zX!3o~usiBd2GfqQocy4N(qs0JQ~J_Lv%q`sp2_W^i;FJ=K^V?OmnMEk=!<@8sKXDfcgMc zQG2Q)5M2AN>U+QWW<>yw{q4v^GrD5cuB^Ve--o3lu5E@lOr}X!#BPImFlK&MMpv#! zU`4y(tIHOtxCCCv-)qn>L#G0n;T8bg2uG@|FlFj^!WorVb$(S(5V6bB%+H8^&HwQC z-x*v@Iu>wuA<)3qbcA~7wPAydw*OK`k>{-wcZRtYKVi7eEhUlayc)uKuW!M(7Syhj zD1wMw5aT9z4yIH~syCdVn(&rQsNS0?(=dvHd>EluOII?4nD#??<;;+|CB8DgO4F%h z6RaKMJ0f%~`5h2r(!^UY;sLqqJ-+M^$r9Okws{vym=KD<@+0z9BC59WOtk8R(y?wc zg~Z(h!&h#W8i{pdS@d+t{>%6lPx%%RoXSGCZBe% z3Kv#7YjLfiH7H6<+m1FMn~lmpBq1Hmyj`~o%LGYg1(&Fs_l&LsD;5j;XB`6c5zM2Y zquGTEN7PV2KI|FoUZ3W2qJ#CxI!p?xu0U_u$ntK=tNaT$t47|_C*SH0p{_BPN2!8b zNp&{Ss$aQ^0h)Rv1@Z7KLYbk7nBYO`u5=PS_7d|pF`1bv>09Nb1@=7wfpUcAS8r%Z zH0BO6qUbxb;-=rLIxuWk`Q-=Fd|r`{>`dK=bbj*NAg!-bX|E}EW@?11YPlq*V(GKi)&dAw>P0^SuC_fVReL}q$XX(Zv@M_ zW!Bfy{O$Ahi5)TLqR;3aC9aN2a9fRf8ZsjN+tBP1&&>?;VeyTMQvgX`z2hV)D{SNo z`2+D8+P4JMn!zkig8UBaTpqD~IbDEio8%J|?+?DznY%1K% zRAf390m*sMK}ERuhz0-XYWK1_8@)<^kB&0cp;F(YhVQyrg$#$Xm?RJ8v;OEE&ai{N z3VQ4yP$nD*8#|lfd6}8p5pE3YJ8}*x#7VqP3`NV%U#T|@RYhn9RTxE!J0zclxYAAV zsJr~0fOO^N(>pj8Vm_yn0~L_@^m+tN{iQL3t82q`b9RZSbVWouS6nNmwGtUhMNDvT zho*U0)wP&#v5_WRwYiPqu!1HW!NMzhS90!*tf|3jwfWc*KF3U{zzNBwALuMt4TH`-M4v8=-PNrJ> z&O)XXYm?0`gp5*pX-v&;&a;IXAzaQv7BePT+kTI;U@@WfkqcH`4PoTK94+L-8KWt} zGUhX!r(KkXtBB4EA)=n$o8lkSDpEAj)5&qku*9-aDr`b_>Blc7Iwz{vh)jbB@ozqV zG94{>J8tr;z|0vx(h5eGFV90=7OT$Id{`f?9oFJb#2F*(DHhzL4SBr8wSxwP>cW*)ExG#QS1&?$iSKSjat)0vNJ{Vl!zH`5=r~hobJo$B0rC3x& z>jD8w60btor^U5g=-#W$Q;mx#zjWVSj%_?-o0q#TM75&Ie_S!Hn>N%TBr2R%Orw8* z_VJ5#@0jw+kzkcSJ+6p;c^6mc1YSj#@U|J9!@Nu=Lbe z>kl>OVGcSAC`YmPWws(Z8tryY3XN&UmgHKLE3#S=wugKug=O^fJxX(QpW)T-Qr$-g z)vYcLUQ63$6z`qQ$Z4qdvN!~7hp#TDYOs$!;9xL-48|Pq>MYobNoEBu&K4K-i;V1= zF_OFELZ$eL&Sl`!k@l>E;0G{T_;{|gEdpy>mfDI;g0i-?zQ0?Bu_?QFr+U~Ghl3sQ zv(yZd^297waURMg%FtcGWq*w9^&aYwDJ(N-LU&Latjx38mKdRr+wyFlI0zUKm+VV* zFBST_6!z~`ab7{W$gdK3lhksRgJt*B!Jgt)`t@d=F2kWRO*O4na2&6~Y$zVDPhop;vuQ&ca`6wEZ?T^u8iCO zOdh6Wc>k%PbVpoz4io()Z?b|KkD=bP zOWSb(j#CSFE8m(SJ&y~je0urc;e5dPJ1icx8kg3A3|eFlgz53cD>vAnJWCg$T`OYA zP)H-y%|^-`0L8FwS|OC87(6Y1%-9k-g>O@FNA)Q2aH~d zGtOi5F|PbDJ_V&8YblPd1-uiq#>xWP^7#S_hj?-maQtdu!r+<#inH+-)|yX-&D&Dv zs78xVHLMK~(kkxe^sU5RV9_n(cL2EmQFaDKe;pa^g2$noI~SDWESeQB`xvVUu@TzL zfrvT|`S^X|XM@w5nr1Hjtua%#4(PbJ2j<0*u*1kxREqf}JD(zDth!1atZb}$>!4Lj znS_Mfx94#UQGUMpgpeCYAx~9a-d6Mn*lp#&eIL>Wq_(Ih@9$JK*(j1vo;*pb3tv z;n+6EO2Q-H7`#dYJZ^bK(3FdJq@OdL>{BGe;E^7t;W`(FcBf<5FeX$}ULM-J=Rk5v zp)ez;mwv1u;*qFe5ju8lWP)acjWaNL&;IvUdxZD@-e&(Yg*;>Jd;u7#V~hSl+X8;u zyS=Hb5E>RX#%9xj(J6i5L*CNVKe};@tm}A|BFTdI*|#x0ZdrD%27b383aRxeKfswe*U zoI_Qgo7A?}{D?bc>h1Unlsm3mBRey%6d%!Rc>G`5y*KAckK7N)A3Ow$4LZ<(J0G}& zv8p#nGB8g3*sNH&VgGF&XG4R!_`ijFy@zqsTRK%xZ&#Gw5AzsNye*DqpeyWoG491g znN^WXq2`)ZNh8hG$GbE~>f8h<#b3*F+!=zyGm3lwc-8`ztQeS*^P3{)b&Nb$goLiI zyQA`a#8*2fgFmj<9*l6!>0KH&yQvNp6f9ba#mK7oIk7g<)YeJab?IRhn z5_RpV>%$9LobXU!CjP#(d|@9gc7NGZYQ7H*IIKZS2C$fcRt9?USGO6GL9M^F)swsG zjXDP=ADAO}0G{_li51OKHySV+7~>QKz3mn60hT|JGZi z{*-Q4;4ft)8kE-vRn+$N2 zz<118w^Em|`ulSrFwJBqEnXo(BDxz4@Jx%Qk~jY{r$FuM3wMRX=)fWvXRgoyM=S01 z*w~mSk^3&x_vy=rp#He%D-xcAtltd=Y|797G0u%>*7+xx&JzdFk7HW)>E{G5oA`P{ zNJt0E$JF0TYOqb;`5^n2MDx?+Q9Y*^!<$> zA>Q2Dz8*F&tPu>%`&?e%_Usy?FZv-jcLVcMpP2GQJP)*4OKbWWZt1GeXTxL?{~}s{ zwi{#iOQ9xOIT?!Jpr`*7-mtg0-y7;~^G78iEyY}Rc&8D=@ijjBXFE3M06tbfYMJ(| z{E)s$Pv2a5(^8nm3!$3(yQe&$q1WBu%Qkvl86R7rSi7*`4cO>yhtKH!R0gGA{ZzLk zeOxqMH{{ICAwn&fPm}$sy4x9@#lGEj6;36T>-=^=2D1htJw~VxESGjfqj^}Yq?N|w z@mkSHGuilnfB}pIQQS45cck+Ir3)(5KPp_$i5UZNfXkLp*VrUh3xS&o^wsd>*S>z4 zn&Pf4WXYtyaQGxr5#8Sr0-6KYyQNNkU@lLZ`reW$qDFqYp&Q>j(-V1h*+1{OXzVes zAyhDw4zKE#G2R!;2T0GJk{iR$M1N;BOpQY9u_nDr?|hil=DrMQ_12BM3nG$O>F8bX z*f)#)zqWKdnYj@>uBCUw0l-cNrJ7xd6}l@wN!9(Q^76g@58}^9n^k$CsEELb|2rVJ zH$T^?u)-`me_5ZyW_!e1`v_pKdI{RPFiR?8twJ`1&2*3aQ%@4~vH z=qBk4N545EzRvKmCtJJG0&LAP3&1nt?JhH1q3ogc)Y4KPSU27s?e`bWbw*Kp&l_`A z(tkd300`CTZqIW&^H2PBR_@b2>jS&w&APYaF+sf!O{H$fg}rZn(KiaZf}jl?FCd_* zL%dJPeqHT(;W4uAZr#XW)r~r~>fIg_%Ii^Q7_F$!!6^S|?g~#r)MTBkzW4D0aM`L> z{7&TVIFkh+kP9+OuQ|u*2p>;9Y)n#|8;$Nj?|yWXgpEDhz1%{9jlyHfuiEa(8%N z7@{l#2v`BsBjkh(jbC%Wn81f$QLk{^eSr3Z)t!+3vYlZUh6v059Z2s2<>!k1w?2_e8i zfr^ZLPw?{cvL#s}s{SpJGosNXj7+aK8&$}6ql@!Q8UA~hG^Uv`flX%ZOpXVCi_?I2 z1{k3?d`jm7hWI9rLNzpAHNnfv%WHK#JA7&gc$#Sa(HF=jYs=b(Yb7z#@Qo~eJD7MX zWDcvR1%%m$YZ@R-@ilAkD;mHo0)y2v1Yr+xOpvx(idfa}(8n$t=D<7z9-r2RE941`C60j>YMy)9y) zHS6NJb1nKiqz0&RysZ$?9c`$gR`@6f{YZU;iNKVtL}@Mkx_*9v>E|~@5l`RJhg(2ujKM2AkaLJ&cvJh(C5eBtHwLoU~m#s^~B6lu0 z&wtEFcgGe5y72i&FN3FFJ&prNI>GZ5n$5f6KBn&3C9J^c zO~~umy~9<%T;dJapy8~K*3zx}j(h4=`ooXcl4UiEdxBC>;MPZck^y?MTpV&L-3cG5 z*||&&eu>1v--I(Z^mQ*dsLA_?L6>R>6g^(S@|Pk}H*ztVIJ0Qu)&AtJa|xmi zF~g|8OCuzQ1Bwb9F7!_<4FriOW<9jZiST9!_wh3l+B7Y%o-kN^QE9@tAU?Uq z#C7^%_Zo1{D--|Gwc$q+nRffzv0Y=KBE1I>qmuUorX_?QVk@rVHP_B~%h)CTVJOV- z6i}#s?45lO4K;T+WkiEUxteZQ0C{G>gQO22;@ov_7CQ$o^GsR6pt|mlxwB;I0C-*s zd3Tz+rxGNLMJ*ziD*1aivzUa7y)5xh&@tB@LtGzX11Lm#Ok229+R2x<(cF9E5pkm( zd95plOG|igA8)*>yGg)q@+b}n3sa<kU=M^PF|>t`-K;ZHzaPDiFejr5Il zrj$zSuVyR%c+Hm+DFnpyGl)tP^^2kLQ*t&ELed9h+NV_Kc<*t3+(>H{O?0Z*SF)vC z$yOCZy=aieR8uKZ!C63{k^qDR=2HduhMB&}Rn|5XE-^(Q;W221w`WXM$&uxXwr6PjQ5D4iwbbwa^upaACLY&l)YtK zRBzZds-mJGsEBk(gQRqKr+{=zcMJ^!0wUegEhRAw-K8``$Iu|%%?#4-M*aVO&vVXs zKb&tfe1Ofp?|t3tTGv`@$9iA^BgbHCXP}c{^14=j!(>jh5-SAF^xUSqla9~e36FN6 z2+}Yw4NWn+Y@AaW6Z(2_Gi~=G<Cz6hUf<^n}PZR{T>|i+E-|6`# zZ>>h;i?s!QCuqx*i>C(^p5J8GyEK;Z+RH9WcQbN;x@?tP6Uj7+6d|IV{NWT?wk9tY zfz;QWAp-9Zmp9g?|d{d}ULrJh$ zrc*yNP&D63Wn|*t^~o$>8WNIPF9U#kd$s_cN^Jez$($emY-f08rltnE@TT6e96U_q z-X8M(B5~0CU<0T_fL~*vHuH*C9hwCnS_p~ziBF@zkT9fR6eKSRT5m|()zc&vb zj`F+vLxYX;9zH0TMEHDn&HALj^>LWjfe(0*a8=MXmcLRdc4vQvpr%Qq*j_8OHtpK& zuAdWhUUe@B=~pz3-m^H8)z%lSBUO?v&RJ9HsDTQ=D$ZiD8{J<1-=VyQO=(7;sX?1< z?exrYOMiGXj{aMs^?Ud43BQ}$zdH`@Jqs}Xk$7i6X_i!QCT}?AU<@Z-nD-1NxfoIw;G<--yi6-w7 zh=fl1*;>4}MyUWPf^RD`?A<3*8;aRh*S!>GQUT8o>L&_;z8_yg$TD1>IC{yJ-%|Mq}htI`SA?p1(T=uAtn;p3J$17I-L z55Ni7Jt-*PCB$wlP~Nqcz5_H-0KNfs+j+3{p}Ce|91B368z`bJS*PmC6ZCrz{4a3) zM|o-Z03p<@pc60&&scNON;vl~ueY1gu5(o^h5OiKe6(4V1TSRP2z|?Ip^Ewu3&KxT zqTA6y+EFrj`375i0f|a`)qu%wPav_bX0m17wbS%m-oGpMBr)!G((Osi7-}-+=3fa< zc=>mw(m$Pe68l=@A@84(G;bY^vGr4O9B8(aonvc!plfYf$G3MbLx4n!Fo4lSBZe~X zIG9Kx0M>bIU8%P4v$3tf!otGtxQ!G*s`?Lyvw#NxL=8|KK!yagfJz_cl{K<|4U>`2gB{@xHD^|jvLNdHrCg@&$lOv zZ}hnYW%~Y9h;XjUrZ<27fslzx|GvMcL6KC;%D_!nKp6TOBednhY8}H=#JWnQu!py0 z4$Bk%YYowloF{N~hf>bQAWYKOi_d#ADr@=4#D)=<#b2{wiSP^7}X^iL2^+tdyp zlk@-7uZP64-I@bu2Vc7);Ee0$`D0ND1S~3m`y>wB-c?_-3fpCeqJL0AlfaMXUHd%V4eLx|)|MbtX+NifX9?zRg zB54jh-z<;+UICEHklCLXw|db4WVz(r0Y0()UkQIE^j8!lzzjFmrv{pUj_2i*DG9SI zOXH!n^oUmCKN4T`Vg!iPv;Yw&oa!6E70h~am*x`zNUSXo)i=PC%Ll-JC7>@;dbu3? zQ7H3;*L;##vPUD*<4eZQzW!gC&--Moj_xrJ5m5%`Zu-Oy%Lo)K|vXNfB5^V|*} z5dbXxi`aINKmUGL@0&57zh0KE%9Eet&8xDD_&u?EailYX9@=0Sh_T9*VNd5GeICQi3bns=a+G8u0>YIT&X5Au?jJJu5LZFoq@J5(8V-Ccz_DZK)fYp0jL`g( z74uhjx?=9tYqNIdy=niOdEaA<_>WDypRfwymFVRL^g@ly*Y6rDbeN=Ae5W<|y4Af( zbJzNNISxP@gXhOfIW(-ZBf9)&3I+*YzxNh1_t7`c27AfQ4jWe@PdNsIFtST;eYAet5G@T^Wz@@ zfGpY45=g3C1+8f=10|xx8<7{kKR+-c0KcF+Xfn zy2P|D06a>ceuiF0LmM(P;h{B53zfd%q*H;Hw}HkjQ$W4HzM?$WWprZ!oG1cv`u=&h z4-talv$i$5PLOc~fq@Qf{?m7Kp}yU+h<>{kX_ zzVaSV=mRlTfO)9==ba`Mt;^KluZi=UwNR_ETb|cwPqP(+htrHc_^$P$=SNN%gNI^w zjCwQUz;S>>UAt~>=wLX;d59z|aZqRt<`k6)WWD^Z_=mg&y?>W6!>+Fe(|E>eiD52s zBwy5pXrkCEiO+qA`CR)G*YJk{8{D0D8{lt!_!4&h1mj7C$?ZqD-HG*EoVQ|`t&Q)& zcngT+Gy!{g)mHP?)>c2~wT};l!Jfin?;Ib11i8oXXNx4g;K{soF<`wjHzpA!qqLmL zC2zQ0@nN0=>cPnhsdV~F{?_c1;w~R43pWX!)=A`$*Uk9`*aLe5dEs&zn^EvReU^Uc z3XGgKXFG_PN3q1de5%#M|MbpW#KHRqOy1DGNMwt2>`mhVe)T^FKbDgude5NIbs*6+ z!vG+t0330%3^cnxTmCSdESBR@UHc9I;JxS2`0Tv0d0$@td~1JdTH7`rzS8~^`1$M@ z$1x%NymBVlZ6^4=PH|0IH;v^bruN{2NYh@4vRyrFFQ)9kHE>m$<@XTqHPsy}*DN&C zj0LRRU6kP6h%7+88w*M$39GCDr~j|+_#eLt+|pO}@af&TwbGqR6Dd4>`Dm}ilNlT;a2KYq+-%ICHSu4RT@ zDc+4Y7N{Kq_wG>7zmGk2t2d2G0*J47cOE#O?yN~1MME?7%~Fv>y(PeC?`4nAo!2_B z{qO$&SJVL+bOP9}3haC*jl7E%fOl3m-(&Rn{AXrHa}a-|jeJv8MbWuV^{j#>nktCZ zb*NJW835QSfJxmHz~B5c=K+(JoRN=2pW&HP@08Z@0{+k-{{<=jTMYUkC7oGdyJ-(* znt}yfm0G5V9zejrY?Y$6YmleNxrD0~i!tv{R28s5F!S*O?Fr5YE;-^0vB9 zW>+TAsamyCSy9qmCLI|+c+mR`s%Mk~E~wK$Y8m&+11ngF)mOfqCe`?92v5uC zOxNhl#ejN_TB&?|-$XS+2VzE#|72l(ALufk<$LcgoYe&JrArK)`JO$!jbQdU3bV|+ zkNggJDH$&pfzJLS%M!j`P;{cRr!fh)b3Hzvfp&ke^#Owm^%uviI3_3U59Z1ip9h)YU!MLTLFVZr=sK6~J~0|HJrqbG<`-!1Ht< z7PFF)oP1=8Kba?&=>2Ep#?XB)LAU)+%*Q{p&tBPr)5rkhgc`K&!vJ=xbXb4S*0(SF z`YHS;*tL4X0%AYsw9;hqnTvy?vBk4eH{B|pzT~Db2Z^mtT?cv^=^o(1xNG=~rd!A-Q!bGyl3N>F$Bmj6Yx@ulYg=|%s@m~6eQE_s zxt$%k-dptovq?f&y0U7qZXs3T4x%{%kvB75GE0+}uBWjuBg(uLOz4}SBU4?mlTZvN z`4&IcoWRFdKE4C8j)q3~%e=T3#;B9fW}OfKIyg zgq5XL&isi}p01wt-1e^Z)cLTSH7HQ(K9TX{Q?N zDmDNI-wFgilO{Q9p=4LzTUrB$cXh4}unoj2t61&`S0cl;U99<%5`-=w)4SfeoqG1q z@6UhGni$Be=2Z=WL`brVTbDp=KFrJ(QZ8!gG*2f_&+_vdyX;jD+UQc@hf)oU&(fDg zsMI&agrlXVW7>R$_rZFl%c@3XyIl7eHDb%PZS7q4)}6ujg#sb&^d9i-nd06lh(Hqv zr6mHsPDTY8?dyw>wJl;(n@)C=&rn$eERU-#%?%gYtj9apI=!3h9*@)~4dfoTsH%?b z?C_oB0~I4&+>4}`El%CGnm{LLq6XJBj(*RByS6(-$Hi8oxXz&Wo*n2ud!c%1Z(lFM zM7nlC*A9xL7K6zO)VqPf^(uwxZ>wdi7c5F@&SdoE-d0KJjg3L+T_oKhgQwYqNUDIQ zi*eCo`txsWb~f^A=GN88$SVWLoE7IxdrM*c#DtD&wbmJayovC%?3aSQNRC@~l&UUZjR*Y9}8Tt#ec2|#4&3KQls#&^Se3DO@etC){Zk(^PzhD{V! zSEu$`j56MErdUHFA|ezQ=Wy72#U|m2edz=0ebp(mPI+@$mr5kHH5c0Etjze$)s5-T z?oSfRty#I`T+<~CTG?CXfW06y7Eo0hwUjjz;l>gCb@jKsNfqN6;Wo8e&;e*^%eH#5 z@z6nK$&vM5&rU*fBm>Vwm0g~m@}YQe!d>7YlH>n9q60N96Rcht>}|9ldHh6XCQC1! z1~9gO;uAOnLCl51f_7Gi)N~_td%-j9;1=VY>8-vm(qQXJ=`K*-AT2~4LW3g6m6TdE zSW-GamBPmWEnVCWC*o`G=#qtSsygiyt;vEt$$&s`pL8zS0mMbWs3kDjR;lKlpVFjL zqfbxSvx66G%v(V9Gj;Tur%6t#WmT)|5w4`XLvP(iFH;B+TLODO3~cRAUXkn_7FBCE zpP1(Ha*WMs+C9JQ)3Kh+bMhL5R+`M))z4*|pPT_FQ#cg4ZEj8g9o4d#?^~shmzY*_ zAU)obzd663Nf_jc^*eSk&PbQ_5NN=+cB4lZkTVgb`31;Q2%{TZhb!M2JvG7^g9v6_ z42>_YMzY#9o?Dr3tmb)weNHIa6+y<n#S??NdY6v96mV@Q70RkpF`N9Z z{PR+d1m2y|c#{vwy4v<7RZ^kx$gG-aO(#-WON}WDt_ghIL@ueQbn_AjbG1h0^aLMzKOx$;ekWj{hA66t>T8;1pNWT7JWyA6I>FL$XMKJ{!$XC86S>$~da+6Cn zz?%V(!j;V{hBTIC=P6Md8Edt5b(^r`UA;ZspLYW_IG}a}dJeD_jCuT+rfNfbCS*Wr zoJh!rA0R01NRqn{3c$~c17v^{`Z9g7;?Lx&1TA&{C4 zOg^6A2}LZ!b}(xWc+{>iC7f~=h2xBFUh%RQv2`J8E^@981N-NU4sOlTLJ~ROnx6ew zLza~h!)M^m#>LY%zQGj6HyO9Ik#?l}G7QaExT$}>3Iz`SbG zri5zIjuRf28k@ZUk0D5ByonVtGOn)lgITdg7P%Z>Y44%1t@C9zNI%w{Fp<}W4nero zc|q=}?d=!iyE8MgtPR?FIm=Z%mr(Svf>Pm|57%3&o8Fw{T zJgmr`CR>`Ivv+^<1Gu5`ce<{{AwGb+Sm1N)meZ!lda^-DbK}+ljH^DM?t~gE$U<`7 zoP~YQa(-WpWKi$H1d@CA*8E_;W|h0tdPMW3)&$0jH}_S+839XP-ioj+%8{H9%~uA5!#Y;2qQ-=Nj3Es)=)F+2yqDuFY4PI{Fvic+LdC( zSy4$&K~X^vSXd2Dv+fD9XzCvHAW5cL_jtwkAb(=pa@}|Jd;>R3hZa?YEz$2;8bzoN zTlTZfmz%0@YC=XAjW*dFDK9PV?HA*490!rF__31?)%CHcDjhUVY(Iq(oV3Cwl@#@d zj9KYc_ur7O#%l{t69+zPG(FQ!zUZLdIp5lj zs$fwM41cw!maJB;Q-a2aMoX)2>v3NF`05|&h__7LB?zjJM?Hyp8og~Q`i06f*(Zis zK0oP)v9jSLg1S@?lzFj^=orDf8wxCAIe^#^(1Y zEUfQ3-|1obwq2c+^`^OOPJYK0iNhOe4(u%_z<&$#2vNaoFT-EHF!5+Sn53bBy4-xG zY$N>orK9qgHUUOOYd7DZ7J1o%MN#=yTiHM-awnzL`@rcc!rps@vGe-!Y%xvLr;w<& zYy5ln_{pU4{(PgGK}`4fS&F!|Pk-To?HtndvI0EaVq;JPrI<;SvMl^Hvi%;n?VOZz4wEkM!?!Zjv(OMK56xkUpns18LR}|E~s!C$q z!b!ZRwvL6dZiX7qaREb4<#rit8oy@D#WFpk^wJ#97-Ur6G!XAvjPT85*k4`g>}ABf zfv77fi&SXE#h<>fTlf4e`!ka4qKZhxEY7BhC}fnZ5@wHHeSWCNJ>SNrrI5AYh*EaD z_|XGB!YrYdbBB$SG8g=7jwmFz?`sfkHuin6Ynv2e}by=MosnsXKW=xWh(&JYX zAGcs5&-H4N*Wpccn*OFKn(8|Jx7pKF1=2~eRzaR-v11e6M>Uj25wgpWFJohk;MN#+ zhu}AMzO=5AEl+#nve|QX8jfGsFSg7VourEEZMXp{NhjMU*{Z+MJgz>XA%24*(Hqb_ z278b25scK`t5kt>{b|0(u@`kMuIBGRNWqY}xVXG;94!k6gZ|8Et%wrW1t@%mdT}xR z8fSc{6=A3|v$nyS=G_&v|}cL@BM+CstGJbot80k$4e-(np|8G; z2lI_*7uXB#D-pdXjH@0C@5eW?MF&U+3s2}Z`@f&aVef$Yat-Hwd--z%RKvYO7T>9~ zE3_^Lzk#1*8-oOSEUfV0g!MnnA{4w5O)4ui7xdG?y-qI%4rAL%h0TJh#F4%-R2Mzh z;w-9RA-^WexS6p=#O9v{F0&4u%-N&R<(XKrX%QZ47ZReH0SXp>$DZD&eNH3Wf$>dk zjv~voA-`#PuktF*ZxvQYRO`v?PF7c|D<@vf8NVK9zuWXb47pXD$$u&Qq|``do`$z@0n_dRNpx=s5oRYT)h8hJg(dJXj%?TQBj93#t z`iwIUoM}qn#sos(27z`jgZx}b zmB@P$Q9fN|jpsojdi$#V5}_^ZCB~s4oa}fe;#(m>5_u;<=H{sw|cIFs?T)XrW6cU+4J!UW; zw?}I7YT36=!<$5gJoF!HucZo%6u&{R%{qROCZNZjqJ-TB%OY>eTA1$^5V*cc?89HT z7lb_Wnv98tpEhN_z0~S&B*|cCY|PtL;yo{Vpt)8hNdi>!!O*E;Put!NZT3*qe*q&{ZvoK}WZo&V44r z+Dre_gUI~r{oIllQQQu_lcLh4N-?j03hT{a6?}@h>7=DBU*Y>z{It-d#pd*&-epIf zr^W3+pQjYG4e{}>wl_eBwD@pr3xW|z7w&`nAWwq9LPiUOTFJ=vgvI52(4O1v6w>Ra zS-b2yLnvx5(daV06;Nf^4HB%EcwlaC=;kcQ4Jh5576`?!6evwEb+{D3xJDj&X!5Pv zT4*Icowh>YI!VYd91L?3TR89L3Z?285tY)Qp|EFVY{r`t<-FSY;H4W#UcpxmD6?9H#O1tRo=fdsabV&}d1=zrv}xWW2jl z_EEG(b53SC8I@*!K5ie8=WC0<-@sTJI^h%6$v8Uec`V%3C$Q_1@U5VqmY1gSD;;rp zLzO6nKro?`oeW8%UG(<{H0UvX2N^$O(YA5!SN<3__FbrQq|6Ky?+pG5N0gb|cM5Gz zc}8vbJ?v*xPpL27M0=N`&(q=bjOB}IDF+5C=WlG(Cn6t8o&*tpd$09EP_8qa*fmZk zqp8fT^WUYu9WJc9A6K(8@Cr@Z)9M4gna}53g_%QVrF8iCcGPErcaR_&BBlWBVK)3L zPmtuy>?gEobAxYX4fW%{8~F(QN=qwnp%osa;i5f_e`NR=KL<=^ z^u{hL{_^wn+y{G6N3piPw$I9qm6gm&iU-_gReUiTPB%I7Cv6H_bsg`)GDz4hJq zigW*0E37_W+BeH(c$@|pJZnc&&3osvWbzDQ`Fzo*(#+5H&}aj&E%+0-o9S|+|` z?1p}uUxL43^qqF`gUHwm5NJeMi_iwy^+>o$m^3OBa$(j<^oST zxv4?2Zn!m8FXFhCGIsN|&Vt}98#r;G4A9cm)1l-_gpH1uJ!C2E%-X4+=aSbV14nyu zu>K(JthPFlXXu2-XV9ST3;cJw^#(%@$3|c+xAVY8322aj`iSFZug>8*C>A2NLok&6 zBGCA^wzX?8o_!a99JKo55U@t1*~_90tN^YP}r4;G7u z*gAH(OO$g1bJop*6xmGVq{c_-&y!#Du2(fg1`-%+DwpKcBEJZD7tVeOyIEaDS|R!| zHYZ{Wjn-pm8?%l(AsgS4s?so&e&fWBnhLPgjm$=+f6LD46AdB= zkNC`=r{%a{v^m#FJ@8-o!<~o3)sl~-Bevye7P`LbJwgl2zR1>L+K;{WAVfPK>@oF? zuNO7!QG5%ANoAtptD&TD-q$h=i3P=#P?d0-OaByYNow1qEQR8U#N=uw+}d(7okND1 zUsV;{7i3{#i}>U*U!UX~8s(eS3By;{T@cu(?dbjieh-4gR18wa#wLH)0M<6z4bWUI zMRq^uJJJZpfr-yenlx+`vj!gqp#K_;a`Gm}+tlAQZTV8|*inj}cwHuNmx{UoIz3mX zY$Gwx^*5D8F4SUTbI-({he@nU(!eGgJ0Zi2mp<`N7l-X1Yd*Kkv32kx_r(_PNG3n0 zlM68tuYX)${;;=P_B58NP8zSbI9a9k7ge8(o&^7neI8UtpF28>+kH#UzgaYkl=Jt* znNH1wxUGl4n;0Rduph}XJ`bFAet8P%R=MpQ|Jt^&O5aOgnNrDlJ<=Th;A+@LC#rDRsCpNs%x+JeF~$hl+prBe&l$&KG5Dd$0qQjt4Bluta03c@?|+Xt)!WD z_rjnsHp{jOtM#)O4ce&MljKa#O*zG8zA}4ec9w1~3-gTL6NvY18b?*v&=GkBIQ{wT zx0TlXd3;fwwWK^R~-h$gs@4Rc?cetN$#`dYyPYSe^0ZlaSBzjQ?=|^o`sJYd?#O2Vd8`|?F|crMOFS2GIfk8~VNZ#bri5;C9#2$>HoY;q zkzTpRAAEK-uChCVZRQ>Q6};{#?vvE>=IE`Jwdkos5>oL$3`OoN?d_>_{q`REG3z-# zxjG^~8Yj2^_BgYkHdh-HQKpNw0TkI=a{I4LY}Ijbe35*&)K5=LMMG9uE13?l;3pqg zCu#b|$h*S=a%24lPM!#+b<}m;G;uSXmN?>L~QuzpJ&qnT7zlX+f3d2Jhn9anlT#_Dd&~dgOMx#MS;9z6rG2YU+5ToS>{+ROe`NMZ=DMZAEmp*A`7_CGxW^5+0c71Nu`ix)b|4ijT8m&hXYt8t98?*Lx(r?*Mn!tPGm%CJ+S zMr_}5ZpKquOqco`EV;Ix-He{80c|IM2!bG2XgtZ(pUCnpJoP(jFv?O7eG z8(z(<^;xe~>6x#7>MA%@ZdZ(H5Y)?rMq!Uw0yPWkuB zqt03ESezwEdQmC`7+M3K(8j(=sR<1X%`WJZ^iDcbyZX!*_npMBIg_wX71fbfad$LO z{1I1DXWr{rZpuuw=&R$^)!pgDg4+FGu{~NZVnL2+n zhh5M3-H@*J?0peH=&ZCjJ$1vq^uF1pJDxND0O|3^#N6Z2YoPdndZ_=P?uY%CWvPGx z@B3{|&3})jNMhm&u0hbpgapeMs8f`?l1GB1F|`t*H6DHISf+&1Z629wB^~x{=Z>Udpsu8{=p-Gb!4+Xj2hUrAO z`f(1wBVgT%;>6)&v;u;lt|J-EU}9!QqXk^bo}8g9_Y|SBeg*FSG3qU7uq-Z$^)~@QT6-O=7VQunAkee>R2*Sz`R% zJf$4G(&%k9xF!}-%c!AQk3RbS#-LS`t%^F%v=iQg#9@~{?B{uE}uD^A$?(ybw znco}!kl#^K@sBzu-_O88l!gSDbFDC=UeQys(7-&jyOSpd<2Nae+xpKRFUN#n6K{re zqiJtfQRBS*x`z>cp%5y{uiXApiX^mLxh5b4`}yblVNV23SYO<)m^^M?-OR6h9ed$) z%f+lXpsC=V|16p!XuL6T@1DfEzlur4F=Wz^hvn380@6P#b=OLXHwAf^gB`OQ5RvH@iuR(lHj??aSH@d+eLJ7Q{!L( z?r#rzPSZWrGDr#{Mk0XdWu-yTZYCiY;$#@fK?0l zRZex##WwQuabvnBn<|xF7VN&*m+@aX6rPSRIG*Giu@Mv9yF8)R6u$YX*!Y1>Ix!5T z(%>s`fPvvhoQ4erbxkKGtnc$}zMvm?Yu@YB*>kSbXZ^?-9&F5pa@S^e_ z6!blZd#PJ7&w=5=1TAU4FvYg$Ap>9L`-Y?t0ykZXA?%pBd|Dd@P`6L?Z!(wN0r9xE zCmrTWX(nBoL^@n?PfYe$__so|D-PsF%^Y`cm#4VjWBrh3KY!fpY$B#A^7RRyspE`7 z(j=@o%quqAAr}7;b&|2VUf4ej{<0kuRW0uScvQwcJURyX;G|jaSWnn34*Q;f;vqM~ z3GU}t-6qVL0gB!#he@OPL~@|7_MKm?f2y?h6U89k1wJ5n{a%~Uiy_V|7WMxXep z>q000lPycLAUxvJ)$YWDuNxwJ<)JL1Z@`bUM2)AHqRzu$xLzSlA0Z?`SaEau7No74 z0t~~wQRJC;%n$e3aVg4s$wY2d7RdgQO&gDXBi&lLZoU@%Gjjhnhui??PiTs zv1gfE($Q>*IbS6*Jqe}j3B|xDP3!p7EP>o5ZJE?n(G!>MwNL%=mKslT`y+e`sXRkI zeomzv;ljXDDN3lA(4%`TZ$cL*>5s}Fv(zB6OVF<#u&UJq;#q7?Smur6cXrv5Uhya1 z`>5>tnR{0B;j*YZ4uwrY^*@Bn-v3?EoWS6owJ~uXvBe&Y|C|G*og&t?|Ppk+6YmP!xU9= zXwMW(sA!#IpV*L(;Z_x_3+F($k->9hsk>KBSySZna#OPs68-Ay|7Ha}BQXZ7_}{a1 z(4+=~9U+r*{t+ed<=RX#?2(nFk>ZVC$B4h>2BHc+UoK2LSG`xU4{|0u>&y~u6b$7S zbLyB% z`m`iKv(VE4yunEjb2YTWFjTT1^Nj>4P8fGd8nX?Zf7KS%%@_GsXb>^#TIUaKxXI1$ zNaLqSDp@DPeDLg99Tc)vWTJ8Gh=reFAI!d3dgT)m@1;jnjMpm@jkRhb6Q{xR0wUil zCu%@ca?&rx8xVT}8SaDDcJ==tfWsr9!_(5C zCo;E!o5}r~u6Q`_IAZ-^HM9Ri@42bqD?>l58DSEy@$&%o$_(#JBY{%`9-;3S0cMfd zG(_JMCEwI+2yp0}XzroDObFQzv@#%VDlmQD&i!Gx=rWW-|4A;fp9Rfk|l z;>*`K=NKc1l!HALGk16EEKdQ=-}3J7;t09Rq^gv>FmsBgayFCHAIQ9F#yMvDb2K}w zZjMsJF=;dty0P@{l?$%3khBs}@&}`ZyojCUE*#vUMV|%5ke=Pff8$5PexNoaa@r;{ zCXV*Z$&U<6A@qgg4T{mkQv(+)RQcS7tY-&py_*li#PN;Dt9q6^x$0swBp1{_6FbYb z3JWmHNP60A;EZsT$XqXmM$=8liJ?N;Xf@SfeYZ_T|N8>+L19xyJXh);E>k*CKr^+lvPq zGV=q@W;p>GPg;4&u>sChJ$YB~*fDZQ7wnBM#5g;7ez#Xa4io>XX*ED<2$p^{;OHaK z>Z3n>a+P%@xrLoD%(GjXe`+KbDbeH5Z_24J zVg?&T^WRffjO+#KW0SBXz^N1kKuytAxK$=_|3es7UI)TmdQF8W1UdK#fAzjg8!;;S ziDFLdwD&arVAy3}xI=WK=O{G{??oJL`^a)ml;GR$ptnNXN}qujX&x3OSp3}z0le!E z;&{pB1l)(hLwPNt2__SBY2LqQ`1p=QZ*Zemn#v@lDm=2uFu@zl+!Vf>?!s@#P;PD& zq!P()Sc?Bs7~iarWqiVK*1_IjD6*eB8`W|i##N9aYKaybOZ!zTEsR;Zo}^J^m2JgXXDWUhFW?N#=uRX{688kAz zbm%TbW6o6Bws#8?@WY{G^V6lJ;pd?srcVbSeW~Yy`Xj0XAE7?Dui7jlw^;YXPEdl$ z_qQI}0UCweH}uGu`tfM{F-L$efIOU*pjL5?dAj-WWx2-_hc+fi;D$1FZQXvk6N*d* z4VblSo3)tmF_!t);PjO$HfDSta!xujBUw^Y95f3vYFXP&cb&J!u6oXd3H)O5hmh-8 zOvD^-)uI79$Z8%F5!Z;8nJsoSp<(R1%ICKKb%lom2N$k!y(uNM91taRGc`gIc2nEq z0>dACsU#SbJ^*ih&e-o^7X;TE@Hk*v;p5nF%R*donrGnH7@TwqLBV=KLlLPL9u}7= zLalq&w^!MhMMAHrZ*8~9*G1?`)+w})I^!!Ey zxiWk_I9IV&VMUu}91%=GKH(CnoA#;}3?qUTXY>evGgQJ=bzremuR~KuIg_dBR3Fap zf|dvU@^7e>$>*i24oTo9))}<;mXs-d_>FbYy60-hF<>cIL2&r|kxrapF9q&%O#WM{ zBF_IhvPZlOjs1#mEfQS2MGG6B`P)XjSTnFpj3Hk_Ej^fZ)W$0NsIT9H>_sv{l z*fB;Pq5VK;`gN}}%eT=Mrwpgzt96+ShQ~CD*td;GOc9k`qQ7r9OyPh?zuYyM7gLUs zt~SK77tQ}FD^>nlk9yGQr)uU${wzgGg7>+upyV>lrk*eg-v2mnBI2j^>FSp+{a)$3 zQgP-!{vGDG;;-3;yM2f&werDD?y14{#Lh=w96qJ+BG;c3SoMc?^q|nsj+^i5*4u@N zqU{x_JVhtdihmPTaIm_O5p+j_-9Ohae;*B}%@*2cAXglbc{Sp}mD7}XfAeHcIgs31 zoyC6&#wN4A;U;znSjzUqSIz{IPm(v{>pAcC?vnQXmh1V0c;l;tPbj9Np%{U<*p^{4 zE5;(slKr7yUPW68=lPHGwDZBY@}Cf&AD$~Wh~)WqtZ;^;pO-~KH$wU8e!Y^y{pj81 zC^5R^UqJNEEU+Hk!AUW~;7|?oSjH-;JV+UD=B&P{3p!i92cP@EvuEsDFBr$iCJ0deS$Y{}za}i(k3( z4-xqub>iYKaAh)6GYFmcDp7CP?=`E*9j%bwx;y<;kLU#6>eT0`SE;!I*r?WiPqyA5 zR?~t!e+obslf{mJ?5f_A8Yoz|77PYlJ8{PP@Qp5oYyK)QSYWDUeFd<&t^Gc0y#@2= zLnpn36~TDDC@)>OYbrpoPxUO0xeS|$6Sf>@UR8dRE|UHomRRXU`eo*$Qr`gG#GHdF@xMb#;M^)HamCu8p&FIyJcwV z!+-^{9u$eUav;k$(e|HlI9AcVXNyPDOOkela|K}$qsuWoHu+O&mH-5ag3hhp?bI)K zmEiXja6u}3cqWz0gdkyzp(l^0kr^iwlijC0+3^=rIOo8Tai_7JF1uz@d^IUh!P`w| zMmAiRbgu{&$bS#|)5lS!&J4chU7od zJY=Y(!ZG9;mY334AZhHg*5pwu-9E#m-@#$CAfB;MY=S=}Fn9BwOqvERUqmGp#)#>< z*yxjAZ|mjbS!uStw=P7|U5&HFiO4`H-y<9)a)Q|*#>dJJ%)K8yel)@U824qzmB+nJ z9Co&v1?d*IY;D%3Vuux&_yw-oW6^Y#YD#@^NmCzF(v0eepGK1zVN*TfJjY{6-;;RZ z4~o;QXGg~K*K*DL!`Pc6F+b8z8y%>&*ZsVV-|y)2$~3bG%kO_1ZS>wO-$LD?(X5GK zH|bGxv*|;{Vhd{%d`rOKT=b+%2sJ;8yX?SJ20J>(_(IvKJ8wP+jX8EM@k9GA_mda= zgc2~E2b4z#ggNmGxSlj2Hl-Z7OcWirX-@)vZWz-*2l4xD>)sFTH(Aq7w2zaz0`mI~Pso%~)HHyhx@>RWZmq)g&cP<5)q1`-5Y`1Es{%LGcd)B0r zwg!`X|B+s##sIA4-ds$HJjG(gyA`u;9_31$NjYkD7{}C*em&XcLO$OHleHysWPK9> zVG_}4ezb0PTBLdURHwtTv7C>fHe&1nzr)HlcW(E$XF(m2nr{nbI9J!6$MkmQFODT3EDT`cdE_#e_E_s`tbOeS; zUpSQqC7vSHO!xV6`BP>E1=a{G^DsXYAUPy85OWD-7Ge@Nc*%jU4|O)2{LFRdUW!C`lD-;J&o;UkHR_)TrYi@ddfH#jWY z3;osLx&DCC&^1?Y6b7o*_hz{p6qK(OQY{NU)f+DRp5sV=322zU$0pSP*RK1^gL9iX z|9lW6vUl|TlF{LF*wfc4!e}ANzL=UFMq)8dxuO_@16WY`IR>#+yb0eAn41DA2xT{} z{7*hhwPKcOsuE5iMm(0OkFiOxEm2t&Nuth7JrlGJH`kZJ`b(j&hI{=wZn@JHTE=8z zTY6Ydtdt#y*k$;CJuc4}ruoWGqg-H-{_Q_XDkn#UlS^_zx{F@En{5_9H<_7@bF&7JI^ySd+*tkCqbFWEW9Y;l#KO>+0wp$7k_48j-&c>RDkJq7*~sA-a8ruKiMiz#mE;V%gunChl9zPRV)vu? zT4}hao}Qf3K|QlFg<~_Wc(3lP!*O%4r`IeJD$( zcoEIA^fgfvJljTqVhcm8P}nK=(O3?LH|W7S8;|TYRvshr4>44Ne#m!zb=s;!smt(< zK9HRxt#H$&tfUlrT>jPT%p%{lcr!xW3h_X)eM1*#eC7I*J`O3kw`cjy`3hG7-+VL< zxh5^}x7efkZd9JD$*9*EgS1~3FqAnHcjDktXl#g0{peyDa++RYS4mr57iEs8(s^F` zDjEg(=33%GOGl%DabHO91blCToK$~jNqQ=__|=H7d9dF>i8=`>pTczr7pSPG?wxan z-Nl|htSp$wzbkO~f!TuCv97x($xD8VZgC+5s^vU$i&!|B{`u~@f`x9yUu%2m_DSy! z^WVfP`UR)|05Mn2JC3SG535#h!lCEW;5+%lBo2nK$H6FqlQWZ^b_K6)HbWr3(Kpwj zqx+Fzatt)gC^*dBjK1l1(EGSR%EYokjx^#I@$bk4v9yxG%L;CdAEd|>a-*e)9*L;3 z#ke+MkSPCsbz`(_rci3m^BGXgD>JtKLAjO>WWs6$Z%dF{U`V2D*Wi*}66Twiyt=9P zW(i#o$^DTT)T1&0<`_!@p~tXOdFIdhF4n_y-4?TdE!K6k?2Kzq7AQ5gAsxUE9UZFR z!AL9rO;$K5afz1SHo(M(m( z+VNniQ+QHP7cHw5;yi6HlbcVl=!9Ez*KTAWY2k;mbQ5`lIe2w z`y`oJ!(B%2sVjyp9Lo=4w#3~6gCRfi5wr$6t2%|A)J4@7Yguc0R8C?hyugUo zZrv?v24_WyPS%;So`!toc}$X*uS;rVR9e;V>VBALMEg;7|L+z`KPhYLZ30SQ3NxlCFaX)T`vrq$@ z4nAvHRYE?YRRGhVqk=cv@s9VmkgBhGcjLS#30wO2o4D~-=KNp+r`4I%jtH8nj4k4e z$GelSna{!4)b((*eGhzWaZna~_ZPNQU7bH#Y8p8ueYyrZdb_#~AYwt|y=lP$bYjxh zgCRl6`n-&QEpwgRVEmp}q3WpC7fLCZ6tOolN)Vi*+yP`zR8Lrdd%1yD3Qi0cZZD^y`>hcztn~ws>)D+j$;m^*ZNxMlUf%z`)sB!kDG4{ku>2B2(eI$}iy;^F zH?hZ~6klAInUA}0#AgRjLVWY{LxC|}-&0-)U*+{P#A4w7a<959*ljUYU02rI5uI|q zU#ON0eSk8^ApwM{frJ;r!QHN~$LJaNLSnS47C9W;{9#YD6y1=)^nf7b-i~o>=7(wj z=|Jw63UN_O9QUwk&OlxSnIQ7Iag8@P5^V%8s2o`)$M*MC%#r*4RLJM4XXxj13Jl-Xygv*{>}+>u$YS$}tI2g%Gg zFX_gCt?!d>Yu(!^Ra|^rNIEK^3?9z&mB>E>Ms$|aiU!gNvgZK$bDf>A-Pg%mt>bp` za;jySRjLvkh)$k4|FDwtE-;xcPnZ7VS#rGbE+~AoJDnuf$%j;{OAt1cp04u~2HGrg zyT{&@KFP1-Pejh~aaik5xY;yT-9SO^dUvgVrN6eI8!9?)x1)A*P25K=SLNX-9gUo9WTWDB_0zZEZ1|FF?6%3IFE)m zF*$;qHgSuwV)FocoGJbZpF9mSYYP*u9jCG>H9t$I_<6;oUp4=iUlE971}JQP=!-Qa z5+V#OknfZos!#tq5ADNGp<#-e6>u;K!suQ&mpy>S{b9|<5R61TxFYW=fD)x`q_ZXH zk*!k-?B$b1dyqC_ytaLhi%9q8TxSEQ145B5|)9CFzJ47DOXbs#bvi zUpXIExvc=31AQya{t&IcDX1h3&Je#I)(8ciNb0wq9`2yrg}9VQw*3fgXTYJd zh|!i38dA_$|nVWZa*bCH^qG6{24kgaDX_-lEYLcc3#S%OAk=S*h`77bT(H@KWTv3}O-XPtWY^5}}Ic97E18mDI@bP$VzRZO=EqWs1|=VQRkSb_4#DY-K< zhun?z>WyDecnQ=U%eTC_srrW$88pb@gc*;!*R2g7iv-tA?_0G}lp&vr8nc6NTdL-G zAOxLr_v*3bSu=GmRG6V}7 zc5x~_^>O|EodO09H!lyVL1M=*I5doV6pzeVqXE3nkR5PtzKtl&FO#n1x~>Wq64s~o z;fH=v3v+*~M}4f;v-Gm-O96_riDAaCT)@8_neA(y&|%h=5`QOAHf2R&N$sUyg$%9G7GU}ZKZA`ze6GfSv!hq@ zQamPw$kdo>Iyhp;xOKKmcAVj-fmjMu1B^;KXN&bPU+jXmF@57103uXk`^^pXfTnK%M%ec;WA^3qb2pPIM8E|8ebgW22+x_{a$gMM!#f#v6oNk5Q@Un^xe#qvq66x=C(V0T4%PEG6LEo3M(tN zu$rasCZi9lN(4*VbR=ba7)tX1y7| zcju~}Rw_Dd2W~g9{I`_(gD-`yddh3i!O6;LTy5KVOPvsV{v6$mj5EN|g9WPU0A07OPV`yZJJn)!Z=$jM2 zUVT`#i7{5pB-tmXx9JYhh(1(-&2L{^cf?ACFvF}lTV6IF%lF|*KK@D`?ybRQ`L1>v z+mx9u0jP15svLx(-+8>iA5(yG9xIa<1l}~W{FF&qJ(f3KRzPxizbK`~LWc34L`EwS zU%)2ha;H5)Vm+rh!gn%ky>Nwr%ywvLP=&7g5s*4@nCCb*Bvo0Tt0>7d>S`n1 zY?{FMZjn?O)*+My89yzXcV9O6{%sK+VMH>wpj(kbnrdxUzoe;bqmcn40^Tyg?KaMr zj!!(C_7=JXo3C4CD}Jb!yoa}mrE@z-&I#Lo`7>XVEpgG^pfpKoh`#5=5Ryz>Dzr|k zN81~(8Cc$t;?An~>x3i$AUTNwAO9`D%*9%#({Z1zMQXC=A%~nmW z4197o)l@sqYi_ki^f)edv$fmyWm{ar0c-|r^+eX3~!xOR%_8+QnaAMUY zPK60Pt_dTPgNBYnjO0_I29{h3?TRw+{AKd(I_qM1!f0&ExZ|H1UM+GG;=nb$6Ee2UX>fG0 z=cjG0WO#Rad9<|Sy>=DZTq>cq5YlE8kPKx+#O;)Ed<{66>Bg4jja^53#a zx^$Q!P~0dxU0!JCPIE)mU)3XY?RtQ7RcX1)_i2o7J9*f_N;c9{mfx3u_wN=QY!6vL zl~nz%-2+VPSozf1d4Dz%@EFzf$gJNq5$ROf0N`Glms?gx`am~6K0bWY^OZ-=s<1xx zg>D=V_i)L#*17N<N1n6EyoeE10MX3}-HvHnK0Af^bPD&F< zaVm48=#iS%65(m61ux~w{T*Da7c)m4#Uu&I2iUJ4e4+IjV=WOC!CWK@)g9kf@_oNb zg7zmJeu8}(R|H??@*j}HfXmYvWXXALFFgHbI38`VV6yTZ*VRERyrMGdx$rom;(7gE zM_kx$?hjtta&W3#&I1Z#@#m_*DJ7{F;kP1X#|be)C2zO)R>{t^Hj2=7(-6_%lOiWY ziPoWsSji$Dem#IaWDL!LxZ6O2RX&h%*Lxj{K67$j5vv{?ir`fTH3A)7y?Rv~ua(8PhC{+3l=g^Hfa0()y(W^j%KF z1X?cU1Ye`9VYQ%74vJiDm!^j zT$q!wh+&vP*1F*2gfUh?n0yKrCd=DZ2SVN3A>-PV%1BjIvg(OXdfNpGU(HyeJY(4g zMH^Zzb(K_*w9>A9)zJWYGI$TGZNkrlbzdH3c};oK|t!iD${e}{-w8kr)8 z&<4E{j-bLlq8}~>I|q0dT&0~}h}v^(v`OkGip_hR!?4%HtyxQso9uTNh>MNI1d38pDZoP0Bo$h%f!KEf_IwSm4Leg0Kfa6 zY@#Qa_`1uUzXJBpU@M}HN~S)?>4UK`x_GmVkI{VDdg6?GQgA47*I z&!?br!a`hgE=Gfw+%?#=_&IgN!dXFLh#b@x2YHY@#W2cLUq#mye?k3(5l;h5qE#xB z*nUf|BnGeZK%x8#!=V?=fxQ36Ac)W9V6ZGqGR*jZZlA~nfe3@K6-D>Ev9^G9ZO*Cm z`1~31jwLeYEq&M9VFg28Ejq|Id8F1mlhNlH2gN-2KgdRONtl_18=^RpFJz2`8081? zxVatphPKD7B3Q6_5SF-gb7V1oGMM_tC}q|AzTWYel7@AgZ!J<|#gBs!2amo`w({9* z<2daIB+Si9i>}-D5s?SJ#NExf1to0TNfGs`9kQ#|$i=kRK7Z9yxXzo)JDBP1ZH*^q zHFAP>-8bMr;>5XMzlk*dpNGZUc*@@Fq<eEO z2Z6aL73*IxPc-}zyTjxgz$3GH&xiBmAi<4Aji`lB%&X56nT;>Ec}YU%^+IxDpW@eZ z?Q5D75GA>_P>HLfv@cRe0VSDq`UgjeDoBSkn z%Dx}OyJTqS!nuVu?Brj&$=6n&=R}BDc#Nd;{G61oOn^RvH^6?phCCj=gB3zCQNKuT zN*CTR@_{g}i9-el%ckny?eOF`9=9H7tebSs#)Sp;W@uB(rTuRSc}DI{por;Y<0xTt zjAHSMiP${+vI^;XVXyiMw0wn)tABiCgs+MSDXbS7NBo}^M)OptO?Xm+&>tn~WGMv+ z(2o>NspUes&AD&WG!zk1YLPdFS)XkNyX$6hf-yq%R1e=Tm7s>!R`Z2khB}cWZg^zh z_QET7D#oLvRz_kTpC~Vsg|MzCFA&7&_qB8MQ^&Jup5$I-kS31T*zJJ8pqKRu^DpbY zw{}6Vh!$~Sm(ebWYBUw>aa6|fwM?%_e8j7yVRx>f0va+G3$n5ub20}EnYIIW|5EMW z#sM&_HOp?yclNGTmI>r?x7;jsA`_{;;q;dg@Z3Fw2zUKru9SI67?;Z~nmNuQLmNTa zL|^{H@|uw#s?$UVhZzmV*lhLz16wM=3t2cX-1d~7NpI%MWmEXTY;3l& zR1GOoE57I?tR0uu-rz021ZLQb)L^YNMck- zY2N|}m#~s`jeMt^+C>q0Q}zxmi@q*+;0J!BO=?|3R2>-D)^SD@d5q!B|%**ZsaSFtLA7 ztXDf-ljw=;%t+1Kz$euU@a1>dx7Y?&sTQvb%1m{DY$SIBUB#B#%2N7mqllH9-dv{^ zBum*>lXTvN(8*E&RzN|lFHG8H`6ttF`$y8dWciiL3QfjOf{!2&*g9^&U-Xm!_}JNQ znFW&*LFaFD#@%}2zrbsu2k3V)kN}AiDD-ek-q>z@l8MJxmcB^GV4@hv$Dg}hon8BY zJXJ82jBj&4ouVa=7tzXia5zIKwU(1c7$#447Pwu!AaBV12MM8!$XLry5AtD~<$7)RiRVlM`UTGSCa z{_F|q*$=zD?7R}x^L?s1?tEI|J?Q}4Z3N7OoG??-lvDh+Rp15vcP%pT#Gri>&E(P@ zsnsCOP#aS;B~F~X!16Ml!*a#0N`phBTZg~2QhSM@&8@6qdv5j(Tip5JwX&QV!AV@+ zo0#{MY)kRK^oV-xm+A70e$y(J`-x}z^CGi+c*`t4x+)whe8A>RZ66c%R#TLrjkn@+ zc=IGLumRGl#X*}~B9|J#-C+e@hm~5Bo@sL(TKpc`7rsv3J-hA#4F}woLv2D8_!N4(TnX3On;Il~(KmYE2`+O(|B4CIZ%(6q+nsh{o7g+;GqYg!9?5zc|5PI^1ervU@D8lf z^E_F(1nY*o$;%pHd^n$a7MA^QtNe5}11Qo$1RZQ~!|#mj@CTH{U} zQOY$htnFw|sD!S-Ss}Ke3IDmDb$K~qth5BKIARt44&VBH(@Q)p!fEd`I?}yss~@J1WIeB*ShbZrGV`p`&u5^zC!*f&bDgV})v(&7qfr z+hUd<)b|^<>klPO&sN=zB?CDMSdowtJ>6(tv^^+k8f^a2pDwVI)3`MHPaynWP*BQ} zjn&wzT`#Vr^1Yz^1V$YsNr2imD5r)O%l}I#u@UGaS`=Zkm_qV)X)YRM|24HHXdN|# z7hD?QqQ8qC|7GFrW*@)%3YQedB5>MB(I+9$UJ>7^!q{b{S=Io)yU=$j zXI0+GQgqiqzG5lI$8loBY>)oZ#oTvwE(OJlZZ{qmCiE5ipV0Sw^#39By#R|x`rZS5 z8G%n{EKiOb0PuR@BfsaY0N6(V4*YIK{h^KX#tt)aDwLuY^8hzHg@*xm^A&T@;_J&N z8N6*2zhS8NGM`g3chzr> z%DB?4z3%lwo^(7yhb%G1fq{)0{C4_k1GF@m-pl``34b&$VVuxEstLI1o`g=Z`sKA9 z7?O}0cotoa9_tqeNJlM|QS3yaGOrR9l&qul9rKdwmYLTMA5PjoSN2-atN900C62_$ zDTut5R#4)mD9CI|q>!qorlg6Yr+;nKIf`OdnXIxkQ(LyPg zeuFIPh+na6m=qZNT3W}s5oAi3_RoGhN7DIisD4x4%w)ZJn zz^X{cQPM%cJC#pt;edaa27WaYr8;Em5rAbla1mnYBk*dK*BJS$nTDv~$4b73)ajx^GXYe45fYMFL zkl2Y3G|GTCAEyPtl=)Z3gPe4Fdm6q%-Yk|@T=EYX4fKgFTSN+o8{!e(QC#_N%?7Ah z+YRdoD^7KrWH1@Ti=&vAOaa2IJ9w^o|Ctd8JEzihYaCI->E^0P<(Z?!H{^Hjuo4i< zo_|8~cv=C-1vicr_;fBKXfR)q#LYdbX8Njv?9(nIrM1;1Ug>hvUovQ)MYR7kTxhsr zUO+{fz7R0-OMoGJS$4~ofr}Z^VFMyuE#l}^zVbjcUjn1#!Usk z@N^X$5s19O)1(#B_)WhaSw6BgIP_o$ZR6!GJA_jnd$P$8;19BC6^0cMSdZLj3TL@2 zwj9qa_7Hu|=1CR=&KHSWjpk(fhisZ2m0gU&2tt^KRSi|bilt&JiALG#VPXX0fVMm8 zi`_v69);oOK$oTYoUW{fcWXo-fR_~rsFCRWhpIEA( zti~TQfz@Z^Z4<~X;d#o7G4lHkTsJM**$Q61FaSTf9=V8ZF%#p#El)r#KYmr}%Vo#c zS(JK-(!qpmu$k>}^>n&{w%JVl8*WDKy)n3kwp!zLTFYola5$#&zyc1g@V9j>wr z0Y!?5b$)+Qi05*N#sQ-E%`sm6f7MRw2>`5us`Y(KE1k)-%@p;!s)}8g6G7MJFgG)* zESe=4tE4O5+FF+WI%Xv9t)FG9O%k2_$C^$m?1#`HsHBpMe1mBvv9>E*B>U+c{O^O= z#zZofu@GR!n_W=kSa;3^ZG~372(bQRQOG)xPJbs_#VqaM&(`WEJNmH~OU7EzHV*){ z_M>lw7qOPI($?hKkXpwe%nk_*Nt0Q^-Qqd1lFxv^)csrO1l=NnoVEvRdFnT?&g);L z=~V?G{MOF#f47cpXuku+%vm(L3`1Z!{wBytJtBl!(qwPb&CN! z(VQioha0UL&TLr-j&Sv)INO&H5+oWgF|Y?L6t&Ba7HPpFPNT zTXqIItOyl+dH8_aQhIW(>EiO@e7CDGC^h}|v<8UtH32ZK$HsyQ=Q0+gKHkh)P!?vO z>$es@>$e+KCbu8N>QLEoI9?a0ew_HGYsG`H@DG=;_x&l*d-7m)7wvG#>fbDoCv&4O zIzcJB(4B&eh=p~?DhnO-Dcu!Wm%^6;=cBaw+S@Caj~l- zbkWJ?ra7;XMm(m&u!Q$ZrF0f|5%&bPD2b4mkNSvFv{nV31~=1rzVlQG0ww;iH846^ z0{*r@Tab(N-aphp{X*BG3)$U6!1#TIXZ8r_M|~#DglEFT*2yv-HVSk~e&qt2UVFNq zc;fT0vC5pg;m#tg>bY}N7KD`tV12K>PHM`fA3Ye#-*%JI;v zn#wZxvEo)9G<7CGc~igxt9MHg?Yi2HK|+Mh(8SzCE}CI0`P0g{uyXub#TX*XzJ9y$ zIy^>FpA&TczfR-3EpO3?1f#D3_Un)xqp;qjp>QK@CKQt;MA=N~>H5rO5X=-M=FIaU zKu5bMBGiwkrP}<9E3&3hn!5G9D~=8yk_GWHpbxuK2U$(2YpT~0_rE8HM-glMP^Lm| zH0=b_o%fqf1)8?C1gU|j8h4haH1?Vl$@!8nrf)W*bPzivsHDXBJ=UX)Q4ZVc2aV{d z>=456Y!U9i-#YENX}+kE4o7P`K=PxA5`TQoK%A}3`(>o5q^gNZstL9dOdp)z>_yiU zMpZ2;PKocQ)?f=T#I_IPz7C6{lnz+Mh+Q7p*iELyZbNXSJ~!k90S8!q)$I?BS_}2J zFX?^v#2gbVIzlDUWB6EfoUaO1jLw?LYaAdtDJGcr&}VvTpG$X|gIO1#RCq?IJxExc zsIMqrOo9cA=C{*5=jLuY2V7{KGYpd5MU?umG=^7?;bQ{0lrV+d$fc`s2_pnirT}8>U zgW`Il39lfl)lS;w9(>P#Jv!vQ*JHHNhCt%A_Sr6}?}&@Lf5}9?b#7$zI}{6*&1F72 z!6gD9Xg&9E!00;xw7`o)E1Re0E&S9@f8tW&kE3+A)YZE@iT) zx@3P8mTi|Nnvz+zHKQviwUf0xX{n63S_CJ1(XBglV+fr0sId^p;znp%wCFlMfuVxQ z-9<%3JJ+yv-aGCMT8UdCR-oPUt)DZPjV^24(E8o-)7s06ZbZ_AEtbw}BgcFBl>r~> ztG`3M@_>P8-}|ixR$i;?sc4^i!EfWAp0?w^4xd7*y7VSAqt-mY8IJei`u9e@%9Ri4 zR-+zYwK=3hF8ORC|Ly~(nON$)bbuKT!8R_tIzAfTEW2N=xQ(33dFl(m_KFT!*&Y0c z?*IQ3i^KyPmkfVWbh{gy>SlhWT+KfCabTQR1R}YRY{agr?i-V*IYhu}<(81K!o^&| z+x#Hkahp$dS{^k}q)RNqO7cc>qL;(yU*9ItX(=i^U%JL(68ROo;@IL6eB9qp-^C~_ zxNbAj5pJDv#Ypp`q2hG({`@X8K?hzQR?AAf-4Brq+ zixU@lH@$pD+$S9R?AcfI`X}Q8gKYc%Xqdh&sXvWzN<4SB!Y^s9ECk@d@rh$09CIt4 z=Wg4GO??u$-J=jl$*cTF@wKrC_jvVm*PG@d_o_)6PQCXVvuaH<(+D;v&gCo%tb3Wf zX!|yPJDngG!7{X&(0JF=Eibom31}KJFU+&Vsmti93;|jF{yq3~v&pj4z!R-Ef0M}9 zy7UbhTpcE*v%3fr^zDMu>W}YWQSor%+eHLZ1Ugx|S#}k`+;}`QxXq6W1bqIY@s*H! zOBfd4b-%+x0~{^Eg@F|O#C|i=;OF$oJpr36Hvqqw_5tS;68ptedW^IOB=M zXw8Tj!oy#ln;>~Xo=&l|yqn2kwPct%DA6!nt%J;3h_sw*b4TK(C|-<3_xv2rS9|J* z;&Gp6KZ}%|Uph7K08zrT@(~C07$e8-19@zxyOFzn8c~8RtH&Q%U;SbplWyxf?P-Q)9L^t@58A)`X?)?-svAlgVaxDx~-xZq3 z+X$hsIOE+^{IePxYj)W;F1$wsj!BC1;b^IT_4chD3H2F!G<2lEz zD)jy-zFH$!jYxZ1OS;vPMhE|-k*!C&UA5SXK(%A3K6<-p?CERcQERT?*T@@Bc2v=g zoVv8gXOo|w2&0#+mbe7By_9d7ZECt4 zY58kn#Ime!~yH#)MYzS49BBd&IucV;=w_%BFAc6c-=G_$g{UaCdk zoX>n6ae%q2oIw7WDOK;fo!!0<5dhC!gH?Y{-vYc&IqL7C)|}@jipBj&Lo&3(x-nIP}t2}oR3Ui z#T^51P0WTAgx~@2i`wDP=T-tQ3Nho#C;a+FGizX@dMY>px9|uy`3|-L&S1!4MdZ;% z65jdH;}kPiyg|rK{-pAuNw?vovP*XQ4#)1GgDIj(lAYcnagCP0#O;ITw=(E62Mj*ymQAS6G3jA%aWCB3B$x33`?hduDS+g0xL|domebM>7AB&R zI~Q7O7{=9g*#%hnTqHBoq6HRz?DNomo3tOHg2-7)d;RS?*$gB>8A_J)akGz!ZK4d` z(Xb}Ls?1Snvy;)Ut%P(IXlwCYx>jBuo+=Ftu~@%75ZV2%4Zmsy2Gi4iB9=1(s2 zmB`Ths>vSv%cM*np;{sP-CbC|T|d&9Hu7@(Z0VUBs>zc{ z^a`4(zip)i(ps$+tv-D`) zs(}l-Bzql_%)hlLo-Iy~KH$pF@*^8QbO%p=nd6I}be$h)EF`8&9E~P9KR137rLShf zE#m|y2gN7)GV;P#j6)|3#chwez(EF(xlB%FOA9A(SZ=AE8@HUm`k~StC?Wo7q@)in z<8H)Pkjd?^wK4*R%DZx}T|I0E1iwbB0GsbzxUIE`%uNyq7IkjGP73VIJ(X}(*t5Z3 zT<ywMPR`D!HkTI zL?~=6LWnC&v{r>N{nI5>VbIY2eU46tNMlOetgsfXi{EUvqwiyCs?Pk8B&(8DkdbW4 zfEjgP&FMFkBX~0xpXbYoXr*6d*LdQcspBYZI+c{l2ZOsl6#ddx&qK7Oyf!fe|B8^N zp1^fY9G?Cdq2xE&rvnUgXa5dXd~C-WHTEgFPiEg$ORJWXF;eAJLijVxpoB|X;B%p? zM8MwC-VfI_j0mh-BERNuESe4U$?7QJYNpHYXrq+V{u=cxA?G4DSX(95il@)(gsRlv z-F!t(m#gOYAQr*_1VLlV>hjHI)K**GtQX|gXEf0aSocV%`Nx;&Eik{i-=2A5WSIq= zu6jeq9Cfaa_|5!qqf+Cgs=(aN_e7w?7k{N^V_8KcPseR1@|jh@d0>S=|3yOuNgva@ zy1Dd=Yc*3zs|;8za0jkh>ik<3q5vnlUGDB&Qt#$q^4)(Xn76J6Yrb2CU=YMMzuaRtdJqm!7> zJf_gd#M)lNIKoIZ{y_Un$6@T{1~Ellf2=eq{n3AV-N(IY`EC1JxCyB#z2SPgpcQgH z7qQ=_GUTa2+{crSLKdYjwM)Y_akmyJh4{YZj!?QtDoJLR4>La7rL~jqg%$frp`Xzd zy2T-67XMm89N~8Nt^-APoDY8U$ov3Zm`+yixFe5VA;)`j;857K>DusvGO>7juHq8a zw9#y~r3hlYdkr}(6W`6ttW#}M77XKd5e`|sg6SdtFMW>UEKHxH<@;Bk1JQgqG!tY1 zHmqqt05{Q3*U>2RpTKS>FtB9=)C`(`Tt^g4;j_Er@wJ&Z)CU9VN&F#~&r?Rwlen-8zJNY>*|$DLz%KF^P@1Ewyukw*gO(qswET3dvyOY;L}?!%!jsBhWv$W|b^F;|J8C?L%3| z?So)67bqwv;CJR4tDd}zk^0Dq2A_APXmYb!DxIpM@owT>;*ZpC)JQ{lFM_lKbS4it zRiC&yi7&14gP$K4g|!C;Q(|x`mGCU8w^f1`&=DXX?*#^K#=qhxvkB1jl_lPj=zi-H z5x-Am4VT5&YgG)$g4z8BAw^x;l<}0F0fpcB-re{n&VT*-b>#FPyTB{~08hs}Jj4;L z;-#g>JrNIVOT_Hou^Ov55QC7eJ1}w`|61Hr;;u4n%j5bOu zA@?rHKx3X6!^;2fRk=9_X-UO7Po#={9AYxPC*cr2+vN~IG1q#S zQkr+?$K92*mM&MpQ-+>l+)qEeiP4qh=f;WEc-w4xXRfSL&FAfC?;C#l0Q3*rRcx<; z;7_`^tq7g@1@6Y=_$I;`@m$&@$t;@8Z95hkjDWq5@el*;jS(@Q%0S4U{tho8DIVz2 zvLjiVhwFci+k=?)S*&p&L8+1~+pT~4|MH9)mGmUprLpkzRj#SgT zgW_K)v51UkB-ixL6+bmP_Gi+&=?C-a?dW9GbdW`Nf;ZTdhH}|{_rj1aoC68aS>#V; zOndXLf0WOM+U*pM9HPLJ^pFQg;t`q2S?d6~mAwwIMt207$Y`rf0cTzz*E%I3kP~ zPj3>GWuyNC!T&q&R?3R)%E}!ED;%~e`|jclNAislM8nDakF|3%|+ z=#rrq$H%#(#)r$efFryG0pRwZW%KI8M*d66=Fd#y#pl>jsfP6NnGE}rC@vPJemgxS zrJau5kE1S(GtaPR@sv#&zBnT0{cF`7eS|_`+n-E{Z|#h3n0PA=KT0Z~0x97!?{+e9 zU$BFCGNuy|tn~*P{A%O!Pk{%8k=fa!j13VVYh|CW+%2H%)n}llF6Y^&CPJ;H300J* znd>ys>rF}W29hs$n|s#z01yOhT-##Q@ZlH6CUvE!4e|fB9;KvC8}5Hl+f4 zycpk-xCsVxf|`i6md1r;prS zgpE~IZjYr`F3N(Ou+Fn;=F&wV3ZNek=JhG)TRNDR29UT5YA&f4Z>Tk+K53#p33}Nr zQZ+g3cu>4haY%f}DU-x+=Pa4^X=d8JHLIq5^lW&>@P%YA|YwiV^?6GPA8s^ ze7!;Y?&iRpJI=$#V28`=QtFOK)ygA6E}qB7lP90k?X0JpthFI2*u%a<3p45$+wa*j zw&8YhN^RpDhq629D@KKL#cAi0M;W8^%Lk4MAJh|4!+Z)CnsD?cSdC(T6a4)g>tq&1 zIY+MWSx=L~N335{Ys^qI?cuIHteVF@-aA_Ne+%M4| z&!`xn_oxL>1y(V!{1~H_YknBxzU*-|{OV|0P7dHc;+lAxRE7(i|8Yp#^W&12`Ei5v z(eG{#x9d8HaD5RMwgoeG%5$E?3Gv`O-lFAm>4&AWq~>#tRCbh=I{He|6Qx<%BdV(k zaVbu12`_!)@wL2%C(k7e(a4(6obvT)H{8mgL~Ws#)h2J%&%M2d@@*zYxHz3g72}3=dy@l`&41?LIJs{Lm44{NYPAGS2uE2$$wFM(^hhY z0g6`=gPz__Qt3S>dEzTC_CZ~dO2rOYd$N-ZJ5(tB1V3uM&L`dvpzO^DGJsIt0P+M+HdP#3TTLv(MzA-1>=pFZ526n-uNN7NrguzXb~ z=BAAtkU^ZL>YH)gsi_)pR6g={uw1nLaOZrj-{5ZPOX=siFDdFcyf?a!c?Sndy)*si z_k+*PC}Bus-q-P{F=3V#5fJrzpULbmv9@8Yi#@_2#_zlOgsbizO61e6%%!(mOEXNX zlC`Z^)?@uo(0-SRf@~;K?IeFt(iNy3@7!S%ytL7qy}? z{*Z}|CdOOmcJPt&SrSivN&*Ta%S8$WQ*A^qU9TYZEFr1J#DV(LCA6vs2E7&;-oxg# zLr%-otKvcu`gSBO9gh4d<%<)->me}V3)&V-*L|(|nnJOu1WcpzNOzMSUULm=J23~E z?AGKv?_eODU<8b1Pts97(@h)~djK=(p$@!_9y;Q@Z3n3+nyN_12Jsa|-qJyObQ_Z z&zrjYeQ2$0VK)oJK`U>kQE1UeZUfcI8aNx>J>354sd1F!FQ{wY{`d848I}JZ#@;d@ zs_zLOM+Fs7RJu_*q#Fc2h)4-22uLi5NO$*wC?F+Dxb#Z*(z&pdfVAWSOVDQsrl$Bc(ZJL(M%9)v;xP`=*6Pk z*q#bT9CQV3lcR?BNRssJu>Ej=gbz zOWTkUP|`s1v(e`)8VkH$e0|IAKB(p04(MwF<+DnQr@uH<`_nzKG4-E7){V@tfGrQv@dbJ(7&}=ohS=y7qeZL4tbg^)M_zU86G#x!2Q#~Hz2#wlXCoX< z9}X(?txB#baqVH{cSQ?&MAZDLbfFs}X{hqg_4<9Fxa0T3$$L85^wW{4Soy=6M%@0F zxOsB*)eZ7X_D$x|j5KnzPxhn2tu_-w0aUxaLGhNYtW8pmJtl|d_Tc8`X^z?L9--iN znWE{a9kCX)j-r#xU+Wu1h)bPwm#MUcM38=2nKKaTlL&X=- z-;B8Dzululi#Q{jY6Y%dHo1?*0`1B#hrSVZ`H9uLfu#Quji_LF^$q~n|uDr zOtBu++x}sFI%V8Un=eJ7-y=G6-Bq^By2ZPH+l!Ist&Z^(Z)W)lycSwJthUg#_a;&> zMgq_0xe7xI=tCrHne28qpM$K7CWq75&klR1ZI{`w-yU73Mk!-_g3MFL{E`(}#&N73 z_dUAml>e#c_y8)8t^ud79&C&KsKmcN&hyDv43V?7zTPyDU)k$P_qWyJosXD%t0&Bb z#WqGA6X!BHp%0$Pa8{Av-hFOwuzvy7F%FQM_=s75IL1hT!h}68P}ZLZhjSl zB{Inl4eI%=+P!%n+2A0;`v>)o#w=#uGC%4Z1g#sVS&a*qKbqF?d8QYkZ}|IY72@6o zFI3$SnnK+I;a>P~VHAD{^^VeE(_-o{()Z*t(#e7`>d)pke)KZ&OK8u0VY74c=>j_K zuX^}h$mf3U{knIFL+@^=JbOqL(KedB=rf|lD%!{i>_Zrsu_kB9&U+!z=-C~rtCk7y zjEs(2Q-Df|ipnz{Pw+T}>%_+7@)bV>J8++9BWBL+6~e_LtF~JlJ;LKlZV<8G&rl%^2(6IU>p= zn*n1vJ_S_cQfP}2|L2|)l7vQ}z7F6*hRk(0mmxs#XyIN=txWwkuIO0kt|yTDvjmqr zX?f6k(iO|m6|3xXUk$9jKO6S>tb}39_t!bl0r8b==(Um^kh^+TcL`j6&P4%?t*~c$ z6R>1)$B^B9bgYB-#Uvd2oXrwyCr@Rsq0#E4NKg+r821%XdluhP+)4+>WzQDE=UBw6 zSD-LxGUM4J>Fp;RC#_o*t1lhjS!m-#8h9&1N8Rl3`<3@YS(`KpdB;x*nuZuTGgQ7# zrdRU8l-Cpb6@HGagw`{l4}Ic8nJX^|$>Z5s?1|#k5$?;*)mo7iaAhGwzI?S|C)7dZ z6$wAhM2{CuOR6w!tbS&h5A1!Si@$8sN>qFEyr=10O?03mGyrFl4rYQchnaMYU(=K= ztBP}65=hjKWo)2F+X~H(`?na-6|23EUd<&dzU1B@9;yzeWleQ)H3BHk=a32S+fg_fUoSzdr!y^cWo538 zg~%vN3Hqg8#+6Bec+=Z{o9;y7iUS0+P*@4NtyL1CK#E}rCgR^KZoG@VwDl$|KUw9yOt+RLanAHh!qHubc zfHKZa&#@c}g`{l8x{fjj4p=&m@A?S+R_zE0l(79BrKFhK4rw)`{ImD+U9>gxLqFU& z3C77UhW%L>4-tj2W$(PX3)MmU9Cju%@McyDyLv}vMiPGnU94iiV~}^MT(N(Bw;dt( zNe0>5F`9g3%#TK2{p$}pL$RJKm*$hsxBUHhCs+U>mG+XrmFSXs!3MW!qG3^f}fSd3QMJOy~6OdU}FBYl^Pq3y)vrjl{;tz#5W)wMMN z{Ge0~!N1JBdD_NwSz4d-rRNCUQFiHl7rtj?4$qVI-d#|nZt}wp-M4U2joy-CQWlpT z1v$EYklq&7F5tK_&iYar_HH0wkl$;Po8=_s^It33t9JJbRzZ-${HWpLiB@fRLo{hi zu0q*=I1vUaSZIN5o}7HB%*R;XnOw3QZ%N=*bMV?HdB%J>LaiyT{uSROW-D^)DOo`8 zM`d=oxUX^ng>;1qcV%(I=~;MHR^E*j5!)z>ie6Y#6tL2zS~hy>D(bKfer{df;e(<& zoU?WI-F9TTb;SF^Z#m95eC&StM$B;H_8r{|7$GNa7CZ=<4@z3w-(5JuRI4Zbo0}nL z%mT=vUD5Crsfy@f@An1?AKJoQ?g{&v+CRwtus^&K!-ag6f~xm*x!;lhROi#3glLmS zRPd{sh14b~koLFn(K;SGUL83q+Ny#ZS(^~(UCeW2T#6E@31^u3j}h58KMr8?QVgUU ziNPgEE(Y$CTsw)o=L$7Eb+S+~)62Im88$JBy4{D)(?6~D1q(fa-d~>=T#%(xDAyJ$ z;qxB_9XCZTCX&k)Tla11$&Xg97eX(jvW$MAxy;~OK*U(JM5_H|)+jIrT}}&@+N)#} z>mfvNzu<`p|GZg+nIG;;Miv$b%7)2Feqq9mCP{gR{Q)1SOQA!#zw)fr*18L&&Tw~J zJnmSn@5;>i)3}>7=Xxf^@N%8__8}!P;`f<<$@=7}P%#I;>V17l!Vg!tS)ArXu9ojG zeTVvFTav%sR1=R@wTTN@%-kLRvLQ^H&xCK{ICDxi>cs@T$goK*eiM5&Z7=fBxB-(t~w@ncKnJ*_jNc+ScXYLJ%C#&y)+FvKBx2m9| z&V9@oGE{1@F()B_!-(VKKwrYhV1&Q+0Wf)Oe-t|fZ}o3WsK5XTl~vZ8-Yd)}xz%s@3sv^A;0l zDE0?TKrb;`qcdBpLZNtCj7H%kp{%_d$E^4?To{5xBys87y_VbRNP$E0QI@16!(~A- z+2ZqL4!F&>IL58McSd4DMauJmVJ8>USeVrn5w@v9^!!VQhLd<*nCM$=qfBdu(8T!sD=n%dcNC*Slc zo7>ka5fd+-fv%+`Te?qI_H~8*u*#fNBSx@-C#oGbiPSeeP4P_}9%Zs5TVoPyU-2%i zH@%BWuKjQuH>ZTt$Q4!&8dBD1=bpXI?wAPoPxW#CS}sMzgLN+a>laaK`Nlooi4>A$ zr0ChV*vX?c;3E>ybFkS6&;+Q55siuM_;*aMj#j0z_u2mXn8kRSLi`wTdc6zX4BK2$ z3k2;+mfFIxq^us!{=N#mP<8FnWY{gq*krh2EBAA;SXZfrVJ)d4{@0GmW zdE~Bo2n~4i8l_lQ^vx%n`QTEy-uLMVbH%FwQr}H!#2}ph$BQ+Z|7o5_?z8qm8qE3( zK3)!5Y_~z9d&BX$Gt0#5vC5 zRHmsZtu;%;H&wp-d-zi&cul4l?U#iWSeV_oen*m@D|eWt#ATlWSyzcF(F|E>7hH*y z-0XTUyY7>Avp1jG&b|h}#Fh&f@9ZjCclhdM3^jo1Z1?IEL!u^sl6|Xi=T0^HeV!>c z@r2#vH`{&=CC$iY(aP+qKYg*TLvGXgp}WA*(h_TAi3xP_iyJ6c>nm84dQ~dLF@Eg6 z!NINR<$EfI?;(E9fLfY$wjHl(Unu1PBNoR>Z6n%E_0Ih|i(~)#w3V1>)-P{t^vc+E zZRYAJ8X(PXKm==AL*SC))XAf72p;K9yrf&{`f%!}(VrtwnMl(kgG46sf7pBO#w;{= zS2npfc}FzlSF>|Eh)fr^oA72t?OlDMI5P%Ak&zP*w$ePwgTsoxar3rX-GdtRt-t?D zHSvMLSIRI&QrT`()I^NlY2@46kbjPX5U(~8Mr2*u;fp-nIu$)wf9Sov(zE%8k#cb9 zw^_*c5Gr))+S{V%Uk|uCcbv9*Q!@}?#2fO06Li}?tMK7`4Tk93hEx;F;klLF?8Vt} z+sSedq|1|yPocnJ&2LLGxNujy{@aor`FPc|_j}0sv#AMAU~ld>^I^SfE8e_EdZ0gn z_V%4DGhh41z|fH0nL*$Ve9(9@4hl2&%B+}+Ng;jF(MAq-uD+wPsO8@m&fe@iv8kv2 z^WO>t?3*SMm>P@TEN$=Bd#WBLEG{ECFFit+uof$;ALSGE|C_77tRUq1ylNYieOZ@J ztF0GhYd#d!_=;SH0VlrZPeUQkyLFor-|FtWn$$_Mc>E-Mh$4%qd)KUgm`^2M(Zymu zU}jNkfsk}wTi1i1KRChS#yLH!++|_G14+i?Gq;Fy3H0?;Q3#^>Tnk_LneHiLG-Q|0 z{hnw_PX3*-f~T?Fn^FQ?ZW7u%e?`>y>R8!-v3nfuqt=)Fy1ZGP31i&f>z&gB9`!Bw z9;O*~BDoO*1*|lrh4h7q!iP?xA5R;po0ZKa6I^(wE5`)qKId&kX*(F` zzlD};4tXBsAU)R-NODy$)d!eH3-AQ)J@H6_tINCY8~?}VKEgQ~r;60kxQk#5FL4Hi z?@jw|npPXUMSJ}MHl;_XwK8OlaH9{HnT_G9fd`=+%q1uq! z*yLD|8XprKk@EFYnQG>%@~*AD;n1*3SSzLE(m#ZzFXdruM@Q}M4Lj+Q%ZRT z(oyk#GrB9x)#6+dFLswhRg(vyjEh2Et7a-bm?WsH472QYOu@3P6bt89jVWL z)F#5c@2i}ADwXe1V-^k7Xn+2R&$9!NgE|1>Xw^z7kQ#F0Vi`AaxECW3DyStNyD<#W-QdE;$vdFTyESE@XL zB^T&gSPW!;{>pq);YB8$?!H7IEIIs{+WN)QYW^fmZ-Dw1v;DKK{f9Uo@FP-F~fw;-cPGg8aO^Rk3Gvp{aMw*%=cUo>DL%#CgtZ;=2Kaz z-S%Nh_aq|{G1*H|+VQ2wtxb>7mk=d#$&Y%&!iEr@PB_3-;6x3vWZS=fcOB$gA z`Hu|fpZU$qKf6d6FibWCRk>iz@pHB))#sI8JdS&e8wew{KNVDue)v<}^v&hA>IAHQ zEkYaeI-_;!;5obYZ?Vzkl)%N^zC#BjI_M_Eo7?-AZGdx%aTGin@|qT{w0#2f+i4S! z-M(8){FUX|Hr*j{ZJFG*$A{?EjktdinVA=S%99Calr{XIl8T#DNlNHhH0@lh)#LX;Y@adN)< zcF3T+_3lX7{m6p`C#$)KujS4T78&$*G!R9F100t30)Vfjq5U>*!uVE6NnQ0A+T_*o z0bt8MSUfxa7l2u%sms=dy1M%VO%)hAaAkO@o4^-Rb^KJHl^1W;dEKOa@B;1nhpd^pZz8JWA(*;eKd&+9IRDtq-8AHiqVZY@ zIZfQPc{yR*_tz{+`#m31WskCM1(Mukkj6FI?(to(=gR|0{o>o%i+7&$} z7N3eC>TRg_TRFLtouZyME0vhnl3!X;J<*bpArKKK=fw<;#W!DjRFY0K&YqE9H?3O&&0_ca}jRA0=PPcVO9un77|-{33j{aavH=;p^newpp(5g814X zG16_=BdgzfIo24PsqN7C*u<*NG+4Jy0+mJNlCbEPTor5U`oO&5BfAM}EnXpG-L;~X zxNX2BR+IZ%$D6=H*wT1r;MuxZ$As9|<_?apUrWLkHEe$?NX`&x8kSIb=>IIvKRNUA ziSD1SvaHtk=i4^MOp;`t;QYBiexGCt+oCY1$}LJut~e_bvDWy0qs8+yjsf z)YZw^cZ!C!%zx_i)7U90?rQc(+219;WIra^xO-mz6GU zFkcl#(mx2e|7ly>bn}szj#%Yibp(6U7x$!+b$5hga`7aR)3{f^n9{-Vuz&^0ZsTV3 zp+u$$`^H-P@yi@6UodB!1q`3EH5scNKa0D>;kk_9ZfUGV?jH|m^1xe~P7d7LHk%H@tX0ZZdhQ~;S|*7^7k^=d zT7p}dd*z||y7>q(^A9WfZD51CSj}?j>*v#(4|h0S_KKI*HHasfAdX5{HkTH0Ub?iX zmLRe8tcv!VqAAzt8Q!gRODOnN05`dx?&DEDp8>Ybkf7eKy62D9hTQdrm42VTqK!`= z{Xqym!$R9mP7g7regGv^0KC5fAhQX0e7c&Xmj88Djtzz~fvG!6j2np-2V~ElVjZlX zePY!JVh(eh8%v)Z0C24s*Y|p0{_%Jy{{*o|yKf8ZToUjyOA0NhMhUM@ORi`;I5;@E z{Ml$yVyJ)r4gJY&|51I){LgQdEUuP! zHy&Fx7fFk5q?`7o=`CJ=TvzX)TD;?~M@sry_sc}bdSc-cm-BB)wB64RyS~=bAPafn z(IrT&m~$9>F-Y{EbNNXzW%j`DY4KC;3XVJ|n(bHVZiwro`PjjykPb6+rM`Dq%W}|B zE7EEzJc8tWdOP>b#V1;0@w`>Whb=<#54{+cZyFM@?|ZZ{u`ZR8vHXEbb$~0(d1--` z>0j)95B&wSdkT1rR37bs=mC3{r7Ys|EU5!qWiM5y`yrDR{A1-7>*D#sCI|oYC#g>=N@T{<@(vTa!hLLN`m|9J~14_oF7c3hpxeH;}1*SXZIs|b%8x@z zM5$Gp%b3a@lLRh#`(1`o%}W*!yIx&h2;}T~Oo_K0ZZ3ZyUQI#OI0B&^AfG`%R$7{P zkwY_$^>{h99ErKb+l?ve&qbqc$eji6i)dt6=QO__XOrXDaB1ed0~~M`ZxZ0fE$wNU zP+U9*c#-rSMly0L=L^OQ=PpB?KEKCLy~Rv2^OIvIfBO93tY9|M+I>gz`n6lf^mxDJ zsln$qLiHQ19R?#OP*|6&FLp|e==b#|rN<{c%xqY&{qTfhF#@fV(^^3~^6uyR-xFQd zu0DM~LmY%ic}vtG!cpR-)%kQfN0eSqiSo$$0{(3;NWDzmOeF^lxw#}s_GS3~BJRFz10F95W|?v6-*)$)uwDO)9h=5tXO% z;qB?;_6U`l1{}0KxwWBw64XJbRtC0} z2vQMAjC<*3gjFmzhgXlCVyunayn}{W-R1@xthdWDsr4|&DfOG&VCw!=-3!pNtr)RJ zkC(Ut4VChLxPkOf)+m`tX07{HGlPh|TV;*oAd_x_`qL~x{^YZbdIHC9&PM;hc!tT_6QN=8q!-iR7mmqM|;Sg22q zU*0E?jz{doTO)SuWUt!fN^P|I2AYfuHE&Wu9_LSJ*XQ7O(Xh(gmt++r0vyoWfZN{I zsP+jE62(9$$OVUSq(sG>2FEDZEu9K4Lx%izbJ{c-Bkq!Ww~h%t%flB*_sDn&P-}>j zWjE?$UWtz$p)pFu9XG*ix8_!WU>)ESM!f;wY(YCsyQ>V6F%c!y--}A|dsad5YG;=E zBUJ>i_x61`6L#!D9`^Az?s=!*m826?)8KwNH%SUU)8||&G>}IxMZbAdzPkuhc$*G zyq>Ez85#_1UmVXqFq^D7UK`E@z#ZoYM)%~cpWdV*>l&5F!r)qRnZ7!cYz0nOObH=; z0e~|u?*UN}_Kk34y2oI>&j_r#j}5u<<2RQv+=Dj~=<^UO+dqk&O;7mNS8PNFLO|cp|WpG45jnY} z+GkWrl_NAn-ZUZ>eyf{(xOlM*Zg?+D$T{Mt+g=AZNQY_yMUGP}PTIGn^(!9Y-Xic8 zd*OKskHc%l#ar2p(oU9y5_K27f&6oN>QDTIXvCLu#>bk~wUNA@lY#}BaevAq1n%I* z)!q~6b_}mcmV^0q7efM3dRQZH&S!g{o(WAK@ue#`Oz`j6@Z6z95Fd>+zmq; zcIEqMIc8saWfr6??z@caXU=R7^$TCmMqP`V_w3igCdyLUoe2r`on9Gv6jLg$b-DN| z_@yHaNzKh1Y%4a!UkxG(P;QnT#P1SssTGbs?SGt4@z#Jz*()*w3qN@HG|Kvyud^VT z(NxGs5(1C*W|$X0pizL}F91=@5Chhi(}qj%J6i38XO_}352~ zV~6)IY-r9XYSYNdr{VRO8sXhOoQwilI>t5&_3$Sj9|G2dWTUY-hpl+&=S$n=!Yx(MI*4xZPwC%0gT zH*3Z*lWOGS@p5zTw2rJ%~QL>VkDLP*xMn!P=%UTD{^d zEY)n2e2>Q|5F6CBmP2Ls2+@7~l7}~$LzQXbn;YJTJ@5qb@il5C@$qL}w4qS#J6*AW18_2c-w|Wm@BC-PzXUguUpF&vN)9ZRxng5YD z7CWK@5V%kU;0PyeG=T#&x95^y+a{Ipx&htU1;9WaciTx{vbgE_!P@YWvC*>^){0gt zB?>AHEL0^sKr_sx2>=d-;RCX{1zg)W%0MYkKuDn-vdR|OnlL$9Eu4!Qvs~$S+F$7t zxLhwRX_Z)w)t#g$2HId;JWlt~vDHBv*p7dUbolPSJR`*P76N5CMCntlTnPhMcLw+fvoFN>A|v-)tG3=9 zCp+UAM4=C%wjppxD^H7_IOBVM#q{e3VG@MPXnv1&#aC`M6Lv5Cb#>0-tW@a(z2=o| z*5eqBhb+GNqH4H{0o;otIQ1Pky`KO-sFW}(1wkTSh%C8ygJ3K_H%458?wv7 zu!jnYnBMM#u&lI)deNZ~0M}M=eA(^{sJR&xI(M}E;W6M8_>%xoJ_5k-43qemyKL!hJ97<`eZKM^uV&Au6`^)i2(gGFGh~Cp}_* zJV$vniWVt;?o&qn;Vq`_XKU36DNk8nmp$p`k}2ink!ztE=}L$S>-Mvdl-_$uSHlaa;JNJOhK|q&%LK~qTke31dW4Ea9o+w#pny= zgis8SGGmWFn*@y)gd7p$a(wqdD(7F8QewPbs5B~k0}^rA{@oVP zTR80Y@)@8La6j`vMzb?H*1E?F3nXmL;n#2wP(eY{6llP-a@$^K@`-}}E=QUpx%O=0 z)ck0ohsWQ5R+J7|Py$8VJavBwnuP!pw7<>c`H??Pw*sdWn%gTPf}Q~#vwjm~d^&i% zQs1AWlW-dmR<|-!)pIgW`TB;pv`J5fMvcj_hSK0QIFO7Ep9QpT3LjJyl z8n@WwXnv;-de9kmWgp!L80)GDW{;>A{cF`!y5^DOXfT1a*{x|Nevpa%h5UMctvr4V zoV5eHOA?>PRi;wKI45XBzIgolPxEWadB;+@FpamIN%?I%%Qa zbYHglu^R8Gu4clUmY(=A=*%fy>)l!dFX-&!!}WR(Z;Izx8luoV+s_2Yu#V@1)Fs*jRZ~J) zthgOYlC0~E*0+BIxD=!MGy9SniE}O$Y0(f# zJ!)6aqbYwmBpRZy$2VQb;_ks}iNSaG<}?DasqivyNdmqN;q?Z(SIQ&Hu@M7=k}NsR zA?~$F!Cj*2RMXB|OQSY+UUSc{?8#E76c^Rq54#u7hcME8=l~lbmqLUvsgns6f^!3> zSpv;W)8-$Me~W+Bm%upWDAvwxqb^WqFC=VR}JXqD!M1*?evKHVnnNxszWtGUFDH|Ixzpb7R9=p)&EE+>j4)Vj4cX2>jfunT}+$LZWaj5hIKtzC407o0U zZ$tpMx|qgcACcCna$CLhM)a%TQ7Rn-|UCYOZ%~w-Jhj}*`}z7 z=iB(=Yg0|~bho@UvkzNwEqCgY&vawr{TltkSMfTW8#P(@j34iXKebvy+u)K@1gz`B+p@F_^Sk#Y%rQ5tLEym zaM^9IE#B81!*37y)NNU(X)sae!8nm1n z8YH=?CW}&GGx_G2cGpO->isK$*&Rr2(5%;hwC7%;y=|s;ELWpgXl8Rbw@z9|Jx!gJ zqOU?#tb@f2iAfAIuCjk-2C7&rPNX5JJUFu(_{bvuiZ`x_D=h$nO+`l64mStI&a;<^K`A4|k zlPZ@H%zx7Db29axRd63$|KT^+wEt$Q`epN?7(RoiHQoOMgoqdDsbq_L9DHLgi8v)HO4pM|D6_#*Qq{lfNGF`B$+{v5r(tn<^qh!z!#{ z?)%k`xWKIsH6rn~R^YOgOharDM3DK~wx0VgSl8ISY?sHqDn`L4ZLYi*l!|}vbemZO zTJ~P8k7~PNyip{?5keiDlpn}4Q3#-Ae4^j~&jG_}AMU5Ko}V8Jo7%gx2)-we(2}<} zfcgg)q9GGG@4gvTYhDFKS>vWDPfu3B5?<%10g-Omdm#2VuudjR_5epWLV!^@|XV zye!l*H^K=94@SMt5pZmR%!!oS<3+l}-A0cd8jG0tIGf~~(-BHEoMD-azd((fz%r5B zGmUf|jx!AaE9V3erR+W&gWyB zr2=5~HdsQT9o3!VEk4>`oEpxs^KcQUZ)T#;WI+e*v}auhyf7&`qb)i~_eO7t+!ph& zU&O^%^Z;copEn)u&E{N$x#bp?!ySyY-+?GZX1{RVcxSk6ZK(Vj~#yOw0aLG-kvu#3XbbOwlDz4QTWa=6CAj+v;5g^4|~MxQ;SrX%V@-!XikiO9?+ z8jS8w#c`*Nii|CWMqS~DMb3s=N3rvXMUY7wMS5yp6@NI1q7ZmveU!X;~)Wq%UPZD-*#A^ z7&Ggo6xdVzccxqi9V_m+IaY7h|6$iKT4^lW4tcMSO zO1abyP8uj#6PdLTPE)`*Xx}F-br7oSKv^N?ODsga|Am3Q-l+>XN4dJTzizm!Sbm@K z2NkhGd={z+N9^-8%a=txcO~xA(+_q?`tg=9?AkqZD*6}?EhD@S@QIHL=nR`x8&m{)WS>m^O z2K{zlwv~(VwvAd+dR&$&6=e4}I#Z7NHC;?Y0n_JyB*1zfQq?B(@r*BjBtX!7*kNgD z`Olq(!w`tFmQxyE21tRTrg{y)#SOjT(S-z}4N@a~IH!bV zMo&hL5Al8M5w1;ao5Tp6vBNgZK`r{ZDAXiZTt{bWxv24|n3AgS<$h`+{kQVeUS8h( zrkX}|6yY-k(bqYKEsam9J!dl;u{ z0#oG0?{+76W~;{VL4O2=fZQXe@iA zKOc?{d6aq`V4b6$i|EdptSZjzjOjQ06_<~1e;UlXc$ex-;)!J@o?1y){CfWk=V*c! ze^)_&7lZu|+VYpDTTPX+-!~e}Z@Y+sS<(L|5FIH>?;4_0#o8BRtG#%t>V~6NYFB<+ zx7qlp6?R6Nv_K{r%i@3DiO=_KqyguPyALn%G!;$hUyFhMuIn;d#N@lgbDesQz8a&^ zG}f^IGoEj&4_BBZFVLbUBI(=p1sE-LrSnvGguNh6t2d|r{g%{~FPqHsNY>4OFZquz zW0GU_=ivaDerRJ#U-uiCOS7N7g4T%M6z0 zZrcwA+_{&;?@KAmarb`#_rCBw;??m1NW#afx(C>gwpB%pT_2}){kKo|rKof|a?bVupWw?b z&=;;Xp#!C|wOto^A6ESr0P)%qfT$)e+lL=!lFkYalCA*2EzjG077PDx!ViGn-Nq@P zT{tN&FrYWVce-s0kc+NB{9&7m{k^H5w$4WNOoE;N5>Ax#j)<%osgucER(;c|W=raW zRdLnX7K1tHP7>?->=UUf%w+shH&s%3`o+(>zudXrTM{JeZqcF{*r|cfJKZV*%ae2L zZb;6G^-5t4?$)2D6(m&`t%W&>hW1HyqV`oMnxCvm{@IH#<|=LP%*){)E15f|16Hzh zc94_EUZIPzk)qk8$7)S}(-JQ2!oMQytN;DqZAuzOzFb4XYC&y?NT0^wJx-B3lv7=I-y2-=}S`sHD}YEEFpJKvC=XtJb9D z_nZG3>>Mss7YTY{%T<3WCoFJEopq*xSfFk+Rzb=*= zJ#3VG?e009S8^9;$Ep1+j@gvSFs>)IqG+DTWT@0jEabPd9XTKnrLCi04d8JD9g}EY zn>pXK|90}99STloE`kqBd75PJ0C2Vm zfDoS20}!FVDbfSuimT6{>_epXuIkNXTU(<}<#Et&|LsW%r)`6SZZq!G71Z-zM~y%O z>cJ>XqXKTj6W_3^n!f&UrD?D+n^{BsX0m~>Z8E6w!e zzkfOS!E<`3^Qvk+ug!7DOc@l|bhUulImfZQf!OkP2rk2Z#q$4$<1GUHVZZDG@#nUa zi3&>~7Pdl2OJd4wpuc!yB#%Ui+{A{Y>`&;lf_lavxxh{GPWp)LyTq zTpuW0g9=;-+x7Fs$@!Fhk<39IyPiaq)qFnMsaE zQ#{R$HJzdub?Jh&`~vF-F(ZWrn0_l+26sA2yLHOhwN>2Xc#uykcV;~WZP<*ZT=(mk zH%7b&8W2fVu1L*qt0V0^Hd79}Q`yb}V8nT~a||xegrVag?GiBjZ9Y~^eA!)i{Bilv z*Pnz|ymVarS-{R*%f$}>tD8|1^ds+>q9;mKK<2svSe>iq#{`9A)z;!||N24CyEvRK z2vkb!!4M95%i(u8s^^m>(jT2cy-J@Hy0f?3BfxQRL1dshX51!rC=g@izwXwZW$R?5 zS^J;Nu-lZajoXdM&D(uQPde>Q^QhouhadW;R8t4IT{5?0jdqWAttp$1XJwY z56EPwsTCr55*q);uR6@o$M`f|X5K}6^&dEOtC%-%!_RzvUh8TThCQ#(X$c`Y<&Q;~ zicg82{T2a|sghGrhrPkul|WtbYn+Ct6TB`qGw=vfR-?Pp|u;I7Yv2 zY#1_O!`2{BWn_rdL3yUC>?vojPUhI3*Gs)hUis_mb0pJ}DpSny0`24vmSo)?YHamy z+Ocy(;KN`sS(J~C=>cBb7hJ3iP@@!3GMu`=3dfcANE!9DE+rjQL)M#A_WOQ%5ErKg z4*T^~^*T(NN4`ye+Uqd;{-wZ}x}oUi@LY$!(aZ>7@R&>GIziB+9z{*nx}cS)il9GB@eEUq`46P8zDMd z?#0BjpI|#nk;<+G&Kc=3sJ@e`5kI?qwJ6tiveK7q>W6cWz!yFR*qRb)-}-)_j&Iuu zF8sU*WHNo(Edd`EE=k4dzd(~z-Tptt`8uPSLU-5J*47gxYbBJWa?Zf}eL(mLaGJ!e zKt?7M1`F(WNrb9S9Hg{l63i~mZLVsx{ZymmG&l0TO8<>OSgkCqBwX}Qp&C7C80UFw z_i^XMDcfqfUE4^V63wtdkQ6QdNCq<7@3@w$RHA%g-CZ>7*_f5}54(9Z4AV>`v)Nly zEs^SDF4J{%zOudusCtv*Rb?irpBfwcZ@Esf`?cy_6X&u`Es&4d$Aelf#{+!EMnSEm~PIQ zT9E+7@x|aRd^XbmP9p%Jy8{(Y9;WV`WA_De4g*EyGwx8zsjo-PQ{x2KQ+jF9PzlRW>8!dEke~B*JX{Z_;?O0wbQYMIwd)h7Mm3=w0Tlp zpUr{_h>eFX{pgQ|3dNXC?!J%ZOYhWCwK2YH_wTTc-D`DXC*rNA6)~ZLpMI3+gPdxl zT=SvvLSHo+*XnE3K4F-)Ftp0{dFao9w2^ldN#-6J=?g3Fva4P{gU#BpCeoL6ZHdu* zlfiv5dcjK}uZZdf{Xae*LT4X0^onjR8T4r6nCT>AroowKDPNa=YWLiB*kI0{pfE~h zoV@ehFcx8`1XITvXIFjm$p6H;Ci*myWdaBCxMG0R16)QTP^sn+;KudqR751R43cL1 zeD-DRuotzRvXwKOe&Slc>(_m_d?+I|rn%uFQ9bVaYH{acmb>`*jaHqa7482)$Ki8+ z;MgUU7QVF%a&Y(#g1h2_Vfp=}5|3R!m+iUQ%0a)15PAnHbKCyXQ%$%xH!|V+KA1b< zgrRF**vgyA@w6JX?ro3`TUgsw6%(#u#LoMQ3aRYXG!1V^G%@I|iIDh?6o0$6U!3sr zn63f>$Wr`+nS0mjtlHys>@Jmt$Ge|K7|s3WEGx8bfajB1)1MnwGbvmB7Xy-`S~@0J zL;2$J@^cP-t*(szzZl`l=@Iy70=Nv-771CMN#lm%82OHN2Q!trBms+nYNLAqvOxe} z0N}#Q6o3_i1O$aasbS8YX#*92G-daj#Vi0<(N^55YOAxA$E9L8sRXa$Ke@ZjYhfQ< z4YM^d=J5#koCQBa#Y69=CsUtrpHjkZxt;3p%-~VAO5K#~*B~?@q1QevCEJR7A zrqqZ zec!LRA^71hAe+A%Pc+3(NxU_Dy!Eno?_xAi9 z^`~G`exaJQ_mDh3MKU#TC;a(9O#0o+)Q6}`{Q;wRA4>1|WFEdxlz>{SP(B_nH6EKn zzcRng(;GJ#&>20Mo2k~?cSL-J*fxJk6EVbp+g|pNcUOF3*B?VRbHmtl zea}bM-%yq+V#>fqH^{lUegZ7`sLljbLbDHam;=pJJp;T@mX+|Y!=6--omyzSD63g; zChXI{^0`F&CSJL*Gt+|yP2j{QwF(o<%-{L*ByNSWjG)d8jKTk$Ej zs`+u1_5mIVNN?KtMNrixzQUU3N3Z@$t%f~+oognYlIy2_KvO9sR1fFCo9;cYT&pE3FWnohB3T#fz{0DX zG_~x=Al`3BDD=r&GZg)a`1ZkVeg7f|CGds63CDriI*kBW_=oMH<#lD1F$o{L z;*Pb8kts_p5(j&6z_g>RVE_>}Kw3@Yd@~+uf-w^>3+k+-?rMPPfKk`yCbsA5fyXtHF_zzR z#un!83X=1l*e4Q7?2NI@*91gCMOG3>RB^5uWP1e10ok;$BA*g!ZxeRN^9)cA@1#xw zI$pXb#7kRD%Z?#`Zh1XkSa;99xbFp(j+E_c8~h2vd13jFJZSLj zJADYsXM;vgQ5F9`qo=%+68FFCJ^S-^kn?%EaETJV{{Ro?X@M~i&un`1&8EgY%;B3V ziLC#o`?)?9Z?E)&d4P>rvP9aY6^mdfYP&3 zGJa)%#{7ALa5GSV2Oc*#(*n&y;{WIMD*) zR$tK?J~W(DU(&f#AvIQ1Mo+k4EdHRPh7cjkCuH)8(EbU}r*ZwQeLa~X3+qpvv9@2j2I`!JN4>BRkvTyd&NKh29Q zl4E|frG3o95D1w;0%P*B9Mft&PwuzsgW9IcYbH%?x&saL21=EFtM3sTSYcivBaR{g z*Goy)TwEEeeZsuMJijDA=!9iOy)a*5?+S z3Q3=M^{qL9>ye$Y_hLe>js)x|qSwDVp9Rg178~kIkn~?Bb@`IYKDNRIBzCWuK&cZ& z&c0tqc^`k}`qef4B!728aKvKYOzw2X-`^^^HacycSAykJ2&%@q0&EBj*Wreik0zNg zS?w(m`3S7I6m~|U&ki%mqP%xG5`%*BH0dCewNTX>f%UyFPm168mh1X-h`5*r*ccGp z-vcY;I+)F?5s)BKE&)u!S}5FykUN?N zWs%;kW2K!nKZk4%RK_;Ft?N_=>stHYHE~E#A3rK=kdQf1cB8P^&za1ln|7#)a{_}( zm76up(8il5m!~8DfcvD`oXo28)vw2bzLY7mii@HY@@CBe|6w zQsdAdU-=#qT^53IZBt|U#4}-z6q8Q^t@0Wc+>2%=|4wq1UrG2c<{WM5hVQ-u zB;UN%a^KV~c;VPv8Y`X$1@^ffQ$E=PH?{mnzni#^G+WPR^6?vRE%^7LLQ?jN%1tMz zPeR8WpRZmOUsgr#2~4K&JT~)RC9QYaIusoC8wzoyK^52%mm-R3UsBHH%r-o6zYu=V zE=P$hQ2-drS?%)SoiB3ia7Koah5CiBxG)D2rL+@eQhH4G^Y39E%Yk7-NB@??izmS= z*mek#JHr8V+HZHl^x0B)`nGjHB7LEIrf`|zwK=Q$#3!Y`fP@H@DI8DC+V$+($3UI~ zSjMap-kEMB_tsK%!$1t7nB^hSmO9q>!f33Z#O(E^!dJf)PG%7PLKJFS%~*hj3QXz#RNhAj6zC-GzwR+ETRX?BG5~P1xYs^L@WHBZ zGB!|e85MTl)36cKvIT*jstc7X^}BcS_J3S6F8({ zPOgx0x2XVfg^Phey8VWCJ4`XfoO?7NicitJjUA`gu&GNzF3UP^!St68m!olTl8#!3 zZ!=4oGCTFX)LGe>5<8OZo7BqmI3W{jUbPBO%YK(bG1ohr{>hRGaP|8V%Q)kjiXB$k zj1U*qMIbmd#y)JniWZ}@E%4r%p$GX4j5*7sw9g4QEVy_WV2n2yUeHLIqHW=u?o|%e zUr=_eX~cjDt_esLDtGxw47*DY6d;k9zRa=lJuPvs+-hwly1)PCYKPDgux_(0^o^E3 z{?^b%fBD}lY~b6}3R^*o#8&=_S8Z+$;a-RS?k z8Zp>LrhcLhl`bwQZ*#1E2RVax13V0JoVo)crdhw0NH8V%Bd-sV*5nNiX7VTzdFt(Qkp(Ao58405Pi1}-QoSUUgXkfdeG zvoCx4&wyqW&}Wr$R&uE<$f;@OuTh8_hNZo%9kF2Qth0bYNbRCz z+W5TQdS2lkdL`BusIK^%&fT=+ws()>k!i?{&#y0^lYHg%cTg@@uY?`jpTl!J?30!h_7^y8m#z-kFA)bFFrf zXBwHRU~)ne8f@R_#ZmCagnFND#y1D$7#Pps*^NL(1laMHufpc9>jKEa44EY2A!q0> zoHdts8d>IA@e!QT&3YqJ7(eN*+vT9#Q%$ZuK_EHz`vxxoj6AQhCyjo z*~$GYq45v=q&@pY5>_yT_anM)&rrS>bq23dgOfVe-;rAu(TG}W>F=n~ z34c*6kxlq|%*AJzr*CRKQsay~_C^0xkT`|nZlcgI@{P!){e5cLBZXxB`&kpitr;Sq zFm-W-)uY}}fG(G0L7<#g8)v>J99b#PelHZMg9XZI*tM41p=&YkjS&&GLDWJTjs3>l zC@$Xlc@Qf)aKeNlkmByKx$HNJB#kS;jPu|mH-bbS*05Kq1FlzknM z(toj4=*cHwcR4`k3sS~)&FwOwuav#_Hl`DEb(r^+7x$qA#W3%iNBp_HLjZkF`8iY?1J^{-8pbYAi-AoA_XOc1PLI;$zEPwYib8OJ7Rq6Sudx2sgbh~;(bndWu8BJhlK zL1&o|2(f-H*j4Zi&4FNTjDAyx%u@+dD~pq_0zBupnPW85@i&!elFquf z<{oCkBR{>|dy+aYPds5@$uHwZ;;o`&=P`F)K&y#9F`{=@LGy`++M%>Ku!0+?mSLNp zLGL?%weDDL z8q=EBTE&~-!Dm#Czgihom)OqfR&)x>7w#`J1UWhXDGEYgZECf9on zOs|={oDaBHHTG?%SFF9(bahstVEUG>J8~0Yh-6Kkqvhp6!8WC#YR6~Omc4d*M>J-- z{U1?!DOrO9fc14p;1Ia|@)S`q7D`OgI&#aAQwKa7PuFO0nH3>X+BmNHIgF7G^DMN#YDW6kWL$37jyump zlmhYy!x8?4pzK+Y^tQZB`#cyYJiqm}!RsYrAv4O3dTf<<>>l;7IF$N*tto!HAx7{p z?=g_b$9mH!_JN16i)gIH=#DAaRHl(CV|)@6`yFh+mF6zp4(B-yTlGQM4+8 z%n;ZP-$N1J2f-_Xdj`ty2AkB@n|oB7h)OVuT%;W!flC%p{mEvlgf2iI+>3lvJN@`W zXzQ?NR5?lqbpAWyDwh?ZrvyQ(nDaCzGf;;^dZGcCy{U)56IZG~>PoQkyH zQuxk!NPl(8g2vo-j^Dz4O?C)!0g?5caMQi)%qGv?rcU6wS%5_rx&e@Xj}!!&czoqA zW~7q<=r@fGN&&jgy$4X*e~rhw?|fpKvp?SBbNL?PcZe~(6MNjF!d;hUv;rtl0C^6A zs=WvJM_~IQpbUCZ#dq^sWF@Nh8=c{re;U3wAc#s^bG_Q>EDAy>sYxGBcGTjW-XaXA z#Vj!uKEemZWsOnZ9n=BPsi`?Y1M;4l&vOv#{5v)0xs;UPw;rxb_;h5&YJ5TX7g(0j zy(tQ}T6ic=OC;iLcg)UkJE!uo>BYD))`V5v?&%ty3A_ibKcbV&+evXhn^_<0$`Eng zX>}zP!4%&+NbPb7CbpR6 z-~n|&Cg+AXTdsy8_OtWL%MH|<*JJYs$|c26xD-8E&xv^Sa;7O*>+H!Z)N7+6C!jFS z*>Wb;H|Yf{lW&K7n3C@Odg1;tv!_aYQ8K{RC1I6%U4^2F5npe>VLiS{CxaP1pQTNQ z6gM}4J|J{t##At;CZBGq}hAbz{~_Q=4vt+Dl^=GmK5eJO><1{2^(@ zdHf%&?;K2XpA*$>*NGm5V;3oR7p)e)bOtxp$m%UK*u8WK{oY;wBCmr{0k6c!q(6c%+h*kL52& z4`*$RTaC-qI zPN8EAavp4TSYc#rC%P=b)(cSz)P0@KM7^^Ei)GW*pGob&umbTN2%K_I@%YD%n(KgZ z$BqJ4ka}*_RflYWQSR2gZ@}f<@Z8TtpFNY}kwsiY7H2?k{m_JG((D%~^>%dCv|1^I z#Hf(_`av4b5M21T>*?z)kU5j_d}j9W*c-lsug&_5xCFOm%JR4n_+UxmO#pSH0}9TQ zHNJ2&_t1mjXqxhu3`CaH+=!W~UU&3_M)k@uwux_?>klL@_N2}64#!}a0P=+fHE}cp zU^8uim${rXqPmPzf|BkMYqk|H@MJ5edY*g)K|{^BxO+fbNR-`o#G83jQ`H0XgRSh$ zc`Jm~>TcZ+VKUOf3PWI`6`6QNu3dVcbhY=7VLc?KZh8j+9r7cM283C^2>-A~?y%m& za$;%kZkV-k9oc1&Ko597JzB(V!4sO-&Sus(Bf;tz?|u76#y&J#ZI>O}4i1Q(17vpE zT&d)0z2yt2gNA)l$Qx776x|dfPqM4n(7)q9tHg*Q5M4K=?~eQ0rdLxmESSAoPl)`7 zgNj6632FDAvA^+$+RXq4sGILlx!C~Q0^l=!uJrTIz|MWK{Wc)gKT9s1O7ztJn)_MJ zyLL_H0dgc_w0wUdPaQK*jGhe6R(fUQ@DFrp^wTfCw)50&iq1r`$qy#phP0zkwdkJ- ze?8tbAiE~XY65My^ZOD^KTzTcZ(YB>yuHu=ll0HPU7b7{LDaY){gQ-XqyD_YM}0q< z>xq8r$lS}je&_E!d6UkZBuT#O-6hp z<5NRf1U|Svsv`WMT1f#lP=LGx<7)+89{}wzcOF>)Q#s8Q5Fs1GY*DRVg?JpCS`l^q zMRq8+AxL}f=&wrXe#-rf5c$)pjK#HoVOOkYl(8|uOMYFp7ii_3)*pBvza^f(OVcME z3sd(O%G+5jy~!N2R9yYL<@RpzwRbKN5`V6_ZfBOO<(J``o~#b5vC?qYphu}@VI_Uy z?&jVjL(3i3Vy=(tF88l=I3gtqZTV)qLXHG_F%S2*g;dl7XEa7SOe~EdZvvo<9dRbN z3T`i3zw&O%+~MT6@z{wW-$7Gm13%oURYOw)$2h`j%>CL10BK(yBd?77o~zD~{xUfL zk^JB3r&V67Mi={F!1V>}&y>)#!*~cB$Vbg7wi#Z>uI1JSI3$MQL)luSYa@fX%`rbjG)x?H2?uQ)!IaB|L%+s&o)>ouU#32?Sm zSa!uvQNKDs*`g8wfphbll-@N=m%YIBXo)(Ha!+k%t8#*qabWAcx052rGvP!JDP!hV@J7~A`uq$f3@3aw*N1JXeL1&$)*8GC&T_zCz74z4KT_) zjw$A5`u&L;)mb*t?wOPSIR4CCUKD%UHf)?h|$xaMQX__OJf=h||tP8Ha zw;!?YSJ&2m&VMYIq{rAcILu@=zD^5^hHtmwDc7QO3Q9BL<30_E2(bSmTq!DXp1si> zSs$&Ob;v1OvrS7Tf`V^g6rG$CyPsxfW_v&;+!kaE8?}7O9~XE#N2v4<9%hv+;qIjL z`dki?!2^y4{O~ZbAImPTZ-JS6S3Gq)dEB?cvjU&9O^c9@>cIb{*oJA@bAbe(yM50` zIAdgdLi#U7O6A*?$mF}j*}@C_yl>ryuv<8zxH9BGw8~;#k4sdKV{1%4!Ql}%UYvb= z-Ay!dIj`a@ZBj(Ni|lg7C%SCro(ptvFQ_VQ?)11Ai;7RNin5Rh$dBreQ)&6^7gmk* z4;7;QfWaG1?vzK2O*WW1?hg3D(NmpU0Fe3&jhkpzsG*$2zNSdVN$__56D!vV zMLbK2M;Ldhcqw5X8z)Bb`d{ezx{{VO{G^GxebcEmR$BS^m=x!sr#rf~7|ZhlbLT#I z&p#iyl_6W3G{NFa8@t?9qqMh#c~$pFt_*^BX@lyLWh~*J@+j$pEN6I4uEb82(z6~> zt`>1KE9y;6&c=x>bnR&7ViP#4b9qZor>2P_WxJnu&dYciNy*muSNZYreNnBL!-SAO zTZ5j?FbbOl)S<>B#__kcZ@TS#Qs4d7Z}v0#pcp_!!L&X4e<=>Hie^g)7k!NYYg)e> zJU9n*AfF6g&_nXN)uzEUM~3gi4|?#=2$!JM@VEYY2z_zhp3*T?gAqG?5+_TY3xv%;GNWdn=62~MV)fH%Myq~8Sls<_WiMWM#I zNrG|ifbU@L5kh*gUng)=P$e<&%hTU2dFJ8~uRIOXDIS?W+Bkjrn;346y{w}`HWv|8 z|F5H{#;jHy)!xYV)Sl1{{s=@nLc35h0di3V2wW>)r0*#EE5zd|2 z-J{i{FGrbFonCkOP)i9)in$C`kmM)**V(ERrNhADR1|I6*>H7G>v_2!VZ-&EAB;Mf z`8nN2!V9D6O8Snhu!2&&-+;rc^u)tMyKji1T#q8{dYGejFGO=4(JDRZ`ieSff&?um zur>vj3NvQ9)4oHVrGr+dlFNU!#>pEGNf=70tdeq^I@A25yuGz&S-e_nC*oK>BL%Y= z_5G}$VeYry8%F^hK7la(e+sz&qplY36_0{8J_Z2o8?)S?XoOakRtY&H^m!G?Q?Qa! zYF59`ZghwK-}a(;8WOkLt-J?xEKE5=eW(a*?}0+10qll_%;v8Q8|F;U;M2>?RgCHm zOY3Q}HNRQP{%{6#F1-juqNGGB%yjUse$5E>c9a5T9^!B_1w0+UFn4`n?NUW<*SSg2>p|l@v+S&?@O*P zKU@`WUESOKe0Zs;L}HRg9VV=b<#RMV!0({9Qt_5Raj0P{b@f0SWMMZTR8xZBLwvs_UomvrF;JYsDXH7|JWkV z@ReuHRkpSpv$sqB1bVKCiuOAf^GvRsnaJGyw*BW;ncv-a_dQbJaQHd}IIvrx|9?!kF)aU0(dzk_M^oAT5cr#H zYES2W?=22aGu<{FA~KSr4WA{yXp&QsIf$t(FW@oL$tgp$-tR$jY#hkYBK?YV_U%fToMY!%=dEL)G+I8K zRGYl@=3mk0bN_e(o%lDF%E695#Sk-UdzW;!XPo7_wbrT(@5K3adx}@bmq?pTCo6=1bT+Wu0X+l7xZG=MViIKt6CW z$b+Ui{fHehbHN=Kcd4#E-Z9GZ_f$@ur-|w5&!0b&;-iMJcj*}7Z2ZIq7(D_~eE}`Z zl?b`c?N5PFYyob1U@JmUaZnxQYprE1$QO;bWEY{%i@KzG_hdv?dgAvNOnFcJU4;_& z+EM(Kv&r4Rt-4RqX4kp%*;Ko#ZFZNrKi0Ri0n-rImH2C2x6lO6k+x$fw6_>6o)Z|2D6_G_C#6_s}o|qbD}grrfi( zKBg!1f{TlmTKSynJ)Q5DYFeuoJj-t!A^MjuwQ5WcN}CBLQg*S}caZhSvPgu~&lJG) zHSt^6c<35Q?^W~_sh5k&KHa@JB^Z36?eY@F233=hGG5lFJkZZN1c;@8&MwBNW zCif6kKRp;?q8#j3D-V*c4V3lXaz1!Lju;$y>DmmH%=dHU!8X{wJ__y@F52>Cyx2;o;Ix&nGph9Ve zPOqg}Tw$a*ulEUxx=QVO(sSh?XT`_8t;(!+U`#`H=vh1Ng#tXlEr z$NqlxL{tPkX=>)Vg3QK}uQ=+?iFGE}ABnwF=qWBrl@a>;_wOY)?4ouk$7*L*UhO7Z z34B#8@mwuUYV35#|EOIQcAh8{KOIb+uXM($t1qsAZX)APrG-qz8kXt3bFK0VNeu;k zpH{HPvenhmsLwTzbO(-Cq}S^%$HagZaRw0RxSFJM*jP^2#bH|Z<{iGbO)jWsBZVHz zU=<9j_FE`dmT-HFfP^{M_&H4PJx1Du1Bj%Iv1tuO-pVz~R4Y{t`9==jbs%td3rmp&r!C6oHJj{9r z=x`%Hb)sg1&T2$wR7rxY=!i3R9XLv>9c~EhuU)RtXK^1FU$xb9iXp*$9p0TU^79F# zxD16)F6@2o3cNJC2-~)NDOaL0nc3|~SeTt!ahG{CQ(xelBvV(gzPIi$nR#wqR8g6d zSZ;TMVkB|Eva9NUKN?f4cK6A|QqJp=uolt${#CS-wHj{{ycSN2?~wvx;3f#n(8EEQ z+=goP)OPm~gMZP3jz#C(V>Q5RVkHcUPF|*dw#j?7n@OhsLVhNaa^`&oAA|Iv7M4nK z218dEAJF`WUZ1cO2qaxT1RKKapMx8ADED$5T2Mu|^IMxmq|4bqNohOjgoZqqQTco= zSw$pbB72u zG1=kp_F0(_jGA&4L+65KKup(ugKKBMa8y7>%TJyU_2PUA;_!CpBlky%?Zn{FZv8N-_Ud zY8ULrGL?!AzmI0-#)fUQo*_Ros4YZziVw@)X%kkZ-Cx4+)1(CU2S*oRwbxQtSPcbDsC%l~fW2%+qcE@PfaugK1MErz-$I79E zEgKD2hwkhS=71MaXF!=TXFQF=3*yf48;r^rH9E)U>%uh7!PGY!SEjXovaG-_<(+RJ+pz24G+%%X6p@KM`RC4#rR~FX`!h> zL^T`oFnTH~Pwc0JtiWE3l-MyV39aqjaRVIM>HRZuanuX7RdCSsY3_cRc-D5?%};Bl zr%Ju#4h|Rw14A1`0lTs+)Y%jK3H+oaowCaCpoCT_{Sj<8K2N0H25IOAkF~YY*=?ZdP>n9X*}ixV*7*@{n+GvJtaz YwzRU?d31@Nx>TO2YClFkeEshK0Cq~Wv;Y7A literal 0 HcmV?d00001 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/node_gui.png b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/assets/images/node_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..aea4b36f3afcc3a2dca4373a20fe1e2c45ef7e05 GIT binary patch literal 37411 zcmbTe3p~?%{6FrTPWMnbD21ew6sLnkX2~g)P%77<5@IgReP*1Fa;Z=ug|>uL+c3gh zM&+_1<~n!Fbr_b*wrsZj-c#T2x9`{a{l5Rl|2#a-d7LiW`}6+1-mlB^@{T=kVJf*n zVS|K(gyfmie_2UL{8}L)v1-%0U%{^!xej+oNIZOh<}c$*A?Z{74)Ppo-BP;6y=un@cMS#E$92}+>D19x#C-QRCa8v!t1m}*21#ZRwux( zNbXqU75Cc>?|0J7Ew_vI#%ZdWo7v~RbZ9e|>pq0*?nqa%md#5}4$PF+K2XIwKwY#z zUwB$ukLQU}cV$Ye4%eiVY`|#kwwM^UVJJZ@gtaWe<<_8=0jKJFkM&wGW>6I~-+JpU^g6bh$pc&)+U^0nuL>j-QE~aew_b7*=8e>z?0ggHRl*=OmH} zVl;Z)hw6*zzKF{j9pp-H7JHhF6^-=tj3rWhy`~gbOGu38S5_9yAJtDZG$I|4kT}{H z6!d81({q(GlSOm4ihhxJ_gdC!TefJJCfy44sS*Xx$@iwAkntIVD(b#EdJEOrmvU!D zp+T2~nH5^}!p^bEzRw(|W7*o-eFaTLq9z%l zg>a>wgmqK4+8l=oIRt-5Bk65Xk*>P0mtiS&wT*&=#NQi#-aVtmPnItuE_Eoihgw9| zCRPzAS#;%NP)nCl8@&GnC3MmuM#BM1S`zHZy;hS4hY%Ypdg(R;N+W;W(7`ZF+7q$XRq z%0-_>Tt4lMyTYcd%p$9F8hO|#K22iB?!JFkD^ z;&lDi2NsBE_Z6?YE;2+8q7UH3D184@O=PuGr%rK%Js%&2(B4En-7t9IpJdaPKtui& zRPOQH@J&~ftDH9C?2xLKFbt%Q5ct+UsOs)<=U^hoC7*Msd0quC*rY>6LJU!AH>_ba zX7=#i?BU4{<|tBmlH2vXLONDsSMF5l!5Z20c9KF|R8m@_+lS@IXphvFl!IG`c_~Ur zG)t3~L;Qfsv7u6Kaq`CXrRhEeP4*w-QM6(?Mn8e9{Hq4ld-RndGayj-ss0dh#x<8Y z9xi8k>2o5gFy3KaHlPAS-iz05q|LjH&f^7Y;4MYO53vh|TB(Ibp`jXv(Z3UvajiNP0ZYZT0=hmw;WJa#@)jb_JjolIw z=|^B5;vh~QO3uWfiwTD2#o-(n(O9+!-&ru-_gmiMzsp7Q7--sv-s)xw)n7-=M zkuV+Ep=_Df-{&$AsvPQ+*M;0h#A*#~h-sj&jU(OdHS|WvQq4!siZhq~2bAUSZO8O( zN0d_rqCdQ0Ep}EE@l_-w^1l|!h!d$3n%%LGU{BZ=9TgqzkE_^}Pc=;>*%5=_-mJv3-$pZ^dj*1ALjCjaQ#YB{Xik&OYlPNJ8k{H1bJSv1~id2FV zG$coF-Z@U!E=+?+TpO-$%Ki$a-8Cz5BaC)X*d1Ho1cGko`^hw;6kY1OP`vxVaW4^p zL75Mo5ZbchX6Vt~1~jHDYM>fjxs>L|WpV$GhbqD?nwxuXhg_r`Yp-9rQhLiW+p6(GL*j`M_gWr@cOg zq5MvRBZR;`>mpO6MTO9^>`Qm!;s=<$i3u&POeF>}2KS8!GSorD;uf1(msoL{otv-8rpnf> zS`l+LpBL(Qe(EI8cfw!39a7o-frh&u`U1+lv3a@c^aIN=?K)iUB_ccjRwaxq}D zxBOh1w*D#S;NakQBQWrCJrOBSt?aY5W93YD=k+GCh<^IZ`SRRyDMFx`U|EM`Y&b-L zTuPuOM|{Bk+h=_*b6#FvA5|PV_~HAFblXK)oFY>=q+~6M)wl;@Sp@`1{o`1TUduSr z5>F);1nQ_~QR>Pn;SnBg+ zCV^75)KF!V-_+z1=$!oMVM17Xm0Fm(`Y5esIz)+o6q%0d3&p==I-of(9<0FqRR=X!DDC;iK5Ir7bshe(Q>N8n<7(96)cMzxd~57jc9& z>tt}z!f(1)CY)6<>UXl9X5giv2{-37H=p;>sDKKlzaq8j=I#1~2nbfGn{jJ7R=$Q@$)w^Ezg~vmsW-(FOGO>V zP^*hP^zSm-wB@gtM6VUMY`c~hkiHx~DXo2du!4v@53=ww9d$yP-qrQM&ntX%wo-R| zEnR+T2mM>!t*bYxIPj{+sHOd!Jtad5N=lFCCMP|8o`r`P5g2FrY-bU80KwNVr;3mZ z^^I=x@8<3GFW`JJuwn2!0|Kq^DN6Xk62<IMp2=jxx&0$?;dlRmsc@kTph&ii%b?eh2h%f5i29PhkcyeV$VW zHqT@Vn&6`&*Zj%$UN9mmO}TS^Vj>}18AI)YFbGEo1~m8glL@+2@2^3mX|N4c1s^Kv zHI|OGmNGgb-7n3uWWvG*?)7d@V)!@Hv9zT_hfwMN^4fY^%%wiP$qY<{6DJ*zik8QS zjJpIGloN(JWPq6unor;9Bh5JoNie4RhOj$q{F$h+!#BvhbbEA+H)H<**1!_aP_x5V z6x^YriVb71T=6z?87Y+u*{^~O1LJv%3l(cmJYDh4XXoeVKMDEXOu;MY(%0&~VGKXT z!4M@xaUAnQCLNd;35MsrV7x_`o!uwzL`LBg#^NT{!1I1U9q4+?p^|*Ms z@)VOP;XG{~&m8ABg?)X$*2*ZC>po@pC_Egz0V<7{-p(jYqfT9bV%@2jMsH_2>KYPh zS3igxTP|MT1&+#JPwIZ#8a&;TP0Xsf(jWy4=& z7GRiP$t<*13EHxkgKc8t%hZT2(c>qYClG1!+`hNXMEYBH}Vbj0E#LzIQ}FWmZ@2 zfJ}9Dwcia-&$IPrW@c8Hr%xXi6j7_14%N;ue2Fu5J}ulo6B_kB`fIYeJSRuTMuI#gtTHffgGPxb#1}&Xzf7&H8U)4&HZf|M26}W-cGgdrYp|_YZ+)4%SoUu41TuguRBp*}VCu9nf8b-Cf zS99SX(H4HkrotT0^8H_3m=3|XYiQ!ad42Vz-zt!8%8eS*Cy|JuFcv-oGRvOyFZSTC+$vk%P+S=mG z*)SfGX6Z2P>+7rBMeQnTp&=pgB0}fKws0?4|CHH#{`^f4eA6Lc!+5>3`ATWi&=oPC zq_%HgEA+=8m#mvAtz`IM?(5h5B;46jSnk^nPhEYCFi&%%psFdzj|sQtmzh&tin>TT z&(^jwVQd3?40Q%e&2KpU+<(!2X7|`5^5dQt%H@TH^CZG9Wpy@$0+s|}7D7q~C}&Ti zIm$+1ANhsREK4JnAy%*yHc8f8;GQ~(R>KnrpMq;?H0$s4M9oj*R3Rn^ckS0(hV7{{8tnsX^c?_=XNut9BB>_Ok6%DH-HsZ&Mw!> zu-xHLBf@Yk-($tPj8pqC?^g4xwv#@m14N{1OrNE}}VP<{;9 zqqDQKY7t2demA_l@a@G#MSEQZ`CWW})!X37XpVZ7$(e5GK@P*cmTG; z^uEl^!zwpU<^;hIcHUcUieb18KmL*ZSS?HCHM6Mdw&*swln(0OE9(6L71gb2@-6H@ zjHPnP+{3cUCdJ962g%OFCRZ??2oe=iI@V4TN(KzR!mRn2Vf!h_6hu%O%J!TA6Yh)y zw8pg&yDf>@c}6g>E7uE+6P#aJzFU`;!g!SC<_9}dF__1Gh22R7O>H4_$~1#Z)SmOW z_@e0BYS?KzEi+g*c*f50@mEPyEL6*tZ2AGkBCEM-Q03D$PDQCz^BDkLb#x<1sYsWDAY+KVz7sTO>rXnUG+5zl{d zZnV!Ij9N&(ismylCm1ZrFWc%98o!plqc$+KqXcX-X82<|fMIT){%PK~!lb7kOg?Ln z2abi6XKzoBL4K^Zd(&w&8pIm|k(MiyRygrW6+b^|K%AE8{8Fc@qqArFeq7ucBnstF zuc4t~MW3|PGvKV>Y<)j9w~Z)$YbO-N!TUs$*6i1W@r2i$sk<}I|$H8P`MO(bzg}Ox;-_T^yJies3hI5NlCck4j-XMIP8qVS? z|5l~Y{wk1z1#&iIrJ;~LJ3^%=b_hzTKz_YygVteFWM?4}Rh zg!|v?)xS&bBNVY86N!h_9sCsr&|F9L;6(UaUYq$qOJT{bR&?;BZcIvMgFP72L>$vS&?3XxE|vj3g_>+D;5^H*)zVe1q#<{n`FQC zaaDpu5>%(rvUuHSlg<`ydp_^Wmhzdt$%JG|T;p_LpVC4D%oGCkXJ%zZw=-OQ6I7geZ zyn7Fks#K-9$Kf$dGiRRFrDK>XJxdm6*HQ^1 z(9YKOHsskLCb*O0qtMyeDYJ}Psr}rt z-o{5cbq+KdGv4H))&BHuH;y|W<#`VHTuE1>!N5LhL) zMAYUKXK0Nqzbl*{_N<*HIaGgOU_NTaJ|E~l=cI=$_whSHWI96_(=VYIj*D_HZhmV@ zl{qfn-8{l8!Vqa{d5nf6u=_wzR*rhqxfZcJwB_hK$lg#6k!;`#1?66v# zOSq1vw{iFHe{}Zs_C8aps`bK-a`L?knC_AO4T_DYAggNv{~S6?ul5TI2)I<=+uLi! znCUMs6|g=&W7I8oyyl$%vhC0h`11Pc)2DqwF*woi8*5x^)7)IaPA$Mx2v{Xln~B@u zzJO$~$hLYo9CykjJ{s~b!yy=qo{92lXFw{L-T#sMR|heK!{zMK6qRD!U>N?oiiK9Q z(rE|&FCm;b?$qArTwn3$2fpo^-`Y9Y1I;BF@}}oqRluKLvp08$D!<}%UMkqWmNHtMwTwhzJSK_%tHkk=Z8|$+|9~}{ZZnXOSfdyj zrBuE&bZ;W>eE4F0^6cZco8z;Fqhe=ghnavdh_(@@QPDO40GR+}KwQW^qHXnwu$5f8kDelLPIqkv+AFVNV^nW0tZ{O|9)iwpmImJ>~IZ%%vw!zV-W}%_iyP5fQtF zT6v3Xg&jK*=d`JYs-td&>Z5w}Fl{a|HCbz6XTo&VW%?ww183t8Y6*hQQ_)2GCe_xS zRJXxhR_D$$m|5Z%WGyZR{}t;Cw=EzQVWVeBx%mN1Yo5l=q`8e$sOUub*oTc;Syh;D z-(Mt-?p!13*iwDR`P&EiR_8PDn6KmSBX54yqKBvolI1iTsr0G{r~qsp^h9{6lBpVGo2x21ZKZ=&59zR%dWp&uBQzKJ9cWZ=chKa{VXr7QQ?i z9i1f-5rKh<5`PY;Q$kbzp#2p7kyx?%tdTAx2&(mqyHV8=`)3wnfWMTYa5*@{Ys5>Alef(|_ zuXQeH{Z|8)B8(@83(At%u;_4M7?P(QL*IcBrWcbI(xXO4UDdU7R8lLIHoK|aPTnG~ z>9|2&w)Mh^Z)~uBGZELxjFfx6d8)P5>a=Z^$%BQ?jZ_Hb@>+@G%Ga8|yolat0~O9L zq-@&Ks+yRXXp;*=a=P6?qkTOFgi1tm{CcG~_tx5Z2o`RcmH1?vJP24q#yhJ!!A;1Ug<;X(DfvQJw$2dcJ}Tlc;ho=6*bHw%L7s&UN?xI_l` zN`8fa(`)s3%c*V04f#`r6D(GhD7>|7*A~wx4wO@`F~Pce!qt8;2$lY@?DbrEf6eIO zn7ov5X=gEh37RCUO62_5t!Z2I*AXeg5tsQ)>j+Kf%5;<_V2(g;%I1DRGM)uz;kh0$ zY#pdGQLsIU71t$9k0LEB?HJP`jm(s9mNO1fQqtUW`{Db-LudH^)Fg9g4^Gs{VUg2C z3pV>3I_~9XTtE5|?CZPPH#>vZ^2{h5cg{b#v3~TAUr7<7@X$S3vUPQJd#W~TD&6+X zNEc$Heh=u`eSgP?G08K`){{51z5lXtu(#iE=D{DGDv-J7f$HEl@i-|7iJgjTB>8>3 zFOiGZmHPrw9_lccbtb>PmN~VGJJX-|(74s&_-(q$=z=e0PR{uDmM9C8+Z+>DWs$WhttV#>4#zKRzq&YI35ds znczg)NYu@%$HNC0Qu2>DMYr9tXwEZM1eB1ub~AWt zGm7N$JAbnDBwl*q$oZ=U*X;)hdi12mOkss?)HW;nF$oDn*K@b0blSJpPc*CCSF-9H z2nYQ2h~)<=f5BPw=e5(OTNOQG79!dPPw+IBrUjh-gL$yh-FElSOS!Dxe)#q$nTZ?2 zoYqzc0-xV+=VTGRF=C){^1Qcx{rE2ue;~kmN7^s(_~i27Hagvhkg&m~!c}s_IgDEl z70N&n&iw-hA>Y1U-KIHixA9R%GftzC9^+w2M&I?v%odI zllIpy5;wB|a528K?h=#X`kbK?GH1X~ooNZBIZf{n16Txm$&~Gro{uO5Yd@8PSI3_) z^HI@nXy=d9&W{_L%)mbGYL`xKGp^Px%8Rr(b^m_+KEB?os`4^}7R-*p`^>CLCtgJ+ zLG8d3(1#RY+P>IvS)a7*nL+}O$X{!Vk{CyAA0Gw_r34B;IS?GQ@aW(G(jmfItvEZ7+tZYbr? z`Ho|NjA%V;n+`#7`e{&fYeseCTInV%6f1m^qVb!G|KWi$wUbBvSOXBU*7fJ|o>8$I z-xC~4eBO#2!FH}*}ZTMX5$M`;QD2MLm38p4q-XA(a&sJC6`aArq}5J@!wS58`(`;^=(J zKRq|fc}t1?EO&0=AzeT#`EV#-rigW-HMRVYj!LGf0jwFfCjja1;zI6jpEek-5B$|h zD}#>f?<*N-`!SN?pfu*S(TUgwI(7JN!vSvng@{T#MT*CbV%rYY(*W=PKvhv$M^(Gx(46)hU3Fl&~x?` zY$4wd%KRgsxq9_e(u22Z8it_@`!^{pya_mCd(P4_$0XV^g4gD;7_E#>5>}R$dQ7)% zKDO4i*;&inH#URo(X90#Jj#V1_WR+wR;ExFbYCSTJX)cCv>=JUIG_D2izOLH`c>f6 zA-X9^&xU!7|6cc--vt%e>1Msz4IkRn7B|`rKX|)UZlbz6gh^Yg+*j(awzKn7j8tj$ zo#Rz*V2@R2AjE|0G9Vg5E(kPK6bqj$aL+4%x6`vHIEjg&VM({ODH`ut? zyX%I2ej>Bc?c6yDiG?-bwD6*NuzO1#U>q@<7CFM#j|TKT*E*RsIu#a^Rm3r-I+Dng4^49GpZ8VvT+QHy zZrGuJyMDsf_=sPKmABhiHK(6IOKU`<4te>!RE;`MOOZ=2|4Y7a7r(vIDSF(*3qvie zEKRG(boWJWM7XjYU_@@ic*zf#YKY>Npq-O(ahv40xxzm@VL)W%+g-y^S;-&ApGagB zt_P`E@$l^e48Hj=Y@7FbStEWob>Fo5?^Em6gZI8kVQvB$&ucx=T3NQaeq!_0>({TB zk$0V7?dxv2a#?cYK!gYluX*mu0#gW>=Q&a=FtUtsMSJ z`CF@*7UXkppZbyDKu{H#WY7MFT}Ptb`wQQ-t-Z&cz8@$!BLcj=!Ke^8fQU=^PS;|8&@VGrLVL9;zc^=9NMD{vY8RgJ~ch{ zZ2PYkvp^>Xx%R|*2V`RK1IU33yM{{{n8Z1N=Tjtc5)vT>;Ow2INU}pA_~3O8hlR7s zqS+Z|^w;+wIc(dV1r^%ZSbx|P6>qkYd+p_}@j(CsR^r^DS*zs5qisOV&6t}&uDBj- zYG$6Kmyb{V`7i!heqY45d8k&zUWc=4e6HVk7fIdL_XuJ7$wJ>9kcYEX*DT@~7?j1S zP14Fn?PnhRvo{62nP>ePlH~ed;KW5YbH=UE@|z~}1e=~aK+wdbIa6~XtdcAj`| zeA?l5hKa4y7EQ--_^MFSX3aw%_a)>ljVIJQL&CnDce_227O+a@dgef(%Ct;%oLczkY^NHAsc(%miBxm-@6-Cx1r<+(}RMzd+} zoQu8{vvqgeF%u!}S!Jq6K$)}yN;5-!>3dBP<7}FBWwSv_ldK*5Dr9j7wP!q@^ucM} z;8_#W>0M{;{t@ueDKKO-*=DP5zzrP*&;(ySH3G`$LX5GrQGt#8KP)s072AWk`nt%h z<`Nw7(r{@rV$|T5Je%J&)=qrVsv9dLFlrK&;~F!z+E`cB%JK(h7(Wj6^APCzT%D1& zGk2>c6`-qwW<6}R7N!x%{bP2g;cg#&U!p~3)r)es{P>QD-MRHH2#525)?ueC&RstbPK$92M**Qivv}*%n7{Ty3NH`0-R zV{qvGL@``|2XdstAM|G16WrqVgnz46R?^H}B{|Ma2C@}t6z6V9&s!xp5tG=3DzCwq zspeKcW9}cC>kEDkNQlSAqJjMMF(9j9oHdEhU;lQK;)nj-AEx)F)eXd-fsa3k-*e)Q zmo7T*^{LF+>I9>D@4x7NyOUfOZt^+aRNeJpqt-=6p^w;iZt^6+*MJ-;2qY%^obInc z`d`2P*UY(o1kpHat!tdg%)!%SmA6X2jSrrnh%78E={}8Kr!OB!?(XjHia7a;L^EWK zr2azlV0Cu(g1ac8V#)6t?m_+ooK)#Bcwa{z8k0IN@l>HpzP8)91Z)617L?L<-;7>ABSv3o%rQtjm;VR&t7521sdLBf=&7*Hm1d=_ zH~${1J4JA!-w-Sb^NUs|Zc<#hyp~+{K9!r_?e}GS+u%P**b8YVzyYk-rbB9vjyiHg zZ|~KI*Q2Da-Z?p|^QoW5(Om<9ZNomfBHAZ$-1%zrW@Bm~X`t-ge!%E$xCi7s(bCFp zCDD(_*@=-+8%^6IBqYi%thbXyi&#E1MBRXDpQq{k0wu9w!p#wH#ELq5IAD{a&p^df zq0-CPaoxvf;583WkEd=9l7CBF2> z=C1+yL%j*cndAQk^A*{X2l~2RmAD-Zy1&CJxZ_~}sd*HM1wa^uGg$$s0sFkXUM_wj zVLCyLHSR$%$ScC6fv7JrY$W05?Ezu&AE1sL7jx9Fk=E24=#pqE0$=!dc=hwa)7PV= zi2Or4Z~0Scm839y`Dl`jx_(rX#A* zm1or!mI=&}y1QqX!i#=}Q{C?-!Rh-Ue*d94=Ie|vMHg9=rNQo*8ds{liLWiJDp`wI zq_TB}=PGQRLnpHPI0S)&A-@jA+1ku6LD5=jFexOdP9X^2`7k*#BDftyZG%TV?%RCr z3Pd^C>(pP2Kk%^UwTTV0Q{^)rZS}LZ2}SilCm6OFP&2+{fCu8RwcIqVm;5XJ{>Jyv zaWNV=`cOfS@_*2QL*Z*ya3lrgmL^_KS!sc-*5MZz(fFmiftsL0V`7U*Z%YP3nePm~ z(~L@L7$J-ts>=n8HkY70R4^&cTL$Am3d3_u{$02if)w6 zB?^b+tDXpjy;XwV(!hV5dD+fqBSZu`kFbjBP*JDzcD~U!T)QNE{LE1^E&|EB2%{+5 zAkum~?!mph&eazd7FszuI3&*f-?>Ntg*l3uKr!vMl8S6-Xs~i}cDDSkr#V3BzhyDl zbDR@u;(OnmhChNsHM*4J2T&Ax%oZHfJK^;2(S=-7-N8x99$%Ta+e4Xi7 z8K%#LiG`lwF*s}7neNoK&G%SwLk8r@UXOcb)T*l%VCp@Z<&xI+Jn!%~hUU(h`rDNs z9(t=RdDB`NUr9(@*^F4`*#K5^Q_M3k!}8r(0gh@TOW}(t5&EC_HkGRv z(}k&MIu2DL9SRG@M%|OwI;$UqU1J&EV$b#MNa%;Y>sfW2-f&!5Eq5rKV*(4+N)H}D zn$}~`3cSJpJW6H>Ypt!Vvv$r5S1+F^zuW!_Oa5E%@J*o+t3|qN5^jcpIA zA+61XVRnr*@qlc9K8#}4?@ldUKrmBpW7@7jIQ!==cN<+t4o!C04;tS$>+BvFXoAd? z`jT@1r6m(GH)I`w@2stFlS!$PP+T>H!hhYSGG#It9BG zo|l`Odscr6`F%6ylE!q#;hW0R1@aL`UzmDUeY;oHHCs}<#QpS}ghcrFR3T=vu8W-7 zfH!5Jgzoi$yw)V>NThC+G2;sUn6WLRXy*Es+vOHDx%`ryCw+8-By)?_kkdG84+Aj? zLY=8E$%8D-l(Wv3ij{d-pSgGpdDJ;V&Ou%q;QCRP zFw#xqdLR(&%yUjDs7xJ=?Kj9{cXb7Jr24ekbMpXw!XeR?RRNv3j)?_L%78s-nC~)P z8u)6+d0PvRIx%h{A@#GX>Ol9@X|KxjZKXTW*bohh%QMi15Fi7P#k8)zM>)W{ro@US z83y9{8$;&qS@Vh1*pB#I*6YkI;_ko098<3R-zeEi>5VJ6t!3tUJ1S%@#=5(VO1?~K zqjn7g>(OJrzGmZOWODWV0v+fJl~$#yS$aJCkEXexr+v-re4tg8o`pZGcG~}c$_vaq ze0(&!tF+20xqp4abhCS*o=XGX>4cAG6lQpjt=KDLhF%l4OOq3-aoS&yCOOWN( z{VXO~Zx=T`?XBMq*j1mIEi<3g?Wa-8?CM@1{Q`P>cXIetYB-gA$gtE>BS?B^ju}n5 z#&FnF{~r}}0d+Y+GDyUEM*$gs&+Nn0>3v?{a#U zLMp(c>KqvCktZ(v;ZMgxdx%YN0t3jBIEO5?bB#q|$eskWS6-7DEE-N%b-=FRYymg^ zbt+=!)4h-xMIQ+5jXwz$&fj8F+_bCCm2jwd(w3P+=qoJ(x>_X(n!jt&upPsES%@)Z zzz1xwhuQ?nL{-yr84Q%r{AoKtOA(pO2uTHeKRgpvl!MOWy!g5+x0;;;6u^dDGc9sb zZ)LJ7ccdS(7zm;44iY|KRMZ5LIG|}vWejZpkBk)rNPS`0_vHAKBG7EFyX;HiOKnd0 zJPkpG{A%bON^7z&RUVovf$m4xQJCydA4RG_-HTB$!oAl*D`e#Yk&?OgWa;^K8t zD05=MV>yL8aC7LL>BCO_n4%18MJoFJAk?Abr-Ab75D6=I1sTAua zlzi6=iWLiI{F$4s!FtYwl6AzMCcBzZQ&_E`pk?@0aW7MB@g#;>=j^t+;LDClIc zKbsPV<_x82r9e0%$3%DGmR`t}`}6`g*k&6p@GgN$z!rA^{~{knD=Y{K-QC* z0{?*4C@r=hr&?SocMMyXXnNnf?HXAc5(CVDGh1xr5UWEC^UKN(jOP2wtVqV5yy}W?{2_jF%tww415TriYs$>n27mg7hFz7?5XRoz>LN=ZME$WrvlnZ_%`xjx#!DjNAfXweM4F#48hRqbfE{|A4|&44XY81k7J z9%y7{+cDS+jQv9e-^;5BOenNPx5Y4T3brqh7DE0;1MBNMm7i>|4Zm

-6vMI+Aix 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可使用自动化。 + + + + + + +也可以用焦准节点连接各部分: + + + + + + +在破坏器的GUI中,将它们设为低红石模式,即无红石信号时运作。再将它们设为破坏。 + +它们会破坏长出的天青石簇,并将产物送入[网络存储](../nodeworks-mechanics/network-storage.md)。 \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/automated-smelting.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/automated-smelting.md new file mode 100644 index 000000000000..77d29b194010 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/automated-smelting.md @@ -0,0 +1,34 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:furnace + title: 自动化烧炼子网 +categories: + - example +--- + +# 自动化烧炼子网 + +你可以用桥接两个网络。此示例中的大网络会向熔炉阵列所在的小网络送出`#c:raw_material`物品,小网络再将产物送回大网络。 + + + + + + 蓝色网络导出箱,在GUI中设为向下方送出物品。 + + **这两个箱子之间没有连接,它们分属于两个网络。** + + + 绿色网络导出箱,在GUI中设为向上方送出物品。 + + **这两个箱子之间没有连接,它们分属于两个网络。** + + + 设为红色频道的存储卡,正被导出箱抽取;筛选器为`*`,即抽取所有资源 + + + 设为蓝色频道的存储卡,正被导入箱送入,模式为轮询 + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/cobble-gen.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/cobble-gen.md new file mode 100644 index 000000000000..a6083147ca2e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/cobble-gen.md @@ -0,0 +1,35 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:cobblestone + title: 刷石机 +categories: + - example +--- + +# 刷石机 + +刷石机是最简单的应用方式。按下方示例在刷石机前放置破坏器 + + + + + + + + + +再将破坏器配置为破坏`minecraft:cobblestone`,将红石模式设为**低**以保持运作。 + +![破坏器GUI,破坏筛选器为圆石](../assets/images/breaker_cobblestone.png) + +若网络中有,则也可使用下方脚本达成相同功能,适用于多台破坏器。 + + +```lua +local breaker_1 = network:get("breaker_1") +scheduler:second(function() + breaker_1:mine() -- 一直挖掘 +end) +``` + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/index.md new file mode 100644 index 000000000000..f68f58343100 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/index.md @@ -0,0 +1,9 @@ +--- +navigation: + title: 示例网络 + position: 50 +--- + +# 示例 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/milky-soul-ball-farm.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/milky-soul-ball-farm.md new file mode 100644 index 000000000000..57487bfe6dcb --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/milky-soul-ball-farm.md @@ -0,0 +1,35 @@ +--- +navigation: + parent: example-setups/index.md + icon: milky_soul_ball + title: 奶液灵魂球农场 +categories: + - example +--- + +# 奶液灵魂球农场 + + + + + + + + + + + + + 使用器对牛使用空铁桶 + + + 使用器对灵魂沙使用奶桶,并将产出的奶液灵魂球和空铁桶送回网络存储 + + + 放置器在使用器前方放置灵魂沙 + + + +此农场中的会用空铁桶为奶牛挤奶,并将奶桶送回[网络存储](../nodeworks-mechanics/network-storage.md)。另一个使用器则会对放置的使用。 + +> **注意:**‌放置器和使用器的红石模式均为低,以让它们保持运作。 \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/moving-items.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/moving-items.md new file mode 100644 index 000000000000..7c857ab59497 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/moving-items.md @@ -0,0 +1,105 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:hopper + title: 移动物品 +categories: + - example +--- + +# 移动物品 + +节点工程网络最简单的功能,就是从容器中抽出物品送至网络存储。本页面会介绍两种方式,首先是基础方式,随后是经过筛选的同一设施。 + +--- + +## 使用导入/导出箱 + +### 将物品送入网络 + +放置在中的物品会被送入[网络存储](../nodeworks-mechanics/network-storage.md)。 + + + + + + + + + 导入箱的内容物品会被自动送入网络 + + + +### 从网络中抽取物品 + +可将网络存储中的物品抽到自身物品栏中。 + + + + + + + + + 导入箱的内容物品会被自动送入网络 + + + +--- + +## 使用脚本终端 + +### 抽取所有物品 + +将潜影盒中所有物品抽入网络,不进行筛选。 + + + + + + + + + 重命名为‌**“shulkerBox”**‌的 + + + +脚本: + + +```lua +importer + :from(shulkerBox) + :to(network) + :start() +``` + + +> **注意:**‌如需反转方向,可将`:from(shulkerBox)`和`:to(network)`改为`:from(network)`和`:to(shulkerBox)`。 + +运行此脚本时,所有抵达潜影盒的物品都会被送入网络存储(即未进行筛选的任意存储卡)。 + +## 筛选:按物品种类路由 + +同样的网络,其中一张存储卡设为原木,另一张设为圆石,还有一张接受所有其他资源。 + + + + + + **规则**:`#c:cobblestones` + + + + **规则**:`#c:logs` + + + + + + + 重命名为‌**“shulkerBox”**‌的 + + + +重用前一示例的脚本即可,区别仅在于存储卡各自有了[筛选器设置](../items-blocks/storage_card.md#筛选器)。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/smeltery-subnet.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/smeltery-subnet.md new file mode 100644 index 000000000000..003143deab16 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/example-setups/smeltery-subnet.md @@ -0,0 +1,37 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:furnace + title: 烧炼子网 +categories: + - example +--- + +# 烧炼子网 + +特化子网是委任网络功能和重用配方的好方法。 + + + + + + 红色存储卡,从熔炉中抽取产物 + + + 蓝色存储卡,管理处理操作器发来的输入 + + + 黄绿色存储卡,接受导入箱的轮询 + + + 启用轮询 + + 频道设为黄绿色 + + + +上方的**烧炼**子网示例正接受广播的。该配方网络可用链接,以便其他网络使用其中配方。 + +示例中还有三台分别绑定至网络中的三个处理集,且均会将输入物品为送至。导入箱设为轮询至指向熔炉顶面的存储卡所在的频道。红色的存储卡则均指向熔炉的底面。 + +详情参见[自动合成](../nodeworks-mechanics/autocrafting.md)页面。 \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/getting-started.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/getting-started.md new file mode 100644 index 000000000000..e0b40383867a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/getting-started.md @@ -0,0 +1,37 @@ +--- +navigation: + title: 新手入门 + position: 10 +--- + +# 新手入门 + +## 所需材料 + +节点工程网络的驱动力来自于的反射性质。 + +## 培育天青石 + +可以像培育一样培育天青石,此操作需要用到。 + +## 第一个节点工程网络 + +不涉及脚本的简单网络,只用于查看任意多个相连箱子中的物品,和使用物品栏终端类似。 + + + + + + +- 此网络包含: + - 1x + - 1x + - 若干,用于连接所有设备 + - 若干,用于将箱子等外部方块连接至网络 + - 1x ,放置于节点朝向箱子的一面 + +### 扩展你的节点工程网络 + +- [移动物品](./example-setups/moving-items.md) +- [自动合成](./nodeworks-mechanics/autocrafting.md) +- [示例设施](./example-setups/index.md) diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/index.md new file mode 100644 index 000000000000..1b413e98d189 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/index.md @@ -0,0 +1,29 @@ +--- +navigation: + title: 概览 + position: 0 +item_ids: +- nodeworks:nodeworks_book +--- + +# 节点工程 + +可编程的物流和自动化网络。 + + + + + + + +## 章节 + +- [新手入门](./getting-started.md) +- [脚本参考](./lua-api/index.md) +- [节点工程机制](./nodeworks-mechanics/index.md) +- [物品/方块](./items-blocks/index.md) +- [示例设施](./example-setups/index.md) + +在脚本终端的编辑器中,可以将鼠标悬停在任意有文档的标识符上,以查看其签名和描述。悬停时按下[ ]可打开相关页面。 + +有关添加文档的信息,参见[docs/authoring.md](https://github.com/damienfamed75/nodeworks/blob/main/docs/authoring.md)。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/antenna_coil_assembly.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/antenna_coil_assembly.md new file mode 100644 index 000000000000..eb305cb3d425 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/antenna_coil_assembly.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: antenna_coil_assembly + title: 天线线圈组 +categories: + - infrastructure +description: 的原材料 +item_ids: +- nodeworks:antenna_coil_assembly +--- + +# 天线线圈组 + +的原材料。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/blank_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/blank_card.md new file mode 100644 index 000000000000..2e5b68ecc1d4 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/blank_card.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: blank_card + title: 空白卡 +categories: + - card +description: 所有其他[卡片](../nodeworks-mechanics/cards.md)的基底 +item_ids: +- nodeworks:blank_card +--- + +# 空白卡 + +合成所有其他[卡片](../nodeworks-mechanics/cards.md)的基底。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/breaker.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/breaker.md new file mode 100644 index 000000000000..8bc76d61a721 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/breaker.md @@ -0,0 +1,58 @@ +--- +navigation: + parent: items-blocks/index.md + icon: breaker + title: 破坏器 +categories: + - device +description: 破坏并采集前方方块 +item_ids: +- nodeworks:breaker +--- + +# 破坏器 + +破坏器能花费一定时间摧毁前方的方块,并将掉落物路由回[网络存储](../nodeworks-mechanics/network-storage.md)(或路由至脚本handler)。品质为钻石,破坏耗时使用木镐的计算公式,因此硬方块花费的时间显著更长。 + + + +## 放置 + +破坏器的前部会朝向放置时的视线方向(和放置活塞与发射器一致)。该面前方的方块即是`:mine()`的挖掘目标。 + +## 目标筛选器 + +破坏器的GUI中有一个筛选器,用于限定应破坏哪种方块。留空为破坏前方一切事物,设置方块可限制为仅破坏该方块。 + +## 砍树 + +面朝树木基部的破坏器会砍倒整棵树。 + + + + + 砍伐最后一块支撑树木的原木会连带砍倒整棵树 + + + + + +## 红石 + +GUI的红石设定可控制破坏器的运作条件: + +- **高**:有信号时运作。 +- **低**:无信号时运作。 +- **忽略**:与红石信号无关。只会在脚本调用`:mine()`时触发。 + +## 频道 + +破坏器GUI中有名称和频道的设定器。有关频道限制脚本能否访问设备的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 脚本 + +脚本API参见[BreakerHandle](../lua-api/breaker-handle.md)页面。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/broadcast_antenna.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/broadcast_antenna.md new file mode 100644 index 000000000000..fa10872b353b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/broadcast_antenna.md @@ -0,0 +1,47 @@ +--- +navigation: + parent: items-blocks/index.md + icon: broadcast_antenna + title: 广播天线 +categories: + - infrastructure +description: 广播网络控制器、处理存储器、导出箱的访问端口 +item_ids: +- nodeworks:broadcast_antenna +--- + +# 广播天线 + +有两种功能的方块,具体表现随放置位置而定: + +- 在上:广播网络的无线访问入口。与该天线配对的可在范围内读写网络。 +- 在上:广播该方块(和其他相接的)包含的,以供其他网络[自动合成](../nodeworks-mechanics/autocrafting.md)使用。 +- 在上:将该箱广播为无线出货口。另一网络中与之配对的会将箱中资源直接拉至该网络。 + + + + + + 两个处理存储器都被广播 + + + 向便携式物品栏终端广播 + + + 向配对的导入箱发送物品 + + + +## 配对 + +1. 打开广播天线的GUI。 +2. 向顶部槽位放入。 +3. 拿出晶体,该晶体便已被配对。 + +## 范围 + +默认情况下,广播天线的范围为128格。可用升级。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/budding_celestine.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/budding_celestine.md new file mode 100644 index 000000000000..13ccaf9cdfe9 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/budding_celestine.md @@ -0,0 +1,36 @@ +--- +navigation: + parent: items-blocks/index.md + icon: budding_celestine + title: 天青石母岩 +categories: + - misc +description: 表面上会长出天青石芽 +item_ids: +- nodeworks:budding_celestine +- nodeworks:celestine_cluster +- nodeworks:large_celestine_bud +- nodeworks:medium_celestine_bud +- nodeworks:small_celestine_bud +--- + +# 天青石母岩 + + + + + + +## 获取天青石母岩 + +若想要集中培育天青石母岩,可用附有精准采集的镐挖掘。母岩上会不断长出天青石芽。 + +## 出现地点 + + + + + + + +天青石母岩会自然出现在世界中的天青石晶洞内,这类晶洞和紫晶洞很相似。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/card_programmer.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/card_programmer.md new file mode 100644 index 000000000000..099b6133a193 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/card_programmer.md @@ -0,0 +1,34 @@ +--- +navigation: + parent: items-blocks/index.md + icon: card_programmer + title: 卡片编程器 +categories: + - tool +description: 用于从模板中复制[卡片](../nodeworks-mechanics/cards.md)设置 +item_ids: +- nodeworks:card_programmer +--- + +# 卡片编程器 + +卡片编程器用于从模板[卡片](../nodeworks-mechanics/cards.md)中复制设置。 + + + +## 使用方法 + +手持右击打开GUI,其中有两个槽位。 + +- **模板(左侧):**‌放入希望复制的[卡片](../nodeworks-mechanics/cards.md)(不会被消耗)。 +- **目标(右侧):**‌放入需要配置的卡片,目标的设置会变为与模板一致。 + +![](../assets/images/card_programmer_gui.png) + +还有两个切换按钮,用于控制是否复制模板的名称和频道。 + +> **注意:**‌直接放入或Shift点击进入“目标”槽位的卡片会在复制完成后立即返回你的物品栏。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_antenna_array.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_antenna_array.md new file mode 100644 index 000000000000..c56e916da901 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_antenna_array.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_antenna_array + title: 天青石天线阵列 +categories: + - infrastructure +description: 的原材料 +item_ids: +- nodeworks:celestine_antenna_array +--- + +# 天青石天线阵列 + +的原材料。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_block.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_block.md new file mode 100644 index 000000000000..3fb584d6a0b9 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_block.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_block + title: 天青石块 +categories: + - misc +description: 天青石装饰性方块 +item_ids: +- nodeworks:celestine_block +--- + +# 天青石块 + + + +出现于[天青石晶洞](./budding_celestine.md#出现地点),或合成自。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_ore.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_ore.md new file mode 100644 index 000000000000..08ebb8f2948e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_ore.md @@ -0,0 +1,20 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_ore + title: 天青石矿石 +categories: + - misc +description: 出现于洞穴,可产出天青石碎片 +item_ids: +- nodeworks:celestine_ore +--- + +# 天青石矿石 + +天青石矿石会自然生成于Y小于0的位置。 + +如需要可再生的来源,参见[天青石母岩](./budding_celestine.md)。 + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_receiver_dish.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_receiver_dish.md new file mode 100644 index 000000000000..00904bbd2070 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_receiver_dish.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_receiver_dish + title: 天青石接收锅 +categories: + - infrastructure +description: 的原材料 +item_ids: +- nodeworks:celestine_receiver_dish +--- + +# 天青石接收锅 + +的原材料。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_shard.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_shard.md new file mode 100644 index 000000000000..46a1895ef3da --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/celestine_shard.md @@ -0,0 +1,19 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_shard + title: 天青石碎片 +categories: + - ingredient +description: 表面上会长出天青石芽 +item_ids: +- nodeworks:celestine_shard +--- + +# 天青石碎片 + +参见[天青石母岩](./budding_celestine.md)。 + + + +天青石碎片是节点工程网络中许多方块和物品的核心原材料。 \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/charged_beam_catalyst.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/charged_beam_catalyst.md new file mode 100644 index 000000000000..51ae7dded2fa --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/charged_beam_catalyst.md @@ -0,0 +1,23 @@ +--- +navigation: + parent: items-blocks/index.md + icon: charged_beam_catalyst + title: 充能光束触媒 +categories: + - ingredient +description: 用于合成抓钩光束 +item_ids: +- nodeworks:charged_beam_catalyst +--- + +# 充能光束触媒 + + + + + +用于合成。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/craft_requester.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/craft_requester.md new file mode 100644 index 000000000000..4ba5b4e5832f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/craft_requester.md @@ -0,0 +1,48 @@ +--- +navigation: + parent: items-blocks/index.md + icon: craft_requester + title: 合成请求器 +categories: + - device +description: 收到红石信号时发起自动合成作业 +item_ids: +- nodeworks:craft_requester +--- + +# 合成请求器 + +合成请求器会在收到红石信号时发起自动合成作业。需为其指定所合成物品和单次数量。 + + + + + + + + + + + 红石信号激活合成请求器,合成所指定的物品 + + + +## 使用合成请求器 + +以物品右击可设置合成目标。空手再次右击可打开GUI,其中可设置单次数量和[输出频道](./craft_requester.md#频道)。 + +有红石信号时,它会持续发起合成作业并排队,一次合成的量即为单次数量。撤走红石信号即会停止发起。 + +与按钮配合使用,可进行单次合成;与配合,则可用于自动维持库存。量表会在库存量降低和回升时自行切换信号。 + +GUI底部的状态标签能反映请求器当前的行为。鼠标悬停以查看详情。 + +## 频道 + +合成请求器GUI中的频道选择器可用于选择产物去向的频道。 + +> **注意:**‌更多信息参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/crafting_cpu.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/crafting_cpu.md new file mode 100644 index 000000000000..ea0b13b97fec --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/crafting_cpu.md @@ -0,0 +1,79 @@ +--- +navigation: + parent: items-blocks/index.md + icon: crafting_core + title: 合成CPU +categories: + - autocrafting +description: 网络内自动合成系统的大脑 +item_ids: +- nodeworks:crafting_core +- nodeworks:crafting_storage +- nodeworks:substrate +- nodeworks:stabilizer +- nodeworks:co_processor +--- + +# 合成CPU + +合成CPU是自动合成系统的大脑。它会从[存储器](./storage_blocks.md)(本地网络,广播子网的处理集)中读取配方,从网络内抽取原材料,执行合成,并将产物送回。具体如何*使用*搭建完成的CPU,参见[自动合成](../nodeworks-mechanics/autocrafting.md)。 + +## 搭建CPU + +CPU永远都只包含一个。不过仅靠核心还不够,CPU还需要至少有一个(即“缓存单元”)与之相贴。没有缓存器的CPU无法在合成中途暂存资源,也因此不会亮起。 + +CPU的放置相对自由。不需要扳手,也没有外形要求。放下核心,在任意一面放下一个缓存器,将核心接到节点上,它就会亮起。 + + + + + 会产热,应当配2个冷却器 + + + +> **提示:**‌开始时,建议合成CPU中放置两个相连,以确保**效率**至少为100%。 + +## 扩展CPU + +其他CPU方块可增大或加快CPU: + +- (**合成缓存器**):至少一个。缓存器越多,运行合成时容纳原材料和中间产物的空间就越多。每个缓存器产生**2点热量**。 +- (**合成协处理器**):每个追加一条并行合成上限。每个协处理器产生**3点热量**。 +- (**合成冷却器**):抵消热量。孤立的冷却器产出**1点制冷**,每有一个冷却器与之相贴则**额外产出1点**。周围有四个冷却器相贴的冷却器能产出**5点制冷**,可见冷却器集群要远强于孤立的冷却器。 +- (**合成载件**):速度拉杆。缓存器或协处理器每有一面与载件相贴,均能为CPU增速**10%**,上限为**4倍(400%)速度**。与核心、冷却器、其他载件相贴的面没有效用,可见在缓存器和协处理器之间放置载件效果最佳。 + +这些组件只需与核心相贴或通过已属于CPU的方块与核心相连。无需扳手交互,也无需GUI操作。放下方块,CPU就将在下一刻更新。 + +### 热量、制冷、速度 + +所有缓存器和协处理器都会产热,冷却器的任务就是从相贴的热源中吸走热量。组件的排布方式和数量都很重要: + +- 热源之间**每有一面**相贴**追加1点热量**,原有的热量不变。紧凑的缓存器和协处理器长方体产的热要远高于分散放置。 +- 每个冷却器集群产出一个总制冷值(孤立为1点,集群后点数更多)。该制冷值**在与冷却器相贴的各热源间均分**。夹在两个缓存器之间的冷却器会向两者各输出一半的制冷效力,而处在六个热源之中的冷却器几乎无法充分冷却任意一个。 +- CPU的总制冷无法抵消总热量时,其速度会成比例地**下降**,最低可至**25%**。CPU不会停止运作,只会不停地挣扎。 +- 冷却器只能抵消热量,它不会将速度增加到100%以上。唯一能做到这点的方块是载件,最高可为4×。 + + + + + + + + + + + + +> **提示:**‌方块过热时会有相应的视觉效果——颜色发黄/发橙/发红,冒烟。 + +实用建议:不要把大量的缓存器和协处理器堆到一起再在周围放冷却器。可以把冷却器搭成专门的墙面或鳍板(让冷却器相贴),再安放热源,尽量保证每个冷却器只与一到两个热源相贴。最后在剩下的缓存器/协处理器面上放置载件增速。 + +## 配方 + + + + + + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/device_frame.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/device_frame.md new file mode 100644 index 000000000000..3300ef584e7d --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/device_frame.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: device_frame + title: 设备框架 +categories: + - device +description: 设备的主要原材料 +item_ids: +- nodeworks:device_frame +--- + +# 设备框架 + +所有[设备](../nodeworks-mechanics/devices.md)的原材料。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/diagnostic_tool.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/diagnostic_tool.md new file mode 100644 index 000000000000..5a725ba5e4af --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/diagnostic_tool.md @@ -0,0 +1,47 @@ +--- +navigation: + parent: items-blocks/index.md + icon: diagnostic_tool + title: 诊断工具 +categories: + - tool +description: 考察网络拓扑、CPU、脚本,以及最近的错误信息 +item_ids: +- nodeworks:diagnostic_tool +--- + +# 诊断工具 + +手持式节点工程网络考察诊断工具。右击网络中的任意方块可打开面板,其中会总结网络的组成和当前状态。 + + + +## 使用方法 + +右击目标网络的任意网络方块,、天线、存储器均可。也可点击[合成CPU](crafting_cpu.md)多方块(核心、缓存器、冷却器、载件、协处理器)的任意一处;工具会自行搜寻核心。 + +若所点击的方块不属于任何网络,工具便会通过叠加层消息告知,且不会打开面板。 + +## 显示内容 + +诊断面板会汇总网络公开的所有信息: + +- **拓扑**。网络中的所有方块及其位置、类型,和各方块详情。会列出各面的卡片与相邻的目标方块。 +- **网络身份**。控制器的名称和颜色,附带其红石模式、handler重试上限、区块加载启用与否的概览。 +- **CPU**。网络中的所有,其当前的合成作业(若有)、缓存使用、效率,以及多方块是否正常形成。 +- **终端**。网络中的所有及其脚本列、自动运行标记、运行状态,以及各运行中脚本注册的[处理集](recipe_sets.md#处理集)handler。 +- **可合成物品**。网络能自动合成的物品的完整列表,汇总自所有。 +- **近期报错**。最近10次来自网络内终端的错误信息,附带错误发生到现在的时间(刻)。 + +此视图只读。你在其中如何点击都不会影响网络,它只是为厘清位置和错误而存在。 + +## 何时使用 + +- 合成失败,不想前去周围也希望可以查看错误。 +- 你刚接手一个大型复杂网络,需要一份地图。 +- 你在尝试找出为何某配方无法自动合成;可合成物品列表会详尽显示网络实际知晓制作方式的物品。 +- 脚本好像跑不通;终端面板会显示其运行状态和注册的handler,无需手动查看每一个终端。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/dimension_range_upgrade.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/dimension_range_upgrade.md new file mode 100644 index 000000000000..da334a4a2f98 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/dimension_range_upgrade.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: dimension_range_upgrade + title: 维度范围升级 +categories: + - infrastructure +description: 升级的范围 +item_ids: +- nodeworks:dimension_range_upgrade +--- + +# 维度范围升级 + +将的范围升级至可在同维度内任意一处访问。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/export_chest.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/export_chest.md new file mode 100644 index 000000000000..6d3b92221dde --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/export_chest.md @@ -0,0 +1,47 @@ +--- +navigation: + parent: items-blocks/index.md + icon: export_chest + title: 导出箱 +categories: + - infrastructure +description: 从网络存储中抽取物品保存于自身 +item_ids: +- nodeworks:export_chest +--- + +# 导出箱 + +有9个槽位的箱子,能从[网络存储](../nodeworks-mechanics/network-storage.md)中自动抽取物品缓存于自身。 + + + + + +## 筛选器 + +箱子的GUI接受一系列筛选规则,语法与所用的一致。所有匹配任意规则的物品都可被抽入箱中。筛选器为空时导出箱不会抽取,以免新放置的导出箱立即抽空网络。 + +## 输出面 + +在GUI中可挑选一个自动输出面,缓存的资源会被送入该面方向的容器。适合为漏斗、熔炉、机器供货而无需脚本。留空此设置相当于仅手动拿取。 + +## 频道 + +设置频道后,导出箱便只会抽取该频道下的存储卡。默认设置会从网络中的所有存储卡抽取。参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 红石 + +GUI的红石设置限制了导出箱运作与否: + +- **高**:有信号时运作。 +- **低**:无信号时运作。 +- **忽略**:与红石信号无关。 + +## 无线 + +在导出箱上方放置,并将其与其他网络的配对。箱子抽出的物品会直接送至接收网络的网络存储。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/grapple_beam.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/grapple_beam.md new file mode 100644 index 000000000000..51ba40b56a9c --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/grapple_beam.md @@ -0,0 +1,25 @@ +--- +navigation: + parent: items-blocks/index.md + icon: grapple_beam + title: 抓钩光束 +categories: + - tool +description: 天青石装饰性方块 +item_ids: +- nodeworks:grapple_beam +--- + +# 抓钩光束 + + + + + +可以用于把你自己扔来扔去 :) + +若你处于单人游戏,或是服务端允许,则也可用它抓取生物。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/import_chest.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/import_chest.md new file mode 100644 index 000000000000..77b1310d6b80 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/import_chest.md @@ -0,0 +1,49 @@ +--- +navigation: + parent: items-blocks/index.md + icon: import_chest + title: 导入箱 +categories: + - infrastructure +description: 将自身内容物送入网络存储 +item_ids: +- nodeworks:import_chest +--- + +# 导入箱 + +有9个槽位的箱子,会自动将自身内容物送入[网络存储](../nodeworks-mechanics/network-storage.md)。可以手动放入、漏斗送入、用其他模组的管道运入,无论如何,导入箱都会将内容物清空到网络中。 + + + + + +不被接受的物品(筛选限制、空间不足等)会留在箱中,方便查看为何会堵塞。 + +## 频道 + +在GUI中设置频道后,导入箱便只会向该频道下的存储卡发送。默认设置会向网络中的所有存储卡发送。参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 轮询 + +在GUI中启用轮询后,导入箱会在多个目的存储卡间均分资源,而不会首先填充第一个。想要输入在多个存储目标间保持负载均衡时很好用。 + +## 刻间隔 + +GUI还会显示箱子尝试输入的间隔,默认为每秒一次。缩短可让输入更迅速,代价是网络负载上升;延长后网络空闲时间会增多。 + +## 红石 + +GUI的红石设置限制了导入箱运作与否: + +- **高**:有信号时运作。 +- **低**:无信号时运作。 +- **忽略**:与红石信号无关。 + +## 无线 + +在导入箱上放置,并将其与其他网络上方的配对。送入广播导出箱的物品会抵达本网络的导入箱,并随后和其他输入一样进入本地网络存储。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/index.md new file mode 100644 index 000000000000..2f42e25f9955 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/index.md @@ -0,0 +1,36 @@ +--- +navigation: + title: 节点工程物品/方块 + position: 20 +--- + +# 物品/方块 + +## 原材料和杂项方块 + + + + +## 工具 + + + +## 卡片 + + + +## 基础设施 + + + +## 终端 + + + +## 设备 + + + +## 自动合成 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/inventory_terminal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/inventory_terminal.md new file mode 100644 index 000000000000..2d95e62005fc --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/inventory_terminal.md @@ -0,0 +1,46 @@ +--- +navigation: + parent: items-blocks/index.md + icon: inventory_terminal + title: 物品栏终端 +categories: + - terminal +description: "[网络存储](../nodeworks-mechanics/network-storage.md)的视窗" +item_ids: +- nodeworks:inventory_terminal +--- + +# 物品栏终端 + +物品栏终端是[网络存储](../nodeworks-mechanics/network-storage.md)的视窗。 + + + +## 浏览网络 + +![](../assets/images/inventory_terminal_gui_expanded.png) + +- 左击拿取一组 +- 右击拿取半组 +- 双击将所有同种物品汇至鼠标 +- 向方格放下鼠标上的物品堆叠可向[网络存储](../nodeworks-mechanics/network-storage.md)输入 +- 鼠标上有物品堆叠时对方格右击可输入一个 +- 按住`Alt`以显示网络中可自动合成的物品 + +左侧按钮为: + +- 改变布局 +- 排序方式 +- 筛选方式(库存、配方、两者) +- 资源类型(物品、流体、两者) +- 切换自动聚焦搜索框与否 + +中央为可收起的合成方格,方格旁的按钮为: + +- 自动从网络中抽取 +- 在方格中均分原材料 +- 将方格中的原材料送至网络存储 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/io_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/io_card.md new file mode 100644 index 000000000000..fe05129c1258 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/io_card.md @@ -0,0 +1,45 @@ +--- +navigation: + parent: items-blocks/index.md + icon: io_card + title: IO卡 +categories: + - card +description: 用于通过脚本读写物品/流体容器 +item_ids: +- nodeworks:io_card +--- + +# IO卡 + +IO卡可让网络按需读写相邻方块的物品栏。安装IO卡后,脚本可查询方块的内容物,且能向其移入/从中移除物品和流体。 + + + +## 安装 + +IO卡需安装于的某一面。右击朝向需控制方块的节点面,将IO卡放入9个槽位中的任意一个。卡片的行为会应用于*该面*,也即同一节点可有多张IO卡在不同面控制不同相邻方块。 + +![](../assets/images/node_gui.png) + +## 功能 + +配有IO卡的方块会作为可被脚本访问的物品栏在网络中显示: + +- `card:find(filter)`返回相应内容物的[ItemsHandle](../lua-api/items-handle.md)。 +- `card:insert(items)`/`card:tryInsert(items)`尝试向其移入物品。 +- `card:count(filter)`统计匹配的物品(和流体,以mB计)。 + +和不同,IO卡对应方块**不是**[网络存储](../nodeworks-mechanics/network-storage.md)的成员。脚本需要显式对IO卡方块送入/取出物品,网络无法通过`network:find`查看这些方块的内容物,也不会列出它们。 + +## 频道 + +IO卡的GUI中有一个频道选择器。有关频道限制脚本与预设能否访问此卡片的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 脚本 + +IO卡handle中可用方法的完整列表参见[CardHandle参考](../lua-api/card-handle.md#物品栏卡)。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/link_crystal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/link_crystal.md new file mode 100644 index 000000000000..6d0e00b35492 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/link_crystal.md @@ -0,0 +1,25 @@ +--- +navigation: + parent: items-blocks/index.md + icon: link_crystal + title: 链接晶体 +categories: + - infrastructure +description: 用于链接广播天线 +item_ids: +- nodeworks:link_crystal +--- + +# 链接晶体 + +用于为配对。 + + + +## 使用方法 + +见[广播天线](./broadcast_antenna.md#配对)页面中的配对步骤。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/milky_soul_ball.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/milky_soul_ball.md new file mode 100644 index 000000000000..217976db8915 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/milky_soul_ball.md @@ -0,0 +1,25 @@ +--- +navigation: + parent: items-blocks/index.md + icon: milky_soul_ball + title: 奶液灵魂球 +categories: + - ingredient +description: 内有一独特灵魂,可用于合成 +item_ids: +- nodeworks:milky_soul_ball +--- + +# 奶液灵魂球 + +浸着奶液的灵魂,很是独特,可以直接用于合成。也可以朝着你最大的敌人丢过去,给予它凋零效果。:3 + + + +## 如何制作 + +手持右击方块。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/multi_dimension_range_upgrade.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/multi_dimension_range_upgrade.md new file mode 100644 index 000000000000..02977cef9828 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/multi_dimension_range_upgrade.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: multi_dimension_range_upgrade + title: 多维度范围升级 +categories: + - infrastructure +description: 升级的范围 +item_ids: +- nodeworks:multi_dimension_range_upgrade +--- + +# 多维度范围升级 + +将的范围升级至可在所有维度访问。 + + + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_controller.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_controller.md new file mode 100644 index 000000000000..b1b39b9f0a34 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_controller.md @@ -0,0 +1,38 @@ +--- +navigation: + parent: items-blocks/index.md + icon: network_controller + title: 网络控制器 +categories: + - infrastructure +description: 网络的心脏,每个网络都要有一个 +item_ids: +- nodeworks:network_controller +--- + +# 网络控制器 + +每一个节点工程网络都仅需要一个控制器。若没有控制器,网络中的[管道](pipe.md)和[节点](node.md)便都不会运作。 + + + + + + +放下控制器,从它所在位置延出管道,与管道相连的方块均会加入网络。 + +## 身份 + +在GUI中可为控制器命名和选色。名称仅作装饰,网络中的节点会和控制器保持同色,以便分辨距离较近的多个网络。 + +## 区块加载 + +GUI中可以切换区块加载与否,即是否强制加载网络占据的所有区块。适合给出远门时还要维持运作的自动合成设施使用。 + +## 每网络一个 + +连接到同一条管道的两个控制器会互相冲突,导致网络停机,直至去除其中一台才能恢复。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_wrench.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_wrench.md new file mode 100644 index 000000000000..1e92048112bc --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/network_wrench.md @@ -0,0 +1,47 @@ +--- +navigation: + parent: items-blocks/index.md + icon: network_wrench + title: 网络扳手 +description: 切换管道连接与否,链接焦准节点 +item_ids: +- nodeworks:network_wrench +--- + +# 网络扳手 + +网络扳手是在不破坏方块时调整网络形状的工具。它能切换某段管道连接与否,也能远距链接。 + + + +## 切换管道连接 + +Shift+右击两个网络方块相连的面可切换其中有无管道连通。方块本身没有变化,只是网络会将该处视作没有管道。 + +这是扳手最常用的功能。下面是常见的使用场景: + +- 让相邻但不合并 +- 通过断开一条管道拆分网络 +- 阻止或设备与附近网络产生误连接 + +在同一处重复此操作可恢复连接。 + +## 链接焦准节点 + +是例外。扳手可将两个相距较远的焦准节点链接起来: + +1. Shift+右击焦准节点未接触网络方块的一面,以将其设为预定来源。选中的方块会以边框高亮。 +2. 右击另一个焦准节点以切换两者之间连接存在与否。 + +成功链接后对焦准节点的选择依然保留,可借此将多个焦准节点链接到一处,期间不需要重新选择。 + +### 规则 + +- 两焦准节点必须与选择位置位于**同一维度**。 +- 两方必须属于同一个**网络控制器**。扳手不会连通两个网络。 + +扳手会通过聊天栏消息告知哪一条规则未满足。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/node.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/node.md new file mode 100644 index 000000000000..98abb10ea2f1 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/node.md @@ -0,0 +1,56 @@ +--- +navigation: + parent: items-blocks/index.md + icon: node + title: 节点 +categories: + - infrastructure +description: 管道网络中容纳和使用卡片的主体 +item_ids: +- nodeworks:node +- nodeworks:focus_node +--- + +# 节点 + +节点是能保有[卡片](../nodeworks-mechanics/cards.md)的方块。网络的连接通过[管道](pipe.md)传递,如需在某处通过卡片与相邻的方块交互,将该处的管道替换为节点即可。 + + + +## 面 + +节点每一面的功能都受相邻方块的影响。朝向其他网络方块的面会变为管道连接,同时禁用该面的卡片槽。朝向常规方块的面则可容纳卡片,并会以该方块为交互目标。 + +## 打开GUI + +右击非管道面以打开卡片方格。Shift+右击可打开*背侧*面,在背侧面被阻挡时很好用。管道面无法打开,界面中这些面的标签也会变暗。 + +![](../assets/images/node_gui.png) + +## 卡片 + +向设备面9个槽位中的任意一个放入一张卡片,可赋予该面相应能力: + +- :可让网络向相邻方块送入/从中移出物品。 +- :将相邻方块的物品栏标记为网络存储成员。 +- :从该面读取和向该面发出红石信号。 +- :读取所朝向方块的状态。 + +同一面中多张卡的能力可叠加。同时放有IO卡和红石卡的面能在该面上移动物品**和**发出红石信号。 + +## 焦准节点 + + + + + + +是为长距连接设计的变种节点。使用为两个焦准节点配对,网络即会将它们视作相连,即便中间没有管道。很适合用来连通管线缺口和跳过机器集群。 + +焦准节点六面的行为与常规的节点一致:同样的管道/设备/临空面交互模式,同样的卡片槽,同样的与相邻管道自动连接。扳手配对得到的链接叠加于相邻面功能之上,两者互不干扰。 + +## 配方 + + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/observer_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/observer_card.md new file mode 100644 index 000000000000..97a5418ff842 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/observer_card.md @@ -0,0 +1,37 @@ +--- +navigation: + parent: items-blocks/index.md + icon: observer_card + title: 侦测卡 +categories: + - card +description: 读取节点面所朝方块的ID、属性、状态改变事件 +item_ids: +- nodeworks:observer_card +--- + +# 侦测卡 + +读取卡片所安装面方向上的方块。公开方块的ID,方块的所有状态属性(`age`、`facing`、`waterlogged`、`lit`……),以及一个状态改变回调函数。脚本可用回调函数在方块变化至特殊状态时立即作出反应。 + + + +## 用途 + +受生长状态限制的农场是最主要的使用场景。连接至原版侦测器的活塞会在每一次生长阶段变化时伸出一次,也即会直接破坏小型晶芽得到1个碎片,而不会等候长成晶簇的4个碎片。脚本可以通过侦测卡直接读取生长阶段,并只在方块进入最后阶段时向破坏器发出脉冲。 + +它也是读取非红石信号状态的恰当工具:活板门开关、门状态、蜂箱蜂蜜水平、滴水石锥填充、阳光探测器读数、甜浆果/海带/甘蔗生长状态、方块下方冰/雪的形成,以至于任何具有可比较`BlockState`属性的事物。 + +## 安装与脚本 + +安装方式与相同。详细步骤参见[IO卡安装](./io_card.md#安装)。侦测卡会读取*所处面*前方的方块。 + +所公开方法的详情参见[侦测卡脚本API](../lua-api/card-handle.md#侦测卡)。 + +## 频道 + +侦测卡的GUI中有一个频道选择器。有关频道限制脚本能否访问此卡片的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/pipe.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/pipe.md new file mode 100644 index 000000000000..ff368687880f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/pipe.md @@ -0,0 +1,47 @@ +--- +navigation: + parent: items-blocks/index.md + icon: pipe + title: 真空管道 +categories: + - infrastructure +description: 所有网络都需要的建筑方块 +item_ids: +- nodeworks:pipe +- nodeworks:covered_pipe +--- + +# 真空管道 + +节点工程网络的导线。管道能传输物品、信号,也能在网络的所有方块间进行路由。 + + + + + + +将管道相邻放置(或相邻任意网络方块放置)后,两者会自动连接。 + +## 隐藏管道 + +### 覆层管道 + +在工作台中央放一个方块,再在周围放入8根真空管道,即可制成覆层管道,将管道本身隐藏起来。 + + + + + + +### 焦准节点 + +可以借助穿过玻璃,也相当于能穿透墙壁。 + + + + + + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/placer.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/placer.md new file mode 100644 index 000000000000..f2d25910d10a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/placer.md @@ -0,0 +1,45 @@ +--- +navigation: + parent: items-blocks/index.md + icon: placer + title: 放置器 +categories: + - device +description: 网络范围内共享的放置器 +item_ids: +- nodeworks:placer +--- + +# 放置器 + +放置器能在自身前方放置具有方块形态的物品。脚本通过物品ID选择所用物品;也可通过传入[ItemsHandle](../lua-api/items-handle.md),匹配的物品会从[网络存储](../nodeworks-mechanics/network-storage.md)中抽出并放置。此操作是同步的,脚本会在请求的同一刻得到`true`/`false`的返回值。 + + + +## 放置 + +破坏器的前部会朝向放置时的视线方向(和放置活塞与发射器一致)。放置器会直接在该面前部放置方块。仅具有方块形态的物品有效,工具、食物、杂项物品均会导致放置调用失败。 + +## 方块筛选器 + +放置器的GUI中有一个筛选器,用于限定应放置哪种方块。匹配的物品会在每次放置器触发时从[网络存储](../nodeworks-mechanics/network-storage.md)中抽取。留空可让放置器停止在空闲状态,直至脚本请求。 + +## 红石 + +GUI的红石设定可控制放置器的运作条件: + +- **高**:有信号时运作。 +- **低**:无信号时运作。 +- **忽略**:与红石信号无关。放置器只会在脚本调用时触发。 + +## 频道 + +放置器GUI中有名称和频道的设定器。有关频道限制脚本能否访问设备的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 脚本 + +脚本API参见[PlacerHandle](../lua-api/placer-handle.md)页面。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/portable_inventory_terminal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/portable_inventory_terminal.md new file mode 100644 index 000000000000..8fbb67de5d09 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/portable_inventory_terminal.md @@ -0,0 +1,50 @@ +--- +navigation: + parent: items-blocks/index.md + icon: portable_inventory_terminal + title: 便携式物品栏终端 +categories: + - tool +description: 所链接网络存储的便携式视窗 +item_ids: +- nodeworks:portable_inventory_terminal +--- + +# 便携式物品栏终端 + +手持式的。能通过配对于上方无线连接。 + + + +## 链接至网络 + +便携式物品栏终端与网络建立链接需要三样组件: + + + + + +- 目标网络中的 +- 该控制器上方的 +- 与该天线配对的*(不是和处理存储器配对)* + +



+ + +准备好经过配对的链接晶体,放入便携式物品栏终端右上方的槽位即可。 + +链接建立后,便携式终端的物品纹理会亮起网络的颜色。 + +
+ +## 范围 + +更多有关广播范围的信息参见页面。 + +## 使用终端 + +GUI中的所有内容与完全一致。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/processing_handler.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/processing_handler.md new file mode 100644 index 000000000000..0712c598f9f1 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/processing_handler.md @@ -0,0 +1,59 @@ +--- +navigation: + parent: items-blocks/index.md + icon: processing_handler + title: 处理操作器 +categories: + - autocrafting +description: 使用微型网络注册一个处理集handler +item_ids: +- nodeworks:processing_handler +--- + +# 处理操作器 + +适用于[处理集](./recipe_sets.md#处理集)配方的方块型handler。放置处理操作器,接入网络,再为其绑定配方,[合成CPU](./crafting_cpu.md)即会将配方的原材料路由到机器中,并将产物拉回网络,整个过程无需Lua脚本参与。 + + + + + + 指向熔炉顶面的蓝色频道存储卡 + + + 指向熔炉底面的红色频道存储卡 + + + +## 操作器的两个面 + +操作器区分前面和后面: + +- **后面**:接入包含的父网络。 +- **前面**:接入其自身组建,由管道、节点、存储卡组成的**微型网络**操作器相当于该网络的控制器,所以该网络无需(也不允许)加入。 + +将操作器的后面接回主网络,再从前面为实际处理配方的机器接线。 + +## 绑定配方 + +右击操作器打开GUI,在其中选择父网络处理存储器内的一张。处理集中的每一种原材料都各居一行,且各配有频道颜色,外加一行用于配方输出。 + +## 频道路由 + +操作器使用频道决定微型网络中哪些收到哪些物品: + +- **输入频道**(每种原材料各一个,默认蓝色)。CPU开始合成作业时,各项输入会被送至微型网络中频道匹配该原材料颜色的存储卡。 + - *若需要借助表达式、物品数据、可堆叠性等自定义路由:输入物品会遵守存储卡的筛选器* +- **输出频道**(共用同一个颜色,默认红色)。操作器会监测微型网络中在此频道下的存储卡,并将产物抽出送回父网络。 + +对于上方的熔炉示例场景:熔炉顶面的蓝色存储卡接收待烧炼的输入,熔炉进行加工,底部的红色存储卡则抽出产物。 + +若机器需要不同原材料进入不同槽位,也可让不同原材料使用不同的颜色。比如要求输入进入某一面,燃料进入另一面时。 + +## 与脚本handler对比 + +处理操作器是[`network:handle(...)`](../lua-api/network.md#handle)的无脚本版本。若配方形同“送原材料出产物”,则使用操作器;如需处理自定义时序或多步流程,请使用脚本handler。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/receiver_antenna.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/receiver_antenna.md new file mode 100644 index 000000000000..152fc21e9540 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/receiver_antenna.md @@ -0,0 +1,34 @@ +--- +navigation: + parent: items-blocks/index.md + icon: receiver_antenna + title: 接收天线 +categories: + - infrastructure +description: 连接至已广播的处理存储器和导出箱 +item_ids: +- nodeworks:receiver_antenna +--- + +# 接收天线 + +用于将网络连接至其他[子网](../nodeworks-mechanics/subnets.md)。很适合用来把[处理集](./recipe_sets.md#处理集)配方拆分到多个网络中去,同时保留[自动合成](../nodeworks-mechanics/autocrafting.md)功能。 + + + + + + 从其他网络处接收处理集配方 + + + 从正在广播的导出箱处接收物品 + + + +## 无线接收物品 + +在上方放置接收天线,再与其他网络中上方的配对。送入正广播的导出箱的物品会抵达天线所在的导入箱,也即,在两个网络间无线传递物品。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/recipe_sets.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/recipe_sets.md new file mode 100644 index 000000000000..e8bc61c7991b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/recipe_sets.md @@ -0,0 +1,76 @@ +--- +navigation: + parent: items-blocks/index.md + icon: instruction_set + title: 配方集 +categories: + - autocrafting +description: 存储[自动合成](../nodeworks-mechanics/autocrafting.md)需要的合成配方 +item_ids: +- nodeworks:instruction_set +- nodeworks:processing_set +--- + +# 配方集 + +配方集是用于存储[自动合成](../nodeworks-mechanics/autocrafting.md)所需配方的物品,分为两种。 + +配方集是模板物品,能存储单个配方供[自动合成](../nodeworks-mechanics/autocrafting.md)参考执行。配方集需在GUI中先行编写,再插入相应的[存储器](./storage_blocks.md)中去。 + +共有两种配方集,对应两类配方: + +- **指令集:**‌原版的3x3合成配方(有序、无序) +- **处理集:**‌所有其他配方(烧炼、模组机器、多输出加工流程、所有会超时的流程) + +--- + +## 指令集 + + + +3x3的合成模板。所有可在原版工作台中执行的配方均可。 + +### 创建配方 + +右击打开。拿起物品点击虚槽位留下虚影(无需消耗物品),点击空槽位可清除。产物槽会在输入匹配已知合成配方时自动填充。**清除全部**会重置方格。 + +GUI中还有一个**标签替换**切换按钮。启用时(默认),配方会接受与虚影在同一标签下的任意物品,所有标记为橡木木板的箱子也会接受白桦木板、云杉木板,或者其他任意在`#minecraft:planks`下的物品。禁用可限制为精确匹配物品ID。 + +> **提示:**‌JEI的‌**(+)**‌配方转移按钮在此GUI中有效,可以先在JEI中挑选合成配方,再点击(+)一次性填充。 + +### 部署 + +将编写完毕的指令集放入。相邻的指令集会形成集群。只要集群中*有一个*方块在网络中,集群内的其他指令集便都对CPU可见。 + +--- + +## 处理集 + + + +形式自由的配方,最多可有9个输入和3个输出,以及可选的每次合成超时时限。所有3×3方格无法处理的都能用处理集(烧炼、高炉烧炼、模组机器、多输出加工流程,或任意‌*“输出前需等待N刻”*‌的配方)。 + +### 创建配方 + +右击打开。GUI中有: + +- **输入方格**:(3×3)虚槽位,接受任意输出,位置随意。 +- **输出列**:(3个槽位)虚槽位,接受输出。 +- **超时字段**:0–999刻(0 = 无超时)。`+`可`-`按钮的调整步长为20,Shift点击的步长为100。 +- **串行切换**:启用时,CPU不会在运行此配方时重复并行运行。 +- **清除全部**:重置所有设置。 + +槽位内资源数量可用滚轮滚动调整(向上滚动+1,向下-1,在数量为1时向下滚动则清除)。 + +> **提示:**‌JEI的‌**(+)**‌也在此有效,且*普遍*有效。只要是JEI知晓的配方类别(烧炼/高炉烧炼/模组加工过程)均可。 + +### 部署 + +将编写完毕的处理集放入。和指令存储器类似,相邻的处理存储器也会形成集群。CPU会对实际执行配方的外部机器进行调度。 + +## 配方 + + + + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/redstone_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/redstone_card.md new file mode 100644 index 000000000000..bc019c40b3fe --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/redstone_card.md @@ -0,0 +1,31 @@ +--- +navigation: + parent: items-blocks/index.md + icon: redstone_card + title: 红石卡 +categories: + - card +description: 读写所安装节点面处的红石信号 +item_ids: +- nodeworks:redstone_card +--- + +# 红石卡 + +在所安装的节点面处读写红石信号。 + + + +## 安装与脚本 + +安装方式与相同。详细步骤参见[IO卡安装](./io_card.md#安装)。红石卡会读写*所处面*的红石信号。 + +参见[红石卡脚本API](../lua-api/card-handle.md#红石卡),它与其他卡片的API有所不同。 + +## 频道 + +红石卡的GUI中有一个频道选择器。有关频道限制脚本能否访问此卡片的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/scripting_terminal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/scripting_terminal.md new file mode 100644 index 000000000000..c753d48dbd9e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/scripting_terminal.md @@ -0,0 +1,50 @@ +--- +navigation: + parent: items-blocks/index.md + icon: terminal + title: 脚本终端 +categories: + - terminal +description: 编写和运行控制网络所用Lua脚本的地方 +item_ids: +- nodeworks:terminal +--- + +# 脚本终端 + +脚本终端是编写和运行控制网络所用Lua脚本的地方。 + + + +## 打开编辑器 + +右击终端可打开。编辑器界面分为三个面板: + +- **侧边栏**,列出网络中的所有卡片和变量。点击可在光标处插入一行`network:get("…")`。 +- **脚本标签页**,`main`和所有你创建的模块。`main`会在点击开始时运行,其他标签页需通过[`require(name)`](../lua-api/index.md)加载。 +- **输出面板**,来自`print(…)`和脚本错误的输出。 + - 也可点击左侧的箭头以收起/展开该面板,或拖动分隔栏以调整面板尺寸。 + +![](../assets/images/terminal_gui.png) + +## 运行脚本 + +(所有脚本的功能——网络查询、合成、scheduler回调函数、变量等——参见[脚本API](../lua-api/index.md)参考。) + +点击开始可加载并运行当前的`main`标签页。除非通过注册回调函数持续运行,否则脚本会在`main`完成后退出。点击停止可终止脚本。 + +### 自动运行 + +启用编辑器中的自动运行可在终端加载时自动启动脚本。终端只会在所处区块被加载时加载,可见自动运行**并非**“服务器在线时不断运行”。需要玩家在区块范围内才能保证加载;或需要网络的启用区块加载,以便附近无人时保持加载。 + +![](../assets/images/autorun.png) + +### 红石 + +向终端发送红石脉冲可切换脚本运行与否。若脚本已停止,则脉冲启动;若已在运行中,则脉冲停止。所有上升沿都有效——可以是按下按钮,踩下压力板,或放置火把。 + +> 若脚本因为超出最大运行时限而被终止,红石也无法重新激活,直到你打开编辑器编辑脚本位置。此特例是为防止红石钟周期性触发有错误的脚本。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_blocks.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_blocks.md new file mode 100644 index 000000000000..4ce3045936d3 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_blocks.md @@ -0,0 +1,45 @@ +--- +navigation: + parent: items-blocks/index.md + icon: instruction_storage + title: 配方存储器 +categories: + - autocrafting +description: 用于存储配方集,以供合成CPU查看 +item_ids: +- nodeworks:instruction_storage +- nodeworks:processing_storage +--- + +# 配方存储器 + +存储器是用于存放已编写完毕的[配方集](./recipe_sets.md)的地方,随后即可被读取供使用。右击打开,在槽位里放入配方集,这样就可以了。 + +每种配方集都有相应的存储器。 + +- **指令存储器:**‌存放指令集 +- **处理存储器:**‌存放处理集 + +## 工作方式 + +将存储器接至节点,其中存放的所有配方集便都可被CPU查看。 + + + + + **相连**的多个处理存储器会形成集群,其中的处理集均会导出 + + + +相邻放置的存储器会形成集群。只需为**其中一个**方块接线,剩下的可通过相贴的面一同加入网络。破坏连通两半的关键方块会拆分集群,每一个分别判断还能否连接至网络。方块的发光纹理会与所属网络的颜色保持一致,方便查看。 + +## 集群化配方存储器 + +若有一台配方存储器连接至网络,则与其相连的所有配方存储器会形成集群,并全部连接至网络。 + +## 配方 + + + + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_card.md new file mode 100644 index 000000000000..fd2446ae75d9 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_card.md @@ -0,0 +1,113 @@ +--- +navigation: + parent: items-blocks/index.md + icon: storage_card + title: 存储卡 +categories: + - card +description: 将相邻方块标记为网络存储的成员 +item_ids: +- nodeworks:storage_card +--- + +# 存储卡 + +存储卡会将相邻方块标记为[网络存储](../nodeworks-mechanics/network-storage.md)的成员。也即加入网络能查询、路由,物品栏终端能列出的共享式存储空间。 + + + +## 配置 + +手持**存储卡**右击可设置其优先级、频道、筛选器。 + +![](../assets/images/storage-card-gui.png) + +> **提示:**‌使用可复制卡片设置(也能复制名称和频道),可用它和模板卡片批量复制。 +> +> 也可以使用[`network:route()`](../lua-api/network.md#route)来批量设置,无需手动操作。 + +## 目标面 + +可以为存储卡设定与相邻方块的哪一面进行交互。默认情况下,卡片会和指向的面交互,通常也已足够。需要处理面敏感槽位时可专门指定,如处理熔炉(顶面输入、侧面燃料、底面输出)时。 + +## 频道 + +存储卡的GUI中有一个频道选择器。有关频道限制脚本、路由规则、预设能否访问此卡片的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 筛选器 + +存储卡可配置为仅接受特定物品,以让包含多张卡片的网络正确分配。新合成的存储卡没有筛选器,会接受所有资源。 + +### 模式 + +存储卡GUI中的**模式**切换按钮会在如下规则中切换: + +- **白名单(Allow)**;仅接受匹配至少一条规则的物品 +- **黑名单(Deny)**:拒绝匹配至少一条规则的物品,允许所有其他资源通过 + +列表内没有规则时,模式无效力,但**可堆叠性**和**NBT**筛选器依然生效。仅所有三种筛选器均处于默认状态(无规则、可堆叠性任意、NBT任意)的卡片会接受所有资源。 + +### 规则 + +规则是单行的筛选器,有特定的语法,会在物品尝试通过卡片时求值: + +| 语法 | 匹配 | +| ----------------------- | ----------------------------- | +| `minecraft:cobblestone` | 精确物品ID | +| `#minecraft:logs` | 标签下所有物品 | +| `minecraft:*` | 来自该模组/命名空间的所有物品 | +| `/^.*_ore$/` | ID匹配此正则表达式的物品 | +| `*` | 所有物品/流体 | + +有三种添加规则的方法: + +1. 点击列表底部的‌**[+ 添加规则]**‌并输入。输入时自动补全功能会提示物品ID和标签。 +2. 从JEI中将物品拖放到规则列表。新增一条匹配物品ID的规则。 +3. 在脚本终端中使用[`network:route()`](../lua-api/network.md#route)为多张卡片一次性设置规则。 + +### 可堆叠性与NBT + +除去规则列表之外,存储卡还有两个切换按钮能缩小可接受资源的范围: + +- **可堆叠性**:在**任意**/**仅可堆叠**/**仅不可堆叠**间循环切换。无需单独列出每一个物品的ID,就能从大宗资源内分离出工具和盔甲。 +- **NBT**:在**任意**/**有数据**/**无数据**间循环切换。有NBT数据的物品(受损的工具,经命名的物品、附魔书)可从纯净的物品中分离出来。 + +这三项设置会相互叠加。物品仅在通过可堆叠性判断、NBT判断,且匹配于规则列表时才会被接受。设为`模式:白名单`、`可堆叠性:仅可堆叠`、`NBT:无数据`、规则`#minecraft:swords`的存储卡实际上不会接受任何东西。剑不可堆叠,因此在进行规则判断之前,可堆叠性判断就已排除了所有剑。设置时务必再三检查。 + +### 示例 + +**大宗圆石存储** + +> **模式:**‌白名单 +> +> **可堆叠性:**‌任意 +> +> **NBT:**‌任意 +> +> **规则:**‌#c:cobblestone + +接受`#c:cobblestones`标签下的所有圆石。 + +**仅不可堆叠** + +> **模式:**‌白名单 +> +> **可堆叠性:**‌仅不可堆叠 +> +> **NBT:**‌任意 +> +> **规则:**‌*留空* + +仅拒绝所有不可堆叠物品的存储卡不需要专门设定规则。 + +## 安装与脚本 + +安装方式与相同。放入面对方块的节点面即可。脚本API和IO卡完全一致(方法的完整列表参见[CardHandle](../lua-api/card-handle.md#物品栏卡))。 + +## 与IO卡的区别 + +的方块是脚本控制的物品栏,脚本必须显式对其送入/输出物品。存储卡则会将其方块*纳入*网络的共享存储空间:`network:find`能看见,能列出,合成配方也能自动从中拿取原材料。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_meter.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_meter.md new file mode 100644 index 000000000000..e0e9b926e3e9 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/storage_meter.md @@ -0,0 +1,62 @@ +--- +navigation: + parent: items-blocks/index.md + icon: storage_meter + title: 库存量表 +categories: + - device +description: 追踪所配置物品/流体的量 +item_ids: +- nodeworks:storage_meter +--- + +# 库存量表 + +库存量表会检测网络中的物品,并在其库存量低于所设阈值时发出红石信号。它还能发起自动合成作业以补货。 + + + + + + + + + + + 启用了自动合成,会自动为网络补充门 + + + +## 使用库存量表 + +用物品右击可设定监测目标。空手再次右击打开GUI以设置阈值和频道。 + +库存量低于所设阈值时,量表会发出一个红石信号。启用自动合成(默认)时,量表还会发起一个合成作业以进行补货。若想让信号控制发起合成,可关闭自动合成。 + +GUI底部的状态标签能反映量表当前的行为。鼠标悬停以查看详情。 + +## 子网示例 + + + + + 将烧炼为 + + + + + + + + +此例中,子网中的库存量表正检测箱子中的铁锭。存量低于阈值时,量表会向另一个网络发送红石信号,并触发使用的合成作业。 + +## 频道 + +库存量表的GUI中有一个频道选择器,可用于选择所合成物品的目的地,以及监测哪个频道下的网络存储。 + +> **注意:**‌更多信息参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/user.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/user.md new file mode 100644 index 000000000000..34fe8b7088db --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/user.md @@ -0,0 +1,52 @@ +--- +navigation: + parent: items-blocks/index.md + icon: user + title: 使用器 +categories: + - device +description: 对前方方块右击使用物品 +item_ids: +- nodeworks:user +--- + +# 使用器 + +使用器会从[网络存储](../nodeworks-mechanics/network-storage.md)中抽取物品,并用其右击前方的任意方块。可用于骨粉施肥、刷扫可疑的方块、用打火石点燃TNT、流体装桶,或玩家通常用手能做到的其他事。 + + + +## 放置 + +使用器的前部会朝向放置时的视线方向(和放置活塞与发射器一致)。它会以自身面前两格内的首个非空气方块为目标,所以隔一格指向农作物的使用器仍能与农作物交互。 + +## 物品筛选器 + +使用器的GUI中有一个筛选器,用于限定应使用哪种物品。匹配的物品会在每次使用器触发时从网络存储中抽取,并在使用后归还。筛选器的语法与一致,也即ID原文、标签、通配符均可。 + +## 模式 + +使用器有两种模式: + +- **瞬时**:每次触发时右键单击。适用于单次操作,如施加骨粉或用打火石点火。 +- **保持**:按住右键直至达到释放时限。适用于需要长时间持握才能生效的工具,如刷子。保持动作会在30秒后自动释放。 + +## 红石 + +GUI的红石设定可控制使用器的运作条件: + +- **高**:有信号时运作。 +- **低**:无信号时运作。 +- **忽略**:与红石信号无关。使用器只会在脚本调用时触发。 + +## 频道 + +使用器GUI中有名称和频道的设定器。有关频道限制脚本能否访问设备的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 脚本 + +脚本API参见[UserHandle](../lua-api/user-handle.md)页面。 + +## 配方 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/variable.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/variable.md new file mode 100644 index 000000000000..b48dab9c2313 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/items-blocks/variable.md @@ -0,0 +1,50 @@ +--- +navigation: + parent: items-blocks/index.md + icon: variable + title: 变量器 +categories: + - device +description: 网络范围内共享的变量 +item_ids: +- nodeworks:variable +--- + +# 变量器 + +变量器用于容纳整个网络共享的值。 + + + +## 配置 + +将变量器接至网络后,可选择其**类型**,并为其**命名**。这两者在中寻找变量器时都非常有用。 + +![](../assets/images/variable_gui_count.png) + +此情况下,保存的是名为`count`的**number**。 + +打开同网络的任意时,侧边栏即会显示该变量,以供引用。 + +![](../assets/images/variable_in_terminal.png) + +### 类型 + +- **number**(数) + - 数值(整数或小数) +- **string**(字符串) + - 任意最长256字符的文本 +- **boolean**(布尔值) + - `true`或`false` + +## 频道 + +变量器GUI中有名称和频道的设定器。有关频道限制脚本能否访问设备的详情,参见[选择频道](../lua-api/channel.md#选择频道)。 + +## 脚本 + +脚本API参见[VariableHandle](../lua-api/variable-handle.md)页面。 + +## 配方 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/breaker-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/breaker-handle.md new file mode 100644 index 000000000000..c919e086e460 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/breaker-handle.md @@ -0,0 +1,127 @@ +--- +navigation: + parent: lua-api/index.md + title: BreakerHandle + icon: breaker +categories: + - api_types +description: 用于破坏其前方方块的设备 +--- + +# BreakerHandle + +`BreakerHandle`(破坏器句柄)是对网络中的引用,由[`network:get(name)`](network.md#get)返回。它能对破坏器前方的方块启动消耗多个刻的破坏操作,并能将掉落物送回网络(或至自定义的handler)。 + + + +破坏器的挖掘等级为钻石镐,破坏耗时使用木镐的计算公式,因此硬方块花费的时间显著更长。同一个破坏器在同一时刻仅能运行一个破坏操作,试图重叠调用`:mine()`相当于无操作。 + +## 属性 + +- **`.name`** + - 破坏器的别名(和终端侧边栏中的一致) + +## mine + +对破坏器前方的方块启动消耗多个刻的破坏操作。返回一个[BreakBuilder](./breaker-handle.md#breakbuilder),脚本可链式调用`:connect(fn)`以重定向掉落物。若不进行链式调用,掉落物会返回[网络存储](../nodeworks-mechanics/network-storage.md),使用标准的[存储卡](../items-blocks/storage_card.md)优先级规则。 + + +```lua +local breaker = network:get("quarry_1") +breaker:mine() -- 掉落物前往网络存储 +``` + + +若目标为空气、不可破坏,或破坏需要的品质高于破坏器,则`:mine()`会返回一个无操作builder,以免链式调用崩溃。 + +## cancel + +若有运行中的破坏操作,终止其运行。空闲时调用能保证安全。方块不会被破坏,也不会产出掉落物。 + + +```lua +local breaker = network:get("breaker_1") +breaker:mine() +if dangerous() then + breaker:cancel() -- 在完成前停止 +end +``` + + +## block + +返回破坏器前方方块的ID,规格与[`ObserverCard:block`](./card-handle.md#侦测卡)一致。适合用于破坏特定种类的方块。 + + +```lua +local breaker = network:get("breaker_1") +if breaker:block() == "minecraft:stone" then + breaker:mine() +end +``` + + +## state + +返回破坏器前方方块的属性表。规格与[`ObserverCard:state`](./card-handle.md#侦测卡)一致,方块的每一个`BlockState`属性(`age`、`facing`、`lit`、`waterlogged`……)都会变成单独的字段。 + + +```lua +local breaker = network:get("crop_breaker") +local state = breaker:state() +if state.age == 7 then + breaker:mine() -- 仅破坏长成的农作物 +end +``` + + +## isMining + +若当前正在进行破坏,返回`true`;空闲则返回`false`。可用于避免在破坏中途发起`:mine()`(虽然此时调用本来也相当于无操作,但`:isMining()`可让脚本的分支更明确)。 + + +```lua +local breaker = network:get("breaker_1") +if not breaker:isMining() then + breaker:mine() +end +``` + + +## progress + +返回`0`到`1`之间的数,代表当前破坏操作的进度。空闲则返回`0`。适合用于显示进度条,或用于管理后续操作的时序。 + + +```lua +local breaker = network:get("breaker_1") +print(string.format("%.0f%%", breaker:progress() * 100)) +``` + + +--- + +## BreakBuilder + +由[`Breaker:mine()`](./breaker-handle.md#mine)返回。可用于配置破坏完成后掉落物的去向。若不进行链式调用,掉落物会自动进入网络存储。链式调用`:connect(fn)`可将其导入脚本handler。 + +### connect + +将破坏的掉落物导入回调函数。每一个掉落的物品堆叠都会作为[ItemsHandle](./items-handle.md)传入handler,因此即便是只破坏一次会产生多项掉落的方块,也会多次调用handler。 + +handler可读取掉落物的`.id`、`.name`、`.count`、`.kind`,以此决定其去向。handler未路由的物品仍会使用默认路由,进入网络存储。 + + +```lua +local breaker = network:get("breaker_1") +local chest = network:get("ore_chest") +breaker:mine():connect(function(item: ItemsHandle) + if item.id == "minecraft:diamond" then + chest:insert(item) -- 钻石进入专用的箱子 + end + -- 所有其他产物进入网络存储 +end) +``` + + +> **注意:**‌破坏器的`:connect` handler会在破坏完成时运行,不是每刻都触发。handler内部的错误不会影响外部,出错的回调函数不会卡死破坏器。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/card-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/card-handle.md new file mode 100644 index 000000000000..9f45189d720e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/card-handle.md @@ -0,0 +1,327 @@ +--- +navigation: + parent: lua-api/index.md + title: CardHandle + icon: blank_card +categories: + - api_types +description: 对网络中单张卡片的引用 +--- + +# CardHandle + +`CardHandle`(卡片句柄)是网络中单张卡片的引用。[`network:get(alias)`](network.md#get)或[`network:getAll(type)`](network.md#getAll)所返回[HandleList](handle-list.md)的返回值即为该类型。 + + + +--- + +## 属性 + +- **`.name`** + - 卡片的别名(和终端侧边栏中的一致) + +--- + +## 物品栏卡 + +*适用于IO卡和存储卡。*‌两者公开的Lua API一致,区别只在于网络如何对待与两者相连的方块。有关世界中的行为参见。 + +### face + +限制卡片为仅与相邻方块的特定面交互。当方块各面的物品栏不同时(熔炉输入/输出等)很有用。 + +默认情况下,卡片会选择它面对的面。 + + + + + `card:face("top")` + + + `card` + + + + +```lua +local card = network:get("io_1") +card:insert(coal) +card:face("top"):insert(inputItem) +``` + + +### slots + +按索引限制卡片为仅与物品栏的特定槽位交互(索引从1开始)。 + + + + + + + + + + + +```lua +local card = network:get("io_1") +card:slots(2, 4):find("*") -- 选择石头和闪长岩 +``` + + +### find + +扫描卡片的物品栏,搜索匹配筛选器的物品/流体。筛选器语法与[`network:find`](network.md#find)一致,区别仅在于作用域仅在卡片所对的槽位/流体容器,而不是网络中的所有存储卡。 + + +```lua +local coalInCard = card:find("minecraft:coal") +if coalInCard then + print("卡片中有", coalInCard.count, "个煤炭") +end +``` + + +### findEach + +与[find](./card-handle.md#find)一致,区别在于此方法会返回[ItemsHandle](./items-handle.md)列表,按物品ID和是否包含NBT数据去重。 + +若网络中有钻石剑,那么有魔咒的和无魔咒的会被分入不同条目。 + + + + + + + + + + + +```lua +local allItems = card:findEach("*") +for _, val in allItems do + print(val.name) +end +-- 圆石 +-- 橡木木板 +-- 木棍 +``` + + +### insert + +将物品或流体*移入*此卡片的物品栏。要么全部移动,要么不移动,永远不会只移动一部分。完整移动时返回`true`,无法移动时返回`false`。和[`network:insert`](network.md#insert)一致,区别在于作用域限制于这张卡片。 + + +```lua +local coal = network:find("minecraft:coal") +if coal and card:insert(coal, 32) then + print("已向卡片存储32个煤炭") +end +``` + + +### tryInsert + +与[`insert`](card-handle.md#insert)类似,但会按剩余空间移动,不只是全部移动或不移动。返回实际移动的数量(0到所请求数量)。无法传输的会留在来源中。若能接受部分移动,可使用此方法。 + + +```lua +local coal = network:find("minecraft:coal") +if coal then + local moved = card:tryInsert(coal) + print("移动了", coal.count, "个煤炭中的", moved, "个") +end +``` + + +### count + +返回此卡片所对物品栏中匹配筛选器的资源总数(流体以mB计)。 + +筛选器语法与[find](network.md#find)一致。 + + +```lua +print(card:count("#minecraft:coals")) +``` + + +--- + +## 红石卡 + +*仅适用于。*‌上文的物品栏方法无效,且红石卡的`card:find()`会返回`nil`。 + +### powered + +输入红石信号大于0时返回`true`。 + + + + + + + + + +```lua +local card = network:get("redstone_1") +print(card:powered()) +-- true +``` + + +### strength + +返回输入的红石信号强度,值在0到15之间。 + + + + + + + + + +```lua +local card = network:get("redstone_1") +print(card:strength()) +-- "14" +``` + + +### set + +发出红石信号。布尔值会映射为15和0,与类似。数则取上下限至0到15。 + + + + + 强度15 + + + + + + + + +```lua +local card = network:get("redstone_1") +card:set(true) -- 和拉杆类似,发出强度为15的信号 +card:set(false) -- 将输出信号的强度设为0 +``` + + +也可用数指定输出信号的强度。 + + + + + 强度3 + + + + + + + + +```lua +local card = network:get("redstone_1") +card:set(3) +``` + + +### onChange + +注册一个回调函数,在输入信号的强度变化时触发。 + + + + + + + + 红石钟/红石脉冲器 + + + + +```lua +local card = network:get("redstone_1") +-- 红石火把点燃或熄灭时打印"状态已改变" +local lastPowered = card:powered() +card:onChange(function(strength: number) + local powered = strength > 0 + if lastPowered == powered then + return + end + lastPowered = powered + print("状态已改变") +end) +``` + + +> **提示:**‌建议在使用`:onChange`时启用的[“自动运行”](../items-blocks/scripting_terminal.md#自动运行)。 + +![](../assets/images/autorun.png) + +## 侦测卡 + +*仅适用于。*‌上文的物品栏方法无效,且侦测卡的`card:find()`会返回`nil`。卡片会监测所安装面前方的方块,并公开其ID、属性、状态改变事件。 + +### block + +返回所监测位置方块的ID,形式为`"namespace:path"`字符串。 + + +```lua +local watcher = network:get("watcher_1") +print(watcher:block()) +-- "nodeworks:celestine_cluster" +``` + + +若所监测位置的区块未被加载,调用时仍能返回缓存的方块(Minecraft会加载区块以读取)。建议在大型脚本中使用`:onChange`,而不是每刻调用`:block()`。 + +### state + +返回所监测方块的属性表。键为方块的属性名(`age`、`facing`、`waterlogged`、`lit`、`axis`……)。根据属性种类的不同,返回值可为数、布尔值,以及全小写字符串。空气和其他无属性方块会返回空表。 + + +```lua +local s = network:get("watcher_1"):state() +if s.age == 3 then + print("已完全长成") +end +``` + + +不同方块公开的属性不同,`state()`的返回值完全取决于所监测的方块。如果需要对监测方块的种类分支,可先使用`:block()`。 + +### onChange + +注册一个回调函数,它会在所监测方块的ID或任意状态属性改变时触发。会替换同卡片已有的handler。handler会收到新方块的ID和新的属性表。 + + +```lua +local watcher = network:get("watcher_1") +local breaker = network:get("breaker_1") + +watcher:onChange(function(block: string, state: { [string]: any }) + if block == "nodeworks:celestine_cluster" then + breaker:set(true) + scheduler:delay(2, function() breaker:set(false) end) + end +end) +``` + + +注册后的第一次触发会静默使用“最后一次观察”得到的状态。若有方块在脚本重新启动前就已达到最终状态,脚本便不会触发伪事件。 + +> **提示:**‌和红石卡的`:onChange`类似,这种回调函数通常也需自动运行。可启用的[“自动运行”](../items-blocks/scripting_terminal.md#自动运行),以在不同游戏会话间不停触发handler。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/channel.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/channel.md new file mode 100644 index 000000000000..4bfc44b0e6ad --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/channel.md @@ -0,0 +1,68 @@ +--- +navigation: + parent: lua-api/index.md + title: Channel + icon: io_card +categories: + - api_types +description: 按染料颜色分割的网络视图 +--- + +# Channel + +`Channel`(频道)是按染料颜色分割的网络视图。使用[`network:channel(color)`](network.md#channel)可以得到频道。在Channel下的查询仅能看见该颜色频道下的卡片、变量、设备,这些网络成员的频道需在各自的GUI中选择。多个子系统可共用一个网络,不同子系统间同样的卡片别名不会相互冲突。 + + +```lua +local red = network:channel("red") +local blue = network:channel("blue") +red:getAll("redstone"):set(true) -- 仅触发红色频道的活塞 +blue:getAll("redstone"):set(true) -- 仅触发蓝色频道的活塞 +``` + + +颜色名必须为原版的16种染料颜色之一(`white`、`red`、`blue`、`light_blue`、`light_gray`……)。未知的颜色会出错。 + +## 选择频道 + +在所有[卡片](../nodeworks-mechanics/cards.md)和[设备](../nodeworks-mechanics/devices.md)的GUI中,都有用于选择频道的组件。默认情况下,所有设备和卡片的初始频道为`white`。点击频道选择器可打开一个颜色列表以供挑选。 + +![](../assets/images/choose_channel.png) + +## get + +仅作用于此频道的别名查询。返回[CardHandle](card-handle.md)、[VariableHandle](variable-handle.md)、Breaker或Placer,命名空间与[`network:get`](network.md#get)一致。频道中没有成员匹配别名时会出错。 + + +```lua +local red = network:channel("red") +local counter = red:get("counter") -- 红色频道下名为“counter”的变量 +local door = red:get("door") -- 红色频道下名为“door”的卡片 +``` + + +## getAll + +返回一个[HandleList](handle-list.md),内有频道下的所有给定类别的成员。接受适用于[`network:getAll`](network.md#getAll)的类别:`"io"`、`"storage"`、`"redstone"`、`"observer"`、`"variable"`、`"breaker"`、`"placer"`。不传入参数可返回所有成员,不论类别。 + + +```lua +local red = network:channel("red") +red:getAll("observer"):onChange(function(block, state) + print("红石频道侦测卡已触发:", block) +end) +``` + + +## getFirst + +返回频道下给定类别的首个成员,无成员匹配时返回`nil`。适合在频道内只有一个成员,且不想处理HandleList时使用。 + + +```lua +local sensor = network:channel("blue"):getFirst("observer") +if sensor then + print(sensor.name, "是蓝色频道的侦测卡") +end +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/craft-builder.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/craft-builder.md new file mode 100644 index 000000000000..e5c8173ae120 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/craft-builder.md @@ -0,0 +1,91 @@ +--- +navigation: + parent: lua-api/index.md + title: CraftBuilder + icon: minecraft:crafting_table +categories: + - api_types +description: 由[`network:craft`](network.md#craft)返回,用于配置产物的去向 +--- + +# CraftBuilder + +`CraftBuilder`(合成建造器)是[`network:craft`](network.md#craft)的返回值类型。它代表网络已经计划但还未收到产物的合成作业。默认情况下,合成完毕时产物会被送至[网络存储](../nodeworks-mechanics/network-storage.md)。若想要使用回调函数,可链式调用`:connect(fn)`。 + +合成作业本身可能同一刻内就结束(由网络存储供应原材料的原版配方),也可能需要许多刻(所有经由[`network:handle`](network.md#handle)、处理操作器、多阶段合成树的作业)。无论是哪一种,builder的API都完全一致。 + +> **注意:**‌`network:craft`必然返回一个builder,即便是无法计划合成作业(无配方、缺少原材料、没有合成CPU)也是如此。此类失效会作为`nil`进入`:connect`的回调函数。 + +## 默认:存储产物 + +若没有后续链式调用,产物会被自动送回网络存储,过程中使用常规的[存储卡](../items-blocks/storage_card.md)优先级和[`network:route`](network.md#route)规则。此后,可和网络存储中其他资源一样通过`network:find`进行查询。 + + +```lua +-- 发起后即不管:合成16根火把,最后会进入网络存储 +network:craft("minecraft:torch", 16) +``` + + +## connect + +将产物交由回调函数处理,**而不是**自动存储。调用`:connect`会禁用builder的默认行为:脚本运行时不会自动存储,产物归回调函数所有。 + +回调函数的参数为`ItemsHandle?`:成功合成时为[ItemsHandle](items-handle.md),失败时为`nil`。使用前务必检查。 + + +```lua +local oven = network:get("oven") +network:craft("minecraft:bread", 4):connect(function(items: ItemsHandle?) + if not items then + print("面包合成失败") + return + end + oven:insert(items) -- 产物面包直接进入oven +end) +``` + + +回调函数会在合成结束后立即触发。合成失效会变为`nil`: + +- 合成计划失败:无配方、缺少原材料、网络中没有合成CPU。 +- 异步超时:处理用handler未能发回输出。 +- CPU离线:合成CPU在合成中途损坏或被移除。 + +无论是哪一种失效,脚本运行时都会将CPU缓存送回网络存储,以免物品滞留。 + +### 移动物品需要你来操作 + +回调函数收到的handle是**合成CPU缓存中剩余物品的实时引用**。调用`card:insert(items)`/`network:insert(items)`可抽空缓存,将物品送入目的地。 + +回调函数返回时残留在缓存中的物品会**掉落在CPU的位置**,终端会同时记录错误。操作约定是“handle归你,移动物品也归你”,未能完成移动的错误不会静默消失。 + + +```lua +local chest = network:get("ore_chest") +network:craft("minecraft:iron_ingot", 8):connect(function(items: ItemsHandle?) + if not items then return end + if not chest:insert(items) then + -- 箱子已满:送至网络存储,避免掉落 + network:insert(items) + end +end) +``` + + +此行为和自动存储——必然送至无论存储卡(且只会在所有存储卡均拒绝时掉落)——不一样,是刻意为之。回调函数通过`:connect`来控制物品去向,而脚本运行时会信任你。 + +> **注意:**‌回调函数内抛出的错误会在终端处记录,但不会截停脚本的其他部分。 + +## 同步的connect + +原材料已备齐的原版配方作业会在发起的同一刻结束。回调函数依然会按同样路径在`:craft`调用的后一刻触发,以便`:connect`在解析前注册。无需为此设置特殊处理,API的表现在同步和异步合成作业中完全一致。 + + +```lua +-- 无论是立即完成的合成,还是需要30s的烧炼,connect的表现都相同 +network:craft("minecraft:iron_ingot", 8):connect(function(items: ItemsHandle?) + if items then chest:insert(items) end +end) +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/handle-list.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/handle-list.md new file mode 100644 index 000000000000..4635e52f75ed --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/handle-list.md @@ -0,0 +1,75 @@ +--- +navigation: + parent: lua-api/index.md + title: HandleList + icon: minecraft:red_bundle +categories: + - api_types +description: getAll返回的卡片/变量列表,支持一次性广播 +--- + +# HandleList + +`HandleList`(句柄列表)是卡片与变量组成的列表,**会在所有成员间广播写方法**。[`network:getAll(type)`](network.md#getAll)和[`Channel:getAll(type)`](network.md#channel-getall)的返回值为此类型。 + +对列表调用写方法,相当于按顺序使用相同的参数对所有成员调用该方法。读方法均未公开,因为读方法的返回值才是最重要的,进行静默跳过只会给脚本埋下隐患。如需按成员读取,可调用`:list()`并遍历。 + + +```lua +-- 一次性触发所有红色频道下的活塞。 +network:channel("red"):getAll("redstone"):set(true) +-- 在一行内为所有侦测卡注册同一个onChange handler。 +network:getAll("observer"):onChange(function(block, state) + if block == "nodeworks:celestine_cluster" then + -- ... + end +end) +``` + + +## 哪些方法会被广播 + +只有**写方法**会对列表广播,也即只有调用位置不会在意其返回值的方法。`:powered()`、`:count()`、`:get()`、`:block()`等读方法均为刻意留空,以避免静默跳过某个成员的返回值。如需按成员读取,可调用`:list()`并依次操作。 + +每种类型的页面(如[RedstoneCard](card-handle.md#红石卡)、[VariableHandle](variable-handle.md))是判断方法是读还是写的标准来源。 + +## list + +类型逃生舱。返回内部的数组,以供按成员迭代、读取各成员,或应用不符合广播形式成员独有逻辑设置。 + + +```lua +local pistons = network:channel("red"):getAll("redstone") +for _, p in pistons:list() do + if p:powered() then + print(p.name, "当前已充能") + end +end +``` + + +## count + +列表中成员的数量。比`#list:list()`的开支小,因为它不需要建立数组。 + + +```lua +local watchers = network:getAll("observer") +print("网络中有", watchers:count(), "张侦测卡") +``` + + +## face + +返回一个新HandleList,其中卡片成员的访问面强制改为`name`。原本的列表不会受影响,强制修改仅作用于返回的副本。不是[CardHandle](card-handle.md)的成员(变量、破坏器、放置器等)不会受影响,这些handle类型会忽略face。 + +列表的强制修改会在传入预设([Importer](importer.md)/[Stocker](stocker.md))时保留。仅需一个表达式,通配符广播即可读写所有匹配卡片的非默认面。 + + +```lua +-- 从所有io_*卡片中抽取熔炉产物(底面)并送入输出箱 +importer:from(network:cards("io_*"):face("bottom")):to("output"):start() +``` + + +参数规格与[`CardHandle:face`](card-handle.md#face)一致,但会一次性作用于整个列表。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/importer.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/importer.md new file mode 100644 index 000000000000..c70b7d2ea1af --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/importer.md @@ -0,0 +1,153 @@ +--- +navigation: + parent: lua-api/index.md + title: Importer + icon: minecraft:hopper +categories: + - api_types + - api_preset +description: 将物品从A移动到B,接受分配策略 +--- + +# Importer + +`importer`(导入器)全局变量能建造物品搬运器,从任意多个来源中抽取物品,再送到任意多个目标中去。在实现方式上,importer其实是scheduler任务,因此它会根据所配置的间隔运行,并在脚本停止或对handle调用`:stop()`时终止。 + +## from + + +```lua +Importer:from(...sources: string | CardHandle | network): ImporterBuilder +``` + + +importer链的起点。来源可为卡片别名、CardHandle对象,或`network`全局变量(代表整个网络存储)三者混用。至少需要指定一个来源。 + + +```lua +importer:from("farmChest") -- 名称来源 +importer:from(network) -- 网络存储作为来源 +importer:from("chestA", network, network:get("chestB")) -- 混用 +``` + + +## to + + +```lua +ImporterBuilder:to(...targets: string | CardHandle | network): ImporterBuilder +``` + + +设置目的地。多态行为和`:from`一致:卡片别名、CardHandle对象、指代网络存储的`network`。至少需要指定一个目标。 + + +```lua +importer:from("farm"):to("storage1", "storage2"):start() +importer:from("mobFarm"):to(network):start() -- 存入网络存储 +``` + + +## filter + + +```lua +ImporterBuilder:filter(pattern: string): ImporterBuilder +``` + + +按照筛选器限制可移动的物品(或流体)种类。‌**可选。**‌默认值为`*`,对应移动所有物品。筛选器的语法与[Network:find](network.md#find)一致,即包括`$item:id`、`$fluid:id`、`#tag`、`modname:*`、正则表达式。 + + +```lua +-- 仅移动圆石 +importer:from(network) + :filter("$item:minecraft:cobblestone") + :to("io_*") + :start() + +-- 移动所有c:ores物品 +importer:from("mobFarm"):filter("#c:ores"):to("storage"):start() +``` + + +## 分配 + +importer有两种分配调度目标的方式。默认为填充,需要显式指定是否使用轮询。 + +### 填充(默认) + +填充首个目标。填满后移出到下一个目标,以此类推。适合有优先级顺序且希望一个箱子积极补货、多余物品溢出到其他箱子的场景。 + + +```lua +importer:from("furnaceOutput") + :filter("$item:iron_ingot") + :to("mainChest", "overflow") + :start() +``` + + +### roundrobin + + +```lua +ImporterBuilder:roundrobin(step: number?): ImporterBuilder +``` + + +每刻在所有目标间均分资源。`step`是每刻送入每个目标的最大物品量(默认为1)。step=1时,来自来源的三个物品会在同一刻送入三个目标,每个目标各一个。如需大批量移动,可增加step或通过`:every(1)`增加计刻速度。 + + +```lua +importer:from("bufferChest") + :to("furnace1", "furnace2", "furnace3") + :roundrobin() + :every(10) + :start() +``` + + +轮询指针每刻前进一步;即便是来源货物不足、只有部分目标能拿到物品的情况下,也能维持分配的公平。 + +## 卡片别名的通配符 + +`:from`和`:to`都接受卡片名称中存在`*`通配符。`"io_*"`会扩展至importer解析快照时所有别名匹配该模式的卡片,并会在每次网络拓扑改变时重新进行扩展。 + + +```lua +-- 将单个箱子的内容物均分到所有名为“io_...”的卡片 +importer:from("input"):to("io_*"):roundrobin():start() + +-- 从一系列来源箱子中抽出汇总到单个输出位置 +importer:from("farm_*"):to("storage"):start() +``` + + +## 示例:两阶段烧炼阵列 + +矿石按轮询送入三个熔炉,产物收集至中央存储箱。 + + +```lua +-- 将矿石均分给三个熔炉 +importer:from("oreBuffer") + :filter("$item:iron_ore") + :to("furnace1", "furnace2", "furnace3") + :roundrobin() + :every(10) + :start() + +-- 从所有三台熔炉中抽取锭,并存入输出箱 +importer:from("furnace1", "furnace2", "furnace3") + :filter("$item:iron_ingot") + :to("outputChest") + :start() +``` + + +## 延伸阅读 + +* [通用预设方法](presets.md#通用方法)(`:every`、`:start`、`:stop`、`:isRunning`)。 +* [Stocker](stocker.md)(补货器),“维持库存量”样板。 +* [Network:find](network.md#find),筛选器语法详情。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/index.md new file mode 100644 index 000000000000..8a5d66116346 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/index.md @@ -0,0 +1,32 @@ +--- +navigation: + title: 节点工程脚本API + position: 40 +--- + +# 节点工程脚本API + + + +节点工程使用[Lua](https://www.lua.org/docs.html)作为脚本语言,脚本编辑器还为脚本的编写引入了若干种QoL扩展: + +- **类型标注:**‌(`local x: CardHandle`、`function(xs: { CardHandle }): ItemsHandle`等) + - 告诉编辑器变量、参数、返回值的类型。如此便可获得准确的悬停提示、更好的自动补全,以及for循环内部的元素类型推断。 + +## 内置 + + + +- [clock()]():脚本开始运行至今的时间,单位为秒的几分之一。 +- [print(...)]():输出至终端输出。 +- [require(name)]():按名称从同一终端的另一个脚本标签页加载脚本。 + +## 预设 + +声明式的builder,能将常见的scheduler循环包装成单行的链式调用。通用模式参见[预设](presets.md)。 + + + +## 类型 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/input-items.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/input-items.md new file mode 100644 index 000000000000..e7c0a0ee3f81 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/input-items.md @@ -0,0 +1,51 @@ +--- +navigation: + parent: lua-api/index.md + title: InputItems + icon: minecraft:cobblestone +categories: + - api_types +description: "[network:handle回调函数](network.md#handle)需接受的第二个参数,是按配方打包的[`ItemsHandle`](items-handle.md),按配方输入槽位名称分入各字段" +--- + +# InputItems + +`InputItems`(输入物品)是[`network:handle`](network.md#handle)需接受的第二个参数。网络已经从网络存储中抽出了配方的原材料,汇总结果就是这张表,其中每个字段都对应着一个输出槽位。你需要做的,是把这些物品送到机器中去。 + +每一个字段都是完整的[ItemsHandle](items-handle.md)对象,可以像其他handle一样对其调用`:insert`、`:tryInsert`、`:count`等。 + +## 字段名称 + +字段名称为**驼峰命名(camelCase)的输入物品ID**。也即`minecraft:raw_iron`会变为`items.rawIron`,`minecraft:copper_ingot`会变为`items.copperIngot`。脚本编辑器会根据配方自动补全,无需专门记忆。 + + +```lua +local furnace = network:get("furnace") +network:handle("...", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) -- minecraft:raw_iron + job:pull(furnace:face("bottom")) +end) +``` + + +### 重复的原材料 + +若配方在多个槽位中的原材料相同,则第二次出现处加后缀`2`,第三次加`3`,以此类推。所以需要两个铜锭和一个金锭的配方会公开为`items.copperIngot`、`items.goldIngot`、`items.copperIngot2`。 + + +```lua +local press = network:get("press") +network:handle("...", function(job: Job, items: InputItems) + press:face("top"):insert(items.copperIngot) + press:face("top"):insert(items.copperIngot2) + press:face("north"):insert(items.goldIngot) + job:pull(press:face("bottom")) +end) +``` + + +## 必须全部使用 + +handler应当将所有输入都送入机器。若在handler返回时仍有资源残余在`items.`中,则网络会认为当次合成作业未完成,并在之后再次尝试。没有“跳过该输入”的方法,配方说需要N个铜锭,那就应当取走N个铜锭。 + +> **注意:**‌“使用”指的是将物品送到可被访问的地方,通过`network:insert`送回网络存储也可以。网络只会检查“脚本有没有完全消耗掉输入”,而不关心“输入有没有抵达正确的机器”。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/items-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/items-handle.md new file mode 100644 index 000000000000..96811954ff93 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/items-handle.md @@ -0,0 +1,227 @@ +--- +navigation: + parent: lua-api/index.md + title: ItemsHandle + icon: minecraft:bundle +categories: + - api_types +description: 附带数量、来源、传输操作的特定资源(物品或流体) +--- + +# ItemsHandle + +`ItemsHandle`(物品句柄)是**附带数量的资源种类**。问出“存储空间里有什么?”的时候,大多数网络和卡片方法的返回值都是这个类型;让同样的方法“把这个搬到其他地方去”的时候,它们也需要接受此类型的参数。 + +> **注意:**‌handle是在调用返回时拍摄的**快照**。`.count`不会因为后续物品出入而更新。如果需要新数值,可再次调用`:find`。 + +--- + +## handle代表了什么(以及没在代表什么) + +handle是**所查询位置所有匹配资源的聚合**,不是单一的物品栏堆叠。此性质有两个重要的影响: + +**同一类handle能处理物品和流体。**‌`.kind`字段存储了资源的类型。物品的数量为“个数”,流体的为毫桶(mB)。详情参见下文的[count](./items-handle.md#count)和[kind](./items-handle.md#kind)。 + +**count可以大于`maxStackSize`。**‌即便单个槽位内最多只能存下64个,`network:find("minecraft:coal")`也有可能会返回`count = 192`的handle。这个handle代表着“网络中任意位置的所有煤炭”,可以由多个槽位、多张存储卡、多个储罐汇总而来。[card:find](card-handle.md#find)也遵从这一点,即也会聚合卡片对应的槽位和储罐。 + +若需要各堆叠单独处理(如附魔的剑分离于未附魔的同ID剑),可换用[`findEach`](network.md#findEach)。它会按ID**和**NBT数据分割,每一种独特组合都会变成不同的handle。 + + +```lua +local allCoal = network:find("minecraft:coal") +print(allCoal.count) -- 192,网络内的总量 + +for _, h in network:findEach("minecraft:diamond_sword") do + print(h.name, h.hasData) -- 附魔的剑和未附魔的剑分属不同条目 +end +``` + + +--- + +## 属性 + +### id + +handle所指向资源的ID。两种资源类型的表现一致:物品可为`"minecraft:diamond"`,流体可为`"minecraft:water"`。 + + +```lua +local coal = network:find("minecraft:coal") +print(coal.id) -- "minecraft:coal" +``` + + +### name + +玩家在提示文本中看见的显示名称。经翻译、有格式,且可自定义(经过铁砧重命名的物品会显示重命名的字符串)。 + + +```lua +local sword = network:find("minecraft:diamond_sword") +print(sword.name) -- "钻石剑"(或者重命名过的话,"ex咖喱棒") +``` + + +### count + +handle所代表资源的数量。**物品的单位为“个数”**(按单独物品,不按组数),**流体的为mB**(毫桶,1000 mB = 1 桶)。 + + +```lua +local coal = network:find("minecraft:coal") +print(coal.count) -- 192(192个煤炭) +-- or for fluids +local water = network:find("minecraft:water") +print(water.count) -- 4000(4桶,合4000mB) +``` + + +### kind + +`"item"`或`"fluid"`。可在处理两类资源的脚本中用它作分支判断。 + + +```lua +for _, h in network:findEach("*") do + if h.kind == "fluid" then + print(h.count, "mB的", h.name) + else + print(h.count, "x", h.name) + end +end +``` + + +### stackable + +最大堆叠数大于1的物品(圆石、锭、木板……)返回`true`,工具、盔甲、各类独特物品(有自定义NBT的药水、成书)返回`false`。流体必然返回`false`,它们按体积计量,不按堆叠。 + + +```lua +for _, item in inputChest:findEach("*") do + if not item.stackable then + nonStackables:insert(item) + else + network:insert(item) + end +end +``` + + +此示例可将不可堆叠的物品移到网络外的某箱子。 + +### maxStackSize + +资源在单个物品栏槽位中能存放的最大数量。大多数物品都是`64`,雪球和末影珍珠是`16`,工具和盔甲是`1`。流体必然返回`1`,不具备实际意义。 + + +```lua +local coal = network:find("minecraft:coal") +print(coal.maxStackSize) -- 64 +``` + + +### hasData + +若堆叠的NBT不为默认值(魔咒、自定义名称、成书内容、盔甲染色、谜之炖菜效果等),则返回`true`。可用它将“特别”的物品从普通物品中分拣出去。 + + +```lua +for _, item in inputChest:findEach("*") do + if item.hasData then + enchantedItems:insert(item) + else + network:insert(item) + end +end +``` + + +--- + +## 方法 + +### hasTag + +若资源是所给标签的成员,返回`true`。标签ID开头有无`#`均可,即`"minecraft:logs"`和`"#minecraft:logs"`均可。 + + +```lua +for _, h in network:findEach("*") do + if h:hasTag("minecraft:logs") then + print(h.name, "是一种原木") + end +end +``` + + +标签成员的判定方式于Minecraft在合成配方和生物群系设置中所用的一致,即可作为原版配方中“任意原木”的资源均匹配本示例。 + +### matches + +若资源匹配所给筛选器,返回`true`。筛选器语法与[`network:find`](network.md#find)一致。适合用于路由谓词,以及跳过`:find`流程按物品分支。 + + +```lua +function smelt(item: ItemsHandle) + if item:matches("/_ore$/") then + machine:insert(item) + return + end + furnace:insert(item) +end +``` + + +--- + +## 向传输方法传入handle + +handle不只是只读值,也是**移动相应物品的来源**。大多数传输方法都需要handle作为参数,并会从各来源将资源移动到指定目的地。 + + +```lua +local coal = network:find("minecraft:coal") +if coal then + -- 全部搬到箱子里 + chest:insert(coal) +end +``` + + +按此方式使用handle的方法有: + +- [`card:insert`](card-handle.md#insert)/[`card:tryInsert`](card-handle.md#tryinsert),送入卡片对应的物品栏 +- [`network:insert`](network.md#insert)/[`network:tryInsert`](network.md#tryinsert),按路由规则送入网络存储 +- [`placer:place`](placer-handle.md#place),使用handle的`.id`挑选放置物 + +handle的`.count`也是这些方法的移动上限。传入可选的第二个参数可设置更小的上限,适用于空间较小的目的地,如熔炉燃料槽: + + +```lua +local coal = network:find("minecraft:coal") +furnace:insert(coal, 8) -- 向燃料槽补8个煤炭 +``` + + +> **注意:**‌`:insert`要么全部移动,要么不移动。若目的地无法容纳所移动的量,则什么都不会移动,且调用返回`false`。若能接受部分移动,可使用`:tryInsert`,也可提供第二个参数作为上限。 + +--- + +## 无物匹配时返回nil + +筛选器没有匹配的资源时,`:find`和`findEach`会返回`nil`。`count = 0`的handle不可能存在,查询结果为空时返回值也为空。链式调用时务必检查: + + +```lua +local coal = network:find("minecraft:coal") +if coal then + print(coal.count, "个煤炭可用") +else + print("网络存储中没有煤炭") +end +``` + + +编辑器的类型系统会记录这一性质,鼠标悬停在`coal`上会显示`ItemsHandle?`(`?`是“或nil”记号),在忘记检查时也会进行提示。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/job.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/job.md new file mode 100644 index 000000000000..7b7031a94b3e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/job.md @@ -0,0 +1,57 @@ +--- +navigation: + parent: lua-api/index.md + title: Job + icon: minecraft:paper +categories: + - api_types +description: "[network:handle回调函数](network.md#handle)需接受的第一个参数,代表实际的处理作业,handler需负责为其产出产物" +--- + +# Job + +`Job`(作业)是[`network:handle`](network.md#handle)需接受的第一个参数。每一次网络需要运行处理集配方时,它都会调用handler,并传入新建的`Job`和从网络存储中取出的[物品](input-items.md)。handler会将物品送入机器,并调用`job:pull(card)`告诉网络产物将抵达的位置。 + +## pull + +告诉网络产物将抵达的位置。传入任意多个[CardHandle](card-handle.md),网络便会监测它们,直到完整的产物到达。 + +若输出已经在其中一张卡片处(瞬时配方、无序合成),则合成作业会在同一刻结束。其他情况下,网络会每刻检查,并拿取卡片处已有的产物。对一次只产出一个锭的熔炉发送大批量作业也不会产生问题。 + + +```lua +local furnace = network:get("furnace") +network:handle("...", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) + -- 在烧炼完成时从底面抽取 + job:pull(furnace:face("bottom")) +end) +``` + + +### 多张来源卡片 + +若产物可能抵达多个位置,可传入多张卡片。网络会按序检查每张卡片,并抽出已有的物品。若产线下游有管道或漏斗根据物品分拣到不同箱子,可以使用此特性。 + + +```lua +local furnace = network:get("furnace") +local outboxA = network:get("outbox_a") +local outboxB = network:get("outbox_b") +network:handle("...", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) + -- 所得锭被分拣到两箱子中的一个,从任意一个抽取 + job:pull(outboxA, outboxB) +end) +``` + + +### 先放入物品 + +`:pull`只会处理输出。你仍需要亲自把[InputItems](input-items.md)送入机器。若在handler返回时仍有资源留在`items.`内,则该合成作业会被判定为未完成,网络会重新发起。 + +### 超时 + +若产物没能抵达输出位置,合成作业最终会超时,输入会被返还至网络存储。各处理集都有自身设定的超时时限(刻),可在GUI中调整,默认为15秒。在处理大批量烧炼、耗时较长的模组配方机器时,可延长时限。 + +> **注意:**‌handler内部的错误只会停止*该合成作业*,不会导致脚本崩溃。若合成作业因未知原因挂起,可检查终端的日志,错误信息会输出到那里。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/network.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/network.md new file mode 100644 index 000000000000..745b8f8d4ad4 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/network.md @@ -0,0 +1,356 @@ +--- +navigation: + parent: lua-api/index.md + title: Network + icon: node +categories: + - api_builtin +description: 查询网络存储、路由物品、发起合成作业、注册handler +--- + +# Network + +`network`(网络)模块是指向所属节点工程网络的入口。它能查询存储空间,在多个handle之间路由物品,注册回调函数。 + +## get + +按名称获取网络中任意成员的引用,如等,通常在脚本的开头使用。卡片与变量名称冲突时选择卡片。 + +点击脚本终端的侧栏可以自动插入get行。 + +![点击前](../assets/images/click-to-add-card-01.png) ![点击后](../assets/images/click-to-add-card-02.png) + + + + + 重命名为‌**“chest”**‌ + + + 重命名为‌**“furnace”**‌ + + + + +```lua +local chest = network:get("chest") -- 获取存储卡 +local furnace = network:get("furnace") -- 获取IO卡 +local count = network:get("count") -- 获取名为“count”的变量 +``` + + +--- + +## getAll + +返回一个[HandleList](handle-list.md),内有所有匹配所给类型的卡片和变量。HandleList会对所有成员广播写方法(`:set`、`:onChange`……),用它激活多个活塞或为多个侦测卡注册handler均只需一行。如需按成员迭代,可调用`:list()`。 + + + + + + + + + + + + +```lua +-- 广播:一次性激活所有红石卡 +network:getAll("redstone"):set(true) +-- 若需分别使用读方法的返回值,应按成员迭代 +local storages = network:getAll("storage") +for _, storage in storages:list() do + print(storage.name) +end +-- "storage_0" +-- "storage_1" +``` + + +--- + +## cards + +返回一个[HandleList](handle-list.md),内有所有匹配所给名称的卡片。如需同时使用遵从同一命名惯例的所有卡片,可以使用此方法。 + + +```lua +local allPistonCards = network:cards("piston_*") +allPistonCards:set(true) -- 激活所有活塞 +``` + + +--- + +## channel + +将查询限制在单种染料颜色对应的频道。返回一个[`Channel`](./channel.md) handle,该对象的`:get`、`:getAll`、`:getFirst`只会返回相应频道中的卡片、变量、设备,频道筛选器的规则一致。遇到未知颜色名称时会出错。 + + +```lua +local red = network:channel("red") +red:getAll("redstone"):set(true) -- 仅红色频道的活塞 +local count = red:get("counter") -- 仅红色频道的变量 +``` + + +--- + +## channels + +返回网络中所有染料颜色频道组成的列表,即所有至少包含一个卡片、变量、破坏器,或放置器的颜色。顺序按`DyeColor` ID升序,所以对此列表迭代是稳定的。它可在运行时返回各频道,无需硬编码。 + +> **注意:**‌新成员的默认频道是`white`,所以大多数非空网络里都会有这个频道。 + + +```lua +for _, color in network:channels() do + print("正在使用", color) +end +-- 正在使用 "white" +-- 正在使用 "red" +-- 正在使用 "blue" +``` + + +常见用法:对所有活动频道使用同一个handler,无需考虑玩家选择了哪些频道。 + + +```lua +for _, color in network:channels() do + network:channel(color):getAll("redstone"):set(false) +end +``` + + +--- + +## find + +扫描整个[网络存储](../nodeworks-mechanics/network-storage.md),搜索匹配筛选器的物品/流体。返回聚合式handle‌*(按整个网络存储统计)*;若无资源匹配,则返回`nil`。 + + +```lua +local all = network:find("*") -- 返回所有物品和流体(若有) +local allItems = network:find("$item:*") -- 仅物品 +local allFluids = network:find("$fluid:*") -- 仅流体 +local allCoal = network:find("minecraft:coal") -- 物品ID +local allLogs = network:find("#minecraft:logs") -- 标签 +local allRaw = network:find("/^Raw.*/") -- 正则表达式 +``` + + +使用`:find`的返回值时,应当先检查是否为空。 + + +```lua +local allCoal = network:find("minecraft:coal") +if allCoal then + print("有煤炭") +end +``` + + +--- + +## findEach + +和[find](./network.md#find)类似,此方法也会扫描[网络存储](../nodeworks-mechanics/network-storage.md),搜索匹配筛选器的物品/流体。此方法会返回[ItemsHandle](./items-handle.md)列表,按物品ID和是否包含NBT数据去重。 + + +```lua +for _, items in network:findEach("$item:*") do + print(items.id, items.count, items.kind) +end +``` + + +若网络中有钻石剑,一部分有魔咒一部分没有,则这两者会被分成两个元素。 + + +```lua +for _, items in network:findEach("minecraft:diamond_sword") do + print(items.id, items.hasData) +end +-- "minecraft:diamond_sword" true +-- "minecraft:diamond_sword" false +``` + + +--- + +## count + +返回[网络存储](../nodeworks-mechanics/network-storage.md)中匹配筛选器资源的总数。(流体以mB计。) + +筛选器语法与[find](network.md#find)一致。 + + +```lua +print("剑:", network:count("minecraft:diamond_sword")) +print("圆石:", network:count("minecraft:cobblestone")) +print("总计:", network:count("*")) +-- "剑:" 3 +-- "圆石:" 256 +-- "总计:" 259 +``` + + +--- + +## insert + +参照标准的优先级规则,将一个[ItemsHandle](items-handle.md)插入[网络存储](../nodeworks-mechanics/network-storage.md)。需要网络能存下所有物品,否则便不会移动,并返回`false`。如希望尽力移动,可使用[tryInsert](./network.md#tryinsert)。 + + +```lua +local ok = network:insert(items) +if ok then + print("所有物品均已移动") +else + print("未移动物品,空间不足") +end +``` + + +--- + +## tryInsert + +与[`insert`](network.md#insert)类似,但会移动所有匹配的物品,而不是要么全部移动,要么不移动。返回实际移动的数量(0至所请求的量)。所有未能移动的物品将停留在来源中。若仅移动一部分不会产生影响,可使用此方法。 + + +```lua +local moved = network:tryInsert(items) +print("移动了" .. moved .. "个物品") -- 可为0到items.count +``` + + +--- + +## craft + +(参见[Auto-Crafting](../nodeworks-mechanics/autocrafting.md)) + +为所给物品发起合成作业,并为其排队,返回一个[CraftBuilder](./craft-builder.md)。默认情况下,合成得到的物品会在合成完毕后自动进入[网络存储](../nodeworks-mechanics/network-storage.md),无需链式调用: + + +```lua +-- 发起后即不管:面包会在合成完毕后进入网络存储 +network:craft("minecraft:bread", 4) +``` + + +在后方链式调用`:connect(fn)`可改变此行为。回调函数会收到一个[ItemsHandle?](items-handle.md),成功时不为`nil`,不成功(合成计划失败、异步超时、无CPU)时为`nil`。调用`:connect`会覆盖自动存储行为。 + + +```lua +local furnace = network:get("furnace") +network:craft("minecraft:charcoal"):connect(function(item: ItemsHandle?) + if item then + furnace:insert(item) + end +end) +``` + + +--- + +## shapeless + +立即使用[网络存储](../nodeworks-mechanics/network-storage.md)中的原材料进行无序合成。若配方无效或缺少原材料,则不会进行合成,且方法会返回`nil`。 + + +```lua +-- 合成一个打火石,产物自动进入网络存储。 +network:shapeless("minecraft:flint", 1, "minecraft:iron_ingot", 1) +``` + + +--- + +## handle + +(参见[自动合成](../nodeworks-mechanics/autocrafting.md)) + +为网络内的注册一个处理handler。该handler会随输入唤起,并且必须使用传入的[Job](job.md)以`pull`产物。所有来自[InputItems](input-items.md)的物品**必须**被handler接收。 + + + + + 重命名为‌**“furnace”**‌ + + + + + **➜** + + + + + + +```lua +local furnace = network:get("furnace") +-- 粗铁 -> 铁锭的handler +network:handle("…", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) + job:pull(furnace:face("bottom")) +end) +``` + + +--- + +## route + +批量编辑所有名称匹配的的[筛选器设置](../items-blocks/storage_card.md#筛选器)。返回一个builder,它的方法能链式调用,可在一行内写完整个规则集。各方法会在执行后立即生效于相应的卡片,和手动右击打开其GUI编辑的效果一样。 + +匹配模式为名称,接受`*`作为通配符。`cobblestone_*`可匹配`cobblestone_0`、`cobblestone_1`等。单独使用`*`则匹配网络中的所有存储卡。 + + +```lua +network:route("cobblestone_*") + :reset() + :rule("#c:cobblestones") + :noNbt() + :allow() +``` + + +### Builder方法 + +| 方法 | 效果 | +| ------------------------------------------------------ | ---------------------------------- | +| `:rule(filter)` | 附加一条规则(语法与GUI内的一致) | +| `:clearRules()` | 清空规则,模式不变 | +| `:allow()` / `:deny()` | 设置规则列表模式 | +| `:stackable()` / `:nonStackable()` / `:anyStackable()` | 设置可堆叠性筛选器 | +| `:hasNbt()` / `:noNbt()` / `:anyNbt()` | 设置NBT筛选器 | +| `:reset()` | 清空规则,设置为白名单、任意、任意 | + +调用时会返回同一个builder,也因此这些方法可以链式调用。设置的更改立即生效,且能在保存/加载间保持。 + +--- + +## debug + +打印网络拓扑的总概。 + + +```lua +network:debug() +-- === Network Debug === +-- Controller: BlockPos{x=-25, y=70, z=10} +-- Nodes: 1 +-- Node BlockPos{x=-25, y=70, z=9}: 1 cards +-- NORTH: cobblestone_storage (storage) +-- Terminals: 1 +-- BlockPos{x=-26, y=70, z=9} +-- CPUs: 0 +-- Crafters (Instruction Sets): 0 +-- Processing APIs: 0 +-- Variables: 0 +``` + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/placer-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/placer-handle.md new file mode 100644 index 000000000000..cbfc221f9370 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/placer-handle.md @@ -0,0 +1,76 @@ +--- +navigation: + parent: lua-api/index.md + title: PlacerHandle + icon: placer +categories: + - api_types +description: 用于在其前方放置方块的设备 +--- + +# PlacerHandle + +`PlacerHandle`(放置器句柄)是对网络中的引用,由[`network:get(name)`](network.md#get)返回。它会从[网络存储](../nodeworks-mechanics/network-storage.md)中抽取一个所选物品,并将其作为方块放置在自身前方的位置。 + + + +`:place(...)`为同步操作,它会在脚本调用的同一刻返回`true`/`false`。过程不会占用多个刻,不会返回builder对象,也不接受回调函数。只有`BlockItem`物品(有可放置的方块形态)能成功执行,对工具、食物,或任意无法放置的物品调用会立即失败。 + +## 属性 + +- **`.name`** + - 放置器的别名(和终端侧边栏中的一致) + +## place + +从网络存储中抽出一个所选物品,将其放在放置器前方的位置。成功放置返回`true`。 + +参数可以是物品ID字符串或[ItemsHandle](./items-handle.md)。若传入handle,放置器会读取其`.id`,并从网络存储中抽取一个*该物品*,方式与直接传入字符串一致。此方法不会抽取handle本身的来源,而是会向网络中的存储卡抽取。 + + +```lua +local placer = network:get("placer_1") +placer:place("minecraft:cobblestone") +``` + + +以下情况会返回`false`(且不进行放置): +- 网络中没有可用的匹配物品 +- 目标位置不是空气 +- 物品无法放置(如`minecraft:diamond`、`minecraft:stick`) + + +```lua +local placer = network:get("bridge_builder") +local ok = placer:place("minecraft:oak_planks") +if not ok then + print("未放置,网络存储中没有木板或目标位置已被阻挡") +end +``` + + +## block + +返回放置器前方方块的ID,规格与[`ObserverCard:block`](./card-handle.md#侦测卡)一致。适合用在`:place`前面,对“位置是否为空/是否是预期中的方块”进行判断。 + + +```lua +local placer = network:get("placer_1") +if placer:block() == "minecraft:air" then + placer:place("minecraft:torch") +end +``` + + +## isBlocked + +若目标位置不可被替换(不是空气,也不是矮草丛、雪等可被替换的方块),返回`true`;否则返回`false`。若只需要知道该处是否被阻挡,使用此方法的开支要小于调用`:place`再检查返回值。 + + +```lua +local placer = network:get("placer_1") +if not placer:isBlocked() then + placer:place("minecraft:cobblestone") +end +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/presets.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/presets.md new file mode 100644 index 000000000000..01921cae237f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/presets.md @@ -0,0 +1,92 @@ +--- +navigation: + parent: lua-api/index.md + title: 预设 + icon: terminal +categories: + - api_builtin +description: 声明式的builder(importer、stocker),是常见物品移动和补货操作的样板 +--- + +# 预设 + +预设是声明式的builder,适用于两种经常出现的脚本样板:**将物品从A移动到B**和**补充库存水平**。这两种预设都是链式方法调用,从左往右可直接按照自然语言读出,并用`:start()`结尾以启动。 + +预设基于现有的脚本API存在。它们也是Lua脚本,也按同样的方式使用卡片和筛选器,也同样会在脚本停止时停止。区别在于,1行预设就相当于大约15行的手动状态追踪scheduler循环。 + + +```lua +-- 将农场箱子中的圆石移动到网络存储,每秒一次 +importer:from("mobFarm"):filter("$item:cobblestone"):to(network):start() +-- 保证发射器中有64根箭,缺少时自动合成。 +stocker:ensure("minecraft:arrow"):to("dispenser"):keep(64):start() +``` + + +## 现有预设 + +* [Importer](importer.md)(导入器)会将物品从任意多个来源移动至任意多个目标。默认模式为填充(填满目标后再继续到下一个)。调用`:roundrobin()`可在目标间轮询。 +* [Stocker](stocker.md)(补货器)会按照`:keep(n)`水位线保证目标的库存量,可通过从网络存储中抽取、合成以达成,或两种方法均使用。达到水位线后不再抽取。 + +## 来源与目标的引用 + +预设接受三种形式的来源和目标: + +1. **string**(字符串)卡片别名:`"bufferChest"`。 +2. 来自`network:get(...)`的**CardHandle**。 +3. **`network`**‌全局变量本身,代表“整个网络存储”。 + + +```lua +-- 可以混用这三种形式。 +importer:from("farm", network:get("secondary"), network) + :to("output") + :start() +``` + + +卡片解析会在每次网络拓扑改变时进行,因此卡片被取出或同名替换时不会重启预设。预设会静默跳过缺失的卡片,直到它们返回为止。 + +## 通用方法 + +所有`ImporterBuilder`和`StockerBuilder`都使用同一种生命周期和控制方法。 + +### every + + +```lua +ImporterBuilder:every(ticks: number): ImporterBuilder +StockerBuilder:every(ticks: number): StockerBuilder +``` + + +设置预设重新运行的频率。默认为20刻(每秒一次)。运行中途改变频率会取消当前的scheduler任务,并按新间隔重新注册,所以`imp:every(5)`会立即生效。 + +### start / stop / isRunning + + +```lua +ImporterBuilder:start() +ImporterBuilder:stop() +ImporterBuilder:isRunning(): boolean +``` + + +`:start()`会注册链式调用并开始计刻。若builder已在运行则相当于无操作,因此重复调用能保证安全。`:stop()`会停止计刻,但能保留所有配置;后续再次使用`:start()`即可恢复同一个链式调用,其中也包括所有轮询目的位置。 + + +```lua +local imp = importer:from("src"):to("dst") +scheduler:second(function() + if someCondition() and not imp:isRunning() then + imp:start() + elseif imp:isRunning() and not someCondition() then + imp:stop() + end +end) +``` + + +## 脚本停止时清理 + +脚本终端停止时(手动或断开网络),脚本生命周期内注册的所有预设也会自动停止。悬空的builder(即创建后从未`:start()`)也会被清理。再次启动脚本会从头重建所有预设,因此无需在运行间隙更改链式代码时担心垃圾残余。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/scheduler.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/scheduler.md new file mode 100644 index 000000000000..4e8238626f6b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/scheduler.md @@ -0,0 +1,70 @@ +--- +navigation: + parent: lua-api/index.md + title: Scheduler + icon: minecraft:repeater +categories: + - api_builtin +description: 每刻运行/每秒运行/延迟回调函数 +--- + +# Scheduler + +`scheduler`(规划器)模块会注册周期性和延时式回调函数,计时基准为服务端刻(20 TPS)。每次注册会返回一个任务ID,可将其传入`:cancel`以停止。 + +> **提示:**‌若想要脚本不断运行[`scheduler:tick`](scheduler.md#tick)或[`scheduler:second`](scheduler.md#second),建议开启的[“自动运行”](../items-blocks/scripting_terminal.md#自动运行)。 + +![](../assets/images/autorun.png) + +## tick + +每服务端刻运行一次所给回调函数 + + +```lua +scheduler:tick(function() + -- 每秒运行20次 +end) +``` + + +## second + +每秒(20刻)运行一次所给回调函数 + + +```lua +scheduler:second(function() + -- 每秒运行1次 +end) +``` + + +## delay + +将回调函数延迟所给刻数。 + + +```lua +scheduler:delay(20, function() + -- 经过1秒再运行 +end) +``` + + +## cancel + +停止所给ID对应的任务。对已取消和已过期ID调用能保证安全。 + + +```lua +local task = scheduler:tick(function() + print("hello") +end) +-- 在1秒后取消scheduler:tick任务 +scheduler:delay(20, function() + scheduler:cancel(task) +end) +-- "hello"(x20) +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/stocker.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/stocker.md new file mode 100644 index 000000000000..f280d1006715 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/stocker.md @@ -0,0 +1,155 @@ +--- +navigation: + parent: lua-api/index.md + title: Stocker + icon: minecraft:observer +categories: + - api_types + - api_preset +description: 通过抽取、合成,或两者并用保证目标存量足够 +--- + +# Stocker + +`stocker`(补货器)全局变量能建造库存水平维持器。设置好目标容器、`:keep(n)`水位线、来源(抽取、合成、两者并用)后,stocker就会在容器库存量低于水位线时进行补货。库存量超出水位线时不会抽出多余量,若玩家往里多放了些,多出的部分也不会被取走。 + +## 三种来源模式 + +stocker链以三种工厂方法之一起始,可根据物品来源选择其中一种。 + +### from + + +```lua +Stocker:from(...sources: string | CardHandle | network): StockerBuilder +``` + + +从卡片或网络存储中抽取。短缺时不会合成。适用于“只从这个缓存箱里抽取”和“从网络存储里抽取,缺少时等待”的场景。与[`:filter`](./stocker.md#filter)配合可匹配特定种类的物品,不指定筛选器时stocker会抽取任意物品直到达成`:keep(n)`的要求。 + + +```lua +-- 从指定的两个箱子里抽取箭 +stocker:from("chest1", "chest2"):filter("$item:arrow"):to("dispenser"):keep(64):start() + +-- 从网络存储抽取,抽空则等待 +stocker:from(network):filter("$item:arrow"):to("dispenser"):keep(64):start() +``` + + +### ensure + + +```lua +Stocker:ensure(itemId: string): StockerBuilder +``` + + +首先从网络存储中抽取,短缺时合成剩余部分。最常用的来源模式,适用于“确保有N个物品”的场景。需接受精确物品ID,因为合成计划本身需要有确切的产物。 + + +```lua +stocker:ensure("minecraft:arrow"):to("dispenser"):keep(64):start() +stocker:ensure("minecraft:iron_ingot"):to(network):keep(256):start() +``` + + +### craft + + +```lua +Stocker:craft(itemId: string): StockerBuilder +``` + + +只通过合成补货,不从现有存储空间中抽取。如需保证产物为新合成状态,或资源稀缺以至于合成优于抽取,可选择此来源模式。 + + +```lua +stocker:craft("minecraft:bread"):to("foodChest"):keep(16):start() +``` + + +## 必选方法 + +### to + + +```lua +StockerBuilder:to(target: string | CardHandle | network): StockerBuilder +``` + + +设置目标。接受卡片别名、CardHandle对象,以及代表“保证网络库存量”的`network`。stocker会统计目标中匹配物品的数量,使用`network`时,则统计所有存储卡。 + +### keep + + +```lua +StockerBuilder:keep(amount: number): StockerBuilder +``` + + +目标的库存量水平。stocker会补货至达到此值为止。若当前数量超出此值(玩家额外放入、其他脚本输入等),stocker也不会抽出。stocker只会送入,永远不会抽出。 + +## 可选方法 + +### filter + + +```lua +StockerBuilder:filter(pattern: string): StockerBuilder +``` + + +限制目标中`:keep(n)`统计的资源种类。默认为`*`(任意物品)。如需stocker在多种来源间仅统计特定种类的物品,可设置此值。**`:ensure`和`:craft`会自动设置此值**至相应的物品ID,因此仅有`:from`需要专门指定`:filter`。 + + +```lua +stocker:from("buffer") + :filter("$item:arrow") + :to("dispenser") + :keep(64) + :start() +``` + + +### batch + + +```lua +StockerBuilder:batch(size: number): StockerBuilder +``` + + +将合成请求聚合至该单次数量。默认为0,代表“缺多少补多少”(缺少3个时就合成3个,无论配方的消耗有多小)。设为`:batch(64)`可让stocker一次性合成64个;此设置适合设施开支大(多输入、多步骤)的配方使用,这些配方若以多个小作业的数量发出会严重拖慢CPU。 + + +```lua +stocker:craft("minecraft:iron_ingot"):to("chest"):keep(64):batch(32):start() +-- 短缺10个时合成32个,补货后目标可能能暂时性存有74个物品。 +``` + + +目标存量可能会因单次数量过大而超出`:keep(n)`,后续计刻时stocker便什么都不会做,直至库存量再次低于水位线为止。 + +## 示例:为发射器补充箭,缺少时合成 + + +```lua +stocker:ensure("minecraft:arrow") + :to("trapDispenser") + :keep(64) + :batch(16) + :every(20) + :start() +``` + + +每秒:若发射器中箭的数量少于64,则首先从网络存储抽取;若仍短缺,合成16个。重复至发射器补充完毕。 + +## 延伸阅读 + +* [通用预设方法](presets.md#通用方法)(`:every`、`:start`、`:stop`、`:isRunning`)。 +* [Importer](importer.md)(导入器),A到B的持续供货,与库存量无关。 +* [Network:craft](network.md#craft),合成原语详情。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/user-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/user-handle.md new file mode 100644 index 000000000000..a693457560bd --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/user-handle.md @@ -0,0 +1,126 @@ +--- +navigation: + parent: lua-api/index.md + title: UserHandle + icon: user +categories: + - api_types +description: 能使用物品右击其前方方块的设备 +--- + +# UserHandle + +`UserHandle`(使用器句柄)是对网络中的引用,由[`network:get(name)`](network.md#get)返回。它会从[网络存储](../nodeworks-mechanics/network-storage.md)中抽取一个物品,并用其右击前方方块。 + + + +使用器有两种模式。**瞬时**模式下,每次调用`:use()`会发起单次右击。**保持**模式下,则会按住鼠标右键,直至`:stop()`运行(或物品完成了操作,或超出了30秒时限)。筛选器语法与一致。 + +## 属性 + +- **`.name`** + - 使用器的别名(和终端侧边栏中的一致) +- **`.kind`** + - 必定是`"user"` + +## use + +触发使用器。**瞬时**模式下仅右击一次,并返回操作的执行地点。**保持**模式下则按住鼠标右键,返回是否进入按住右键状态。 + +若使用器正在使用、在冷却中、被筛选器阻止,或网络存储中没有匹配物品,或网络中没有控制器,则返回`false`(且不会触发)。 + + +```lua +local farmer = network:get("crop_farmer") +farmer:use() +``` + + +如需完全重启按住右键操作,可先调用`:stop()`。 + +## stop + +取消计划中的瞬时点击,或释放按住操作。空闲时调用能保证安全,即不会报错,且返回`false`。将物品送回网络存储的收缩动画无法取消。 + + +```lua +local user = network:get("user_1") +local watcher = network:get("observ_1") +user:setMode("hold") +user:use() -- 对可疑的方块使用刷子 +-- 方块变为普通的沙子和沙砾时,停止使用器 +watcher:onChange(function(block: BlockId, state: any) + if block == "minecraft:gravel" or block == "minecraft:sand" then + user:stop() + end +end) +``` + + +## isUsing + +正按住右键时返回`true`,否则返回`false`。 + + +```lua +local user = network:get("user_1") +if not user:isUsing() then + user:use() +end +``` + + +## mode + +以字符串形式返回当前模式,必定为`"instant"`或`"hold"`。 + + +```lua +local user = network:get("user_1") +print(user:mode()) -- "instant" +``` + + +## setMode + +设置使用器的模式。接受`"instant"`和`"hold"`(忽略大小写)。 + + +```lua +local user = network:get("crop_farmer") +user:setMode("hold") +``` + + +## filter + +以字符串形式返回当前筛选器规则,未设置时返回空值。 + + +```lua +local user = network:get("user_1") +print(user:filter()) -- "minecraft:bone_meal" +``` + + +## setFilter + +设置使用器是筛选器规则。筛选器语法与一致,也即物品ID、`#namespace:tag`、`minecraft:*`、`/正则表达式/`、`$item:`/`$fluid:`前缀均可用。 + + +```lua +local user = network:get("crop_farmer") +user:setFilter("minecraft:bone_meal") +``` + + +## facing + +以全小写字符串形式(`"north"`、`"south"`、`"east"`、`"west"`、`"up"`、`"down"`)返回使用器的朝向. + + +```lua +local user = network:get("user_1") +print(user:facing()) -- "north" +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/variable-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/variable-handle.md new file mode 100644 index 000000000000..5250c8bc31df --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/lua-api/variable-handle.md @@ -0,0 +1,199 @@ +--- +navigation: + parent: lua-api/index.md + title: VariableHandle + icon: variable +categories: + - api_types +description: 对网络中的引用 +--- + +# VariableHandle + +`VariableHandle`(变量器句柄)是对网络中的引用,由[`network:get(name)`](network.md#get)(与卡片所用的访问端口相同)返回。handle会追踪变量器声明的类型。除去下文的通用核心API外,不同类型的变量还会获得相应的帮助方法。 + + + +> **注意:**‌所有修改操作均为原子操作。对同一个变量器调用的`:set`和`:cas`无法在中途退出。 + +## 属性 + +- **`.name`** + - 变量器的别名(和终端侧边栏中的一致) + +## 核心方法 + +### get / set + +获取和设置变量器的当前值。 + + +```lua +local myNumericVar = network:get("myNumericVar") +print(myNumericVar:get()) +myNumericVar:set(1) +print(myNumericVar:get()) +-- "0" +-- "1" +``` + + +### cas + +比较与交换(Compare-and-swap)。仅在变量器当前值等于`expected`时将其修改为`new`,否则保留当前值不变。成功交换返回`true`,若有其他来源修改了变量器则返回`false`。 + +每当需要**根据当前值**写入新值时,或会有多个脚本修改变量器时,都应使用此方法。`:set`不会对原值进行判断,相互竞争的两个脚本可能会破坏双方的运行过程。`:cas`只会在原值与预期一致时写入,其他情况均拒绝。 + + +```lua +-- 竞标:第一个读到""的脚本获胜 +if slot:cas("", "worker_A") then + print("我抢到了") +else + print("其他人抢到了") +end +``` + + +典型的读取-修改-写入循环中途出现值变动: + + +```lua +-- 仅在>0时递减,遇到竞态条件时重试 +while true do + local current = counter:get() + if current <= 0 then + break -- 不需再递减 + end + if counter:cas(current, current - 1) then + break -- 成功递减 + end + -- 其他脚本在:get和:cas之间修改了值,再试一遍 +end +``` + + +> **注意:**‌对于算术操作而言,[`increment和decrement`](variable-handle.md#increment--decrement)已经是原子操作了,而且它们更简洁。如果修改操作不只是加减一个数,应使用`:cas`。 + +### type + +以字符串形式返回此`VariableHandle`的“类型”。 + +- **`NumberVariableHandle`** + - `"number"` +- **`BoolVariableHandle`** + - `"bool"` +- **`StringVariableHandle`** + - `"string"` + + +```lua +local numberVar = network:get("numberVar") +local boolVar = network:get("boolVar") +local stringVar = network:get("stringVar") +print(numberVar:type()) +print(boolVar:type()) +print(stringVar:type()) +-- "number" +-- "bool" +-- "string" +``` + + +## BoolVariableHandle + +指向声明`bool`(布尔值)变量的的[`VariableHandle`](./variable-handle.md)。追加了仅适用于布尔值变量的方法。 + +### toggle + +翻转当前值(`true`变为`false`,`false`变为`true`)并返回新值。 + + +```lua +local lights = network:get("lights") +print(lights:get()) +lights:toggle() +print(lights:get()) +-- "false" +-- "true" +``` + + +> **注意:**‌可用作经由[`RedstoneCard:onChange`](./card-handle.md#onchange)接至红石按钮的“按下以切换”操作。 + +### tryLock / unlock + +复用为互斥锁的布尔值变量。`:tryLock()`会将变量从`false`原子地改为`true`,成功时返回`true`。若变量已经是`true`(有其他脚本锁定),则返回`false`,**且不进行锁定**。`:unlock()`可将其改回`false`。 + + +```lua +local mutex = network:get("job_mutex") -- 布尔值变量 +if mutex:tryLock() then + -- 干活 + mutex:unlock() +end +``` + + +> **重要:**‌若互斥锁已所得,`:tryLock`不会进行等待,而是会立即返回`false`。后续行为——无论是间隔一段时间再尝试([`scheduler:delay`](scheduler.md#delay)),或是直接跳过执行——都需由脚本本身实现。 +> +> 成功执行的`:tryLock`须与`:unlock`配对。临界区应如上方示例由`pcall`包起,这样代码出错时便不会死锁。 + +## NumberVariableHandle + +指向声明`number`(数)变量的的[`VariableHandle`](./variable-handle.md)。追加了仅适用于数变量的方法。 + +### increment / decrement + +对变量当前值进行加法或减法。两方法均需接受一个量,且均会返回新值。 + + +```lua +local counter = network:get("counter") +counter:set(0) +counter:increment(1) -- +1 -> 1 +counter:increment(5) -- +5 -> 6 +counter:decrement(2) -- -2 -> 4 +``` + + +### min / max + +- `:min(n)`将变量设为当前值和`n`之间的较小值。 +- `:max(n)`设为较大值。 + +两方法均会返回新值。 + + +```lua +local best = network:get("best_score") +best:set(42) +best:max(50) -- 42 vs 50 -> 50(新较大值) +best:max(35) -- 50 vs 35 -> 50(不变) +best:min(10) -- 50 vs 10 -> 10(新较小值) +``` + + +## StringVariableHandle + +指向声明`string`(字符串)变量的的[`VariableHandle`](./variable-handle.md)。追加了仅适用于字符串变量的方法。 + +### append / length / clear + +- `:append(str)`将`str`接到当前值后方,返回新字符串。 +- `:length()`返回当前值中字符串的数量。 +- `:clear()`清空变量(设为`""`)。 + + +```lua +local log = network:get("log") +log:clear() +log:append("开头 ") +log:append("中间 ") +log:append("结尾") +print(log:get()) +print(log:length()) +-- "开头 中间 结尾" +-- 16 +``` + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/autocrafting.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/autocrafting.md new file mode 100644 index 000000000000..e9b744572c15 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/autocrafting.md @@ -0,0 +1,125 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: 自动合成 + icon: crafting_core +categories: + - mechanic +--- + +# 自动合成 + +自动合成是能将“我想要64个铁镐”转化成64个真正的铁镐的系统。你需要告诉网络哪些配方可用,网络会暂存原材料,并让进行自动合成。 + + + + + + +## 让它跑起来 + +你需要同一网络中有四样东西: + +1. **一个CPU。**‌放下一个,紧贴它放置一个,并将核心接至。缓存器、冷却器、载件等额外组件的信息,参见[合成CPU](../items-blocks/crafting_cpu.md)。 +2. **配方。**‌将各配方编码到(原版3×3合成)或(其余)中,再把它们放到中,并接入网络。 +3. **原材料。**‌所需原材料必须位于[网络存储](./network-storage.md)之中。所有通过接入的箱子均可。 +4. **提出请求的方法。**‌可以在中点选,或者通过中脚本调用`network:craft(...)`。 + +四样备齐之后,网络能制作的物品便会出现在物品栏终端内(可通过筛选器显示,也可按住左Alt显示加号),而`network:craft("...")`也会返回一个builder而非nil。 + +## 请求合成 + +### 通过物品栏终端 + +打开终端,找到物品,对其`Alt点击`。输入数量并确认。终端顶部的**合成队列**会显示所有排队的物品。合成完成时,产物会附带上一个标记,此时即可取出产物。不过下一次再次打开终端时,这些产物就将与其他资源汇合。 + +按住`Alt`可高亮网络知晓制作方式的所有可自动合成物品,即便库存量为0也会显示。 + +### 通过脚本 + +脚本可通过`network:craft`排队合成作业,并决定产物的去向: + + +```lua +-- 产物会在制作完成后自动存入网络存储 +network:craft("minecraft:door") +``` + + +或也可链式通过`:connect(fn)`在合成完成时执行自定义代码 + + +```lua +local furnace = network:get("someFurnaceCard") +network:craft("minecraft:charcoal"):connect(function(item: ItemsHandle?) + if item then + furnace:insert(item) + end +end) +``` + + +完整的API参见[network:craft](../lua-api/network.md#craft)和[CraftBuilder](../lua-api/craft-builder.md)。 + +## 取消合成 + +右击打开其GUI。**“取消”**‌按钮会在当前有合成作业时出现。点击可终止合成作业,将缓存的所有资源退还至网络存储,并释放CPU。 + +## 处理集需要handler + +配方仅凭自身即可工作。原版的3x3合成无需外部依赖,CPU清楚如何处理它们。 + +配方则不然。处理集只是*声明*了配方(“8个粗铁会变成8个铁锭”),但并不会提及这种转化**如何**发生。需要有东西来把粗铁放进熔炉,再把锭拿回来,这个东西就是**handler**。 + +handler有两种注册方式: + +### 通过处理操作器 + + + + + + 指向熔炉顶面的蓝色频道存储卡 + + + 指向熔炉底面的红色频道存储卡 + + + +放置并在其GUI中为其绑定配方。将其后部接至主网络,并从其前部出发将子网接至具体的机器。CPU会管理操作器,无需编写脚本。这也是基本上所有“一侧进原料,另一侧出产物”机器的恰当操作方法。 + +### 通过脚本handler + +对于需要控制时序、条件路由、多步流程的配方,可以在中编写一个Lua handler: + + +```lua +local furnace = network:get("someFurnaceCard") +network:handle("...", function(job: Job, inputs: InputItems) + -- 把粗铁送至熔炉顶面(类似于熔炉上接漏斗) + furnace:face("top"):insert(inputs.rawIron) + -- 等待产物,完成时从熔炉底面抽出(也和漏斗类似) + job:pull(furnace:face("bottom")) +end) +``` + + +若试图自动合成需要处理集又未注册handler的资源,那么合成会失败,并告知哪个配方缺少handler。 + +完整样例参见[network:handle](../lua-api/network.md#handle)、[Job](../lua-api/job.md)、[InputItems](../lua-api/input-items.md)。 + +## 出错时怎么做 + +合成失败时,会在其周围间歇性产生红色的红石粉粒子云。直至打开核心的GUI解除错误,或是发起能成功的新合成作业后,粒子云才会消失。排障时首先找红色粉状粒子,检查核心是最快获知CPU错误的方式。 + +![](../assets/images/crafting_cpu_erroring.png) + +CPU回报的具体消息: + +| 消息 | 意义 | +| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| (x, y, z)处的CPU未形成 | 核心未接触,或核心未接至网络。 | +| 缺少原材料:N× 某物品……没有可用配方且库存不足。 | 网络无法找到这些物品,也没有可以制作它们的配方。向接入网络的箱子补货,或是编写配方。 | +| 未注册handler:X。在相连终端的脚本内添加`network:handle("recipe", ...)`调用。 | X是缺少Lua handler驱动的处理集配方。参见上文[处理集需要handler](./autocrafting.md#处理集需要handler)。 | +| 合成需要使用N种物品,而CPU仅能存下M种。请追加缓存器或升级。 | CPU的数量不足以容纳合成中间步骤的所有物品种类。追加缓存器。 | +| 合成需要在缓存器内暂存至少N个某种物品,而CPU仅能存下M个。请为缓存器升级或进行追加。 | 问题相同但方向不同:合成作业中某一步超出了缓存器单类型的容量。 | diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/cards.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/cards.md new file mode 100644 index 000000000000..27b4b5feddaf --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/cards.md @@ -0,0 +1,16 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: 卡片 + icon: blank_card +categories: + - mechanic +--- + +# 卡片 + +“卡片”通常指的是放在内部、可供网络交互的组件。 + +卡片列表如下: + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/devices.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/devices.md new file mode 100644 index 000000000000..1232a3b6a36a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/devices.md @@ -0,0 +1,14 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: 设备 + icon: variable +categories: + - mechanic +--- + +# 设备 + +“设备”指的是可连接至网络且可编写脚本的方块。 + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/index.md new file mode 100644 index 000000000000..a233cd508d73 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/index.md @@ -0,0 +1,9 @@ +--- +navigation: + title: 节点工程机制 + position: 30 +--- + +# 节点工程机制 + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/network-storage.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/network-storage.md new file mode 100644 index 000000000000..349c6ce71ca4 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/network-storage.md @@ -0,0 +1,56 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: 网络存储 + icon: minecraft:chest +categories: + - mechanic +--- + +# 网络存储 + +网络存储是节点工程网络视为自身具有的物品/流体共享储存空间。所有安装有的方块均为该空间的成员。脚本可对其读写,能显示它和与它交互,合成系统则能从中取出原材料。 + + + + + 将此箱子纳入网络存储 + + + 将此箱子纳入网络存储 + + + 可以通过查看网络存储 + + + +## 网络存储空间的成员 + +绑定至的所有方块的所有内容物。若破坏了存储卡的节点连接,则相应方块会立即脱离网络存储。 + +### 非空间成员 + +对应的方块不是网络存储的成员。脚本需要显式对IO卡方块送入/取出物品。网络无法通过`network:find`查看这些方块的内容物,也不会列出它们。 + +## 优先级与路由 + +每一张都有其**优先级**,用于控制`network:insert`/`:tryInsert`的填充顺序。写操作会首先前往优先级最高、相匹配的卡片,并在填满后溢出到优先级较低的卡片。同优先级的卡片按连接顺序填充。 + +脚本可通过[`network:route`](../lua-api/network.md#route)注册路由而覆盖默认的优先级顺序。 + +可在卡片的GUI内直接设置其优先级,界面详情参见[存储卡](../items-blocks/storage_card.md#配置)。也可使用一次性为多张卡片复制优先级(以及所有其他卡片设置)。 + +## 与网络存储相关的脚本 + +与网络存储交互所用读写函数的完整列表参见[网络API](../lua-api/network.md)页面。 + +## 通过物品栏终端进行查看和管理 + + + + + + +是不依赖脚本查看网络存储和与之交互的主要方式。它们会在槽位方格内显示网络存储的内容,允许你搜索、从中取出物品、放入物品,以及请求合成。它们会向网络中的各存储卡实时获取内容。 + +界面详情参见[物品栏终端](../items-blocks/inventory_terminal.md)页面。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/subnets.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/subnets.md new file mode 100644 index 000000000000..9709930d50a5 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/_zh_cn/nodeworks-mechanics/subnets.md @@ -0,0 +1,51 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: 子网 + icon: broadcast_antenna +categories: + - networking + - mechanic +--- + +# 子网 + +子网本质上是独立的网络,只是会把自身的部分功能无线向其他网络公开。每一个子网都有其、存储空间、合成设施。它们通过配对的与主网交流。 + + + + + +## 为何要拆分网络 + +对于小型基地来说,单一网络就已足够;但随着机器和配方的不断加入,拆分就变成了很好的网络组织方式: + +- **特化**。使用专用于烧炼、酿造、矿物处理的子网,可将原本散落在基地各处的有关配方和机器汇总在一起。 +- **重用**。只需搭建一次烧炼子网,之后把所有配方和它配对即可。 +- **隔离**。子网的崩溃、卡顿、合成阻塞不会影响外部。每个网络都有自身的CPU、网络存储、脚本。 +- **整洁**。主网络只能看见子网广播的配方,从而将管道和机器隐藏起来。 + +## 公开处理配方 + +最常见的子网设施如下:子网内有一方块集群,其中有一系列配方;广播即可让其他网络在自动合成时取用它们。 + +1. 在子网中,搭建集群,放入子网应公开的各。 +2. 直接在集群内任意的上方放置。 +3. 在天线的GUI内使用进行配对。 +4. 在接收网络中,向网络接入,并在其GUI中放入同一块。 + +如此,接收网络即能看见子网处理存储器集群中的所有配方,如同网络在本地拥有这些配方一样。需用到这些配方的合成作业和其他自动合成的行为一致。 + +机器和原材料依然归子网所有。接收网络需要请求产物,并静待子网发来。 + +## 无线物品传输 + +在上方的配对后,子网还可通过该导出箱直接交换物品。配对方式参见导出箱和接收天线页面。 + +## 范围 + +天线的默认范围为128格。范围升级可将其扩展至跨更多区块和跨维度,所以子网不必紧邻主网搭建。常见的用法有: + +- 下界的烧炼子网向主世界的主基地供应产物。 +- 生物农场将掉落物广播至别处的分拣基地。 +- 共享式“图书馆”子网,提供通用配方给服务端内其他所有基地使用。 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/examples/moving-items.lua b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/examples/moving-items.lua new file mode 100644 index 000000000000..8a6f5655c70c --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/examples/moving-items.lua @@ -0,0 +1,7 @@ +local input = network:get("input") +local output = network:get("output") + +local allItems = input:find("*") -- get all the items in this container +if allItems then -- if we found any items + output:insert(allItems) +end diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/inventory_terminal_gui.png b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/inventory_terminal_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..70652310a8204958b9f8df51d5509c010e3b9b25 GIT binary patch literal 87537 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

Wr4gYXf($LTs7dTKGTiR~FNA3N~+J>SQ&gb>n8g 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 literal 0 HcmV?d00001 diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/node_gui.png b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/assets/images/node_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..d7664f7e5bba3a3f195966a20446ebfa1b6b0ff8 GIT binary patch literal 50173 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

i|giy0l)${pSN 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 WRU;~hy~kJsUcrF}1M2-wQT_uInE can be easily farmed using a and a . + + + + + + +Or optionally you can use Focus Nodes to connect everything together + + + + + + +Then in the GUIs of the Breakers you set them to Low redstone mode which keeps them +active without a redstone signal. And set each of them to break . + +They'll break the fully grown celestine clusters and insert them into [network storage](../nodeworks-mechanics/network-storage.md). \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/automated-smelting.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/automated-smelting.md new file mode 100644 index 000000000000..820a372c3a48 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/automated-smelting.md @@ -0,0 +1,37 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:furnace + title: Automated Smelting Subnet +categories: + - example +--- + +# Automated Smelting Subnet + +You can bridge two networks together using a and an . This example shows a network pushing its `#c:raw_material` items to a smaller network with an array of furnaces. That smaller network then pushes its cooked results back +to the original network. + + + + + + Export Chest from the Blue Network has items pushing Down set in its GUI. + + **These two chests don't connect to each other, they're part of two separate + networks.** + + + Export Chest from the Green Network is pushing its items Up which is set in its GUI. + + **These two chests don't connect to each other, they're part of two separate + networks.** + + + Storage Cards set to the Red Channel are being pulled from by the Export Chest using the filter `*` to grab everything + + + Storage Cards set to the Blue Channel is where the Import Chest is pushing items to using round-robin + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/cobble-gen.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/cobble-gen.md new file mode 100644 index 000000000000..3a5543ea44e1 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/cobble-gen.md @@ -0,0 +1,38 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:cobblestone + title: Cobblestone Generator +categories: + - example +--- + +# Cobblestone Generator + +Cobblestone generators is the simplest way to use a . +Place a Breaker in front of a cobblestone generator like the following + + + + + + + + + +Then you configure the Breaker to break `minecraft:cobblestone` with the redstone +mode set to **Low** to make it always active. + +![image of the breaker GUI with cobblestone set as its filter to break](../assets/images/breaker_cobblestone.png) + +Or if you had a in your network you can use the following +script to achieve the same thing but for many breakers. + + +```lua +local breaker_1 = network:get("breaker_1") +scheduler:second(function() + breaker_1:mine() -- always mine +end) +``` + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/index.md new file mode 100644 index 000000000000..3d500fa9d18e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/index.md @@ -0,0 +1,9 @@ +--- +navigation: + title: Example Networks + position: 50 +--- + +# Examples + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/milky-soul-ball-farm.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/milky-soul-ball-farm.md new file mode 100644 index 000000000000..7141b2e08f9b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/milky-soul-ball-farm.md @@ -0,0 +1,36 @@ +--- +navigation: + parent: example-setups/index.md + icon: milky_soul_ball + title: Milky Soul Ball Farm +categories: + - example +--- + +# Milky Soul Ball Farm + + + + + + + + + + + + + User uses empty buckets on cows + + + User uses milk buckets on Soul Sand and puts the resulting Milky Soul Balls + and empty bucket back into Network Storage + + + Placer places soul sand in front of the User + + + +This farm has a milking cows using empty buckets and put the milk buckets into [Network Storage](../nodeworks-mechanics/network-storage.md). Then another User will use those s on the placed by a + +> **Note:** Placers and Users have redstone mode set to Low so they're all active \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/moving-items.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/moving-items.md new file mode 100644 index 000000000000..c5950e343c78 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/moving-items.md @@ -0,0 +1,111 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:hopper + title: Moving Items +categories: + - example +--- + +# Moving Items + +The simplest task a Nodeworks network can do: pull items from a container into +network storage. This page walks through two variations, the basic case first then +the same setup with filtering. + +--- + +## With Import/Export Chests + +### Inserting items into your network + +Anything placed inside an will be inserted into [Network Storage](../nodeworks-mechanics/network-storage.md) + + + + + + + + + Items placed inside the Import chest will + automatically be pulled into the network + + + +### Extracting items from your network + +s can pull items out of network storage into its inventory + + + + + + + + + Items placed inside the Import chest will + automatically be pulled into the network + + + +--- + +## With a Scripting Terminal + +### Pull all items + +Pull every item from a shulker box into network storage, no filtering. + + + + + + + + + Renamed to **"shulkerBox"** + + + +The script: + + +```lua +importer + :from(shulkerBox) + :to(network) + :start() +``` + + +> **Note:** Or if you want to reverse it, just swap the `:from(shulkerBox)` to `:from(network)` and `:to(shulkerBox)` + +When this script is ran, all items that enter the shulker box will get inserted +into the network's storage (any storage cards that haven't been filtered) + +## Filtering: route by item kind + +Same network but logs go into one storage card, cobblestone into another, and +everything else into the default + + + + + + **Rules**: `#c:cobblestones` + + + + **Rules**: `#c:logs` + + + + + + + Renamed to **"shulkerBox"** + + + +Reusing the same code as before but now each Storage Card has different [filter settings](../items-blocks/storage_card.md#filters). diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/smeltery-subnet.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/smeltery-subnet.md new file mode 100644 index 000000000000..29583b46a724 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/example-setups/smeltery-subnet.md @@ -0,0 +1,43 @@ +--- +navigation: + parent: example-setups/index.md + icon: minecraft:furnace + title: Smeltery Subnet +categories: + - example +--- + +# Smeltery Subnet + +Using specialized subnets is a good way to delegate responsibility in your network +and to reuse recipes. + + + + + + Red Storage Cards to pull finished items from the furnaces + + + Blue Storage Card for all Processing Handler input items + + + Lime Storage Cards that the Import Chest round-robins items to + + + RoundRobin is enabled + + Channel set to Lime + + + +Above is an example of a **smeltery** subnet with a block that's being broadcasted using a . Any +network can be connected to use its recipes using a . + +Then I have three devices bound to the three processing +sets in the network, all pushing their input items into the . +The Import Chest is set to round-robin into another channel which I've dedicated to Storage Cards +pointing at the top of the furnaces. +Then there are Red Storage Cards pointing at the bottom of the furnaces + +See the [Autocrafting](../nodeworks-mechanics/autocrafting.md) page for more details. \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/getting-started.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/getting-started.md new file mode 100644 index 000000000000..f9198848a1a5 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/getting-started.md @@ -0,0 +1,39 @@ +--- +navigation: + title: Getting Started + position: 10 +--- + +# Getting Started + +## Required Materials + +Nodework networks are powered by the reflective properties of s + +## Growing Celestine + +Growing Celestine like s will grow from +a budding block, + +## First Nodeworks Network + +A simple network with no scripting involved, just viewing items into as many +connected chests as you'd like using an Inventory Terminal. + + + + + + +- This network contains the following: + - 1x + - 1x + - Some s to connect all devices together + - Some s to connect external blocks to the network such as chests + - 1x placed in the Node's face toward the chest + +### Expanding your Nodeworks Network + +- [Moving items](./example-setups/moving-items.md) +- [Autocrafting](./nodeworks-mechanics/autocrafting.md) +- [Example Setups](./example-setups/index.md) diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/index.md new file mode 100644 index 000000000000..dfd1e8ec80b6 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/index.md @@ -0,0 +1,31 @@ +--- +navigation: + title: Overview + position: 0 +item_ids: +- nodeworks:nodeworks_book +--- + +# Nodeworks + +A programmable logistics and automation network. + + + + + + + +## Sections + +- [Getting Started](./getting-started.md) +- [Scripting Reference](./lua-api/index.md) +- [Nodeworks Mechanics](./nodeworks-mechanics/index.md) +- [Items/Blocks](./items-blocks/index.md) +- [Example Setups](./example-setups/index.md) + +The Scripting Terminal's editor hovers any documented identifier with its signature and +short description, pressing [ ] while hovering opens the relevant page here. + +See [docs/authoring.md](https://github.com/damienfamed75/nodeworks/blob/main/docs/authoring.md) +for how to add to these docs. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/antenna_coil_assembly.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/antenna_coil_assembly.md new file mode 100644 index 000000000000..09b9d331310f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/antenna_coil_assembly.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: antenna_coil_assembly + title: Antenna Coil Assembly +categories: + - infrastructure +description: ingredient for the and +item_ids: +- nodeworks:antenna_coil_assembly +--- + +# Antenna Coil Assembly + +An ingredient for the and + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/blank_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/blank_card.md new file mode 100644 index 000000000000..d14ef6e7d48c --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/blank_card.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: blank_card + title: Blank Card +categories: + - card +description: base item for all other [Cards](../nodeworks-mechanics/cards.md) +item_ids: +- nodeworks:blank_card +--- + +# Blank Card + +This is the base item for all other [Cards](../nodeworks-mechanics/cards.md). + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/breaker.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/breaker.md new file mode 100644 index 000000000000..1d059fdc1f7f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/breaker.md @@ -0,0 +1,69 @@ +--- +navigation: + parent: items-blocks/index.md + icon: breaker + title: Breaker +categories: + - device +description: mines and harvests blocks in front of it +item_ids: +- nodeworks:breaker +--- + +# Breaker Block + +The Breaker destroys the block at the position in front of itself over time +and routes the drops back to +[Network Storage](../nodeworks-mechanics/network-storage.md) (or to a +script-supplied handler). Diamond-pickaxe tier, with break duration that uses +the wooden-pickaxe formula so harder blocks take noticeably longer to break. + + + +## Placing + +The Breaker's front face points at whatever you were aiming at when you +placed it down (same shape as a piston or dispenser). The block in front of +that face is what `:mine()` will break. + +## Target filter + +The Breaker's GUI has a filter for which block it should break. Leave it +empty to break anything in front, or set a block to restrict the Breaker +to that target. + +## Tree Felling + +If you place a Breaker at the base of a tree it will fell the whole thing. + + + + + Cutting the last log holding the tree up fells the whole thing + + + + + +## Redstone + +The GUI's redstone setting controls when the Breaker is allowed to fire: + +- **High**: active while powered. +- **Low**: active while unpowered. +- **Ignored**: redstone does nothing. The Breaker only fires when a script + calls `:mine()`. + +## Channel + +The Breaker has a name and channel picker in its GUI. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how +channels scope which scripts can address this device. + +## Scripting + +See the [BreakerHandle](../lua-api/breaker-handle.md) page to see the scripting api. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/broadcast_antenna.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/broadcast_antenna.md new file mode 100644 index 000000000000..1c3b47a9a45a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/broadcast_antenna.md @@ -0,0 +1,54 @@ +--- +navigation: + parent: items-blocks/index.md + icon: broadcast_antenna + title: Broadcast Antenna +categories: + - infrastructure +description: broadcasts access to Network Controllers, Processing Storage, and Export Chests +item_ids: +- nodeworks:broadcast_antenna +--- + +# Broadcast Antenna + +A block with two purposes, depending on what it's placed on top of: + +- On a : broadcasts wireless access to the +network. A paired to this antenna +can read/write to the network anywhere in range +- On a : broadcasts the block's (and any other +touching ) collection of s +which another network can use for [autocrafting](../nodeworks-mechanics/autocrafting.md) +- On an : broadcasts the chest as a wireless drop-off. +A paired on another network forwards anything +pushed into the chest straight into that network + + + + + + Both Processing Storage blocks are being broadcasted + + + Being broadcasted for Portable Inventory Terminals + + + Pushes items to paired import chests + + + +## Pairing + +1. Open the Broadcast antenna GUI +1. Place a into the top slot +1. Take the Crystal out, it's now paired + +## Range + +By default the range of a broadcasting antenna is 128 blocks. You can upgrade +the range with either a or + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/budding_celestine.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/budding_celestine.md new file mode 100644 index 000000000000..168b03f637a5 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/budding_celestine.md @@ -0,0 +1,38 @@ +--- +navigation: + parent: items-blocks/index.md + icon: budding_celestine + title: Budding Celestine +categories: + - misc +description: grows celestine buds on its surface +item_ids: +- nodeworks:budding_celestine +- nodeworks:celestine_cluster +- nodeworks:large_celestine_bud +- nodeworks:medium_celestine_bud +- nodeworks:small_celestine_bud +--- + +# Budding Celestine + + + + + + +## Obtaining Budding Celestine + +If you want to farm Budding Celestine you can grab it using a Silk Touch pickaxe +and it will forever grow Celestine buds. + +## Where to find + + + + + + + +Budding Celestine can be found in Celestine Geodes naturally around the world just +like Amethyst geodes diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/card_programmer.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/card_programmer.md new file mode 100644 index 000000000000..0c425bc84652 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/card_programmer.md @@ -0,0 +1,37 @@ +--- +navigation: + parent: items-blocks/index.md + icon: card_programmer + title: Card Programmer +categories: + - tool +description: used to copy [Card](../nodeworks-mechanics/cards.md) settings from a template +item_ids: +- nodeworks:card_programmer +--- + +# Card Programmer + +A Card Programmer is used to copy settings from a template [Card](../nodeworks-mechanics/cards.md). + + + +## Using it + +Right-click the item in your hand to open the GUI and you're greeted with two slots. + +- **Template (left):** drop in a [Card](../nodeworks-mechanics/cards.md) whose settings +you want to copy (the card isn't consumed) +- **Target (right):** drop in the card to configure, the target receives the template's +settings + +![](../assets/images/card_programmer_gui.png) + +You'll also notice two toggle buttons to copy the template's name and the channel. + +> **Note:** Any card that's dropped or shift+clicked into the "Target" slot +> will immediately return to your inventory after the copy is complete. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_antenna_array.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_antenna_array.md new file mode 100644 index 000000000000..79c1823141d8 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_antenna_array.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_antenna_array + title: Celestine Antenna Array +categories: + - infrastructure +description: ingredient for the +item_ids: +- nodeworks:celestine_antenna_array +--- + +# Celestine Antenna Array + +An ingredient for the + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_block.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_block.md new file mode 100644 index 000000000000..e810c89bb78d --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_block.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_block + title: Block of Celestine +categories: + - misc +description: decorative block of celestine +item_ids: +- nodeworks:celestine_block +--- + +# Block of Celestine + + + +Found in [Celestine Geodes](./budding_celestine.md#where-to-find) or crafted from s. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_ore.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_ore.md new file mode 100644 index 000000000000..ace970214605 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_ore.md @@ -0,0 +1,20 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_ore + title: Celestine Ore +categories: + - misc +description: found in caves and contains Celestine Shards +item_ids: +- nodeworks:celestine_ore +--- + +# Celestine Ore + +You can find Celestine Ore spawning naturally in the world below y level 0. + +For a regrowable supply, see [Budding Celestine](./budding_celestine.md) + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_receiver_dish.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_receiver_dish.md new file mode 100644 index 000000000000..2bbfee527ac1 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_receiver_dish.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_receiver_dish + title: Celestine Receiver Dish +categories: + - infrastructure +description: ingredient for the +item_ids: +- nodeworks:celestine_receiver_dish +--- + +# Celestine Receiver Dish + +An ingredient for the + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_shard.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_shard.md new file mode 100644 index 000000000000..6b684ed89bfb --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/celestine_shard.md @@ -0,0 +1,19 @@ +--- +navigation: + parent: items-blocks/index.md + icon: celestine_shard + title: Celestine Shard +categories: + - ingredient +description: grows celestine buds on its surface +item_ids: +- nodeworks:celestine_shard +--- + +# Celestine Shard + +Also see [Budding Celestine](./budding_celestine.md) + + + +Celestine shards are a core ingredient to many blocks and items to Nodeworks networks. \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/charged_beam_catalyst.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/charged_beam_catalyst.md new file mode 100644 index 000000000000..a02ee3a3ca53 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/charged_beam_catalyst.md @@ -0,0 +1,23 @@ +--- +navigation: + parent: items-blocks/index.md + icon: charged_beam_catalyst + title: Charged Beam Catalyst +categories: + - ingredient +description: used to craft the grapple beam +item_ids: +- nodeworks:charged_beam_catalyst +--- + +# Charged Beam Catalyst + + + + + +Used to craft the + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/craft_requester.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/craft_requester.md new file mode 100644 index 000000000000..4dfc2eb0c9b6 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/craft_requester.md @@ -0,0 +1,54 @@ +--- +navigation: + parent: items-blocks/index.md + icon: craft_requester + title: Craft Requester +categories: + - device +description: starts an autocrafting job given a redstone signal +item_ids: +- nodeworks:craft_requester +--- + +# Craft Requester + +The Craft Requester starts an autocrafting job when it receives a redstone +signal. Configure it with the item to craft and the batch size. + + + + + + + + + + + Redstone signal activates Craft Requester and crafts its configured item + + + +## Using the Craft Requester + +Right-click it with an item to set what it crafts. Right-click again with +an empty hand to open the GUI and pick the batch size and [output channel](./craft_requester.md#channel). + +Apply redstone and it'll keep queueing crafts while the signal stays on, +one batch at a time. Drop the signal and it stops. + +Pair it with a button for one-shot crafts or a +for autostock. The meter cycles its signal on its own as stock dips and +recovers. + +The status label at the bottom of the GUI tells you what it's doing. Hover it for +details. + +## Channel + +The Craft Requester uses a channel picker in its GUI to choose where the crafted item should go. + +> **Note:** See [Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for more info. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/crafting_cpu.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/crafting_cpu.md new file mode 100644 index 000000000000..bc7743af0e52 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/crafting_cpu.md @@ -0,0 +1,119 @@ +--- +navigation: + parent: items-blocks/index.md + icon: crafting_core + title: Crafting CPU +categories: + - autocrafting +description: the brain of the autocrafting system in a network +item_ids: +- nodeworks:crafting_core +- nodeworks:crafting_storage +- nodeworks:substrate +- nodeworks:stabilizer +- nodeworks:co_processor +--- + +# Crafting CPU + +A Crafting CPU is the brain of the autocrafting system. It reads recipes out of +[Storage Blocks](./storage_blocks.md) (in network and in broadcasted sub-net Processing Sets) +and pulls ingredients out of the network, runs the craft, and puts the result back. +For how to actually *use* a built CPU to run crafts, see [Auto Crafting](../nodeworks-mechanics/autocrafting.md). + +## Forming the CPU + +A CPU always has exactly one at its heart. The +Core on its own isn't enough though, it needs at least one +(the "buffer") touching it somewhere. Without a buffer the CPU has no room to stash +items mid-craft, so it stays dark. + +Placement is freeform. You don't need a wrench, and there's no required shape. +Drop a Core down, stick a buffer on any face, wire the Core to a Node, and it lights up. + + + + + Generates heat and should be paired with 2 Coolant blocks + + + +> **Tip:** it's recommended for a starter Crafting CPU to have two +> blocks connected to the to ensure **Effiency** +> is at least 100% + +## Expanding the CPU + +The other CPU blocks let you make the same CPU bigger or faster: + +- (**Crafting Buffer**): required at least +once. More buffers means more room for ingredients and intermediates while +a craft is running. Each one carries **2 heat**. +- (**Crafting Co-Processor**): each one lets +the CPU run one additional craft in parallel. Each one carries **3 heat**. +- (**Crafting Coolant**): cancels heat. A lone +Coolant block puts out **1 cooling**, but every Coolant block touching it +adds **1 more**. A Coolant block surrounded by four other Coolant blocks +outputs **5 cooling**, so Coolant is much stronger in clusters than spread +out. +- (**Crafting Substrate**): the speed lever. +Every face of a Buffer or Co-Processor that touches a Substrate block +speeds the CPU up by **10%**, up to a cap of **4× (400%) speed**. +Substrate faces touching the Core, other Substrate, or Coolant do nothing, +so sandwich Substrate between Buffers and Co-Processors for the best +effect. + +All of these just need to touch the Core or chain off something that's already +part of the CPU. No wrench, no GUI step. Add blocks and they get absorbed on the +next tick. + +### Heat, cooling, and speed + +Every Buffer and Co-Processor you place is its own little furnace, and the Coolant +block's job is to soak up heat from the heart sources it physically touches. +The layout matters as much as the count: + +- Stacking heat sources face to face adds an extra **1 heat per shared face**, + on top of the heat those blocks already carry. A tight cube of Buffers and + Co-Processors runs much hotter than the same blocks spread out. +- Each Coolant block outputs a total cooling value (1 alone, higher in a + cluster). That output is **split evenly across the heat sources the + Coolant is touching**. A Coolant sandwiched between two Buffers gives + half its cooling to each, a Coolant sitting in the middle of six heat + sources is almost useless on any one of them. +- When the CPU's total cooling can't cover its total heat, speed **throttles + down** proportionally, all the way to a floor of **25%**. The CPU never + stops, it just crawls. +- Coolant only neutralizes heat, it never boosts speed above 100%. The only + block that does that is Substrate, up to the 4× cap. + + + + + + + + + + + + +> **Tip:** there's also a visual indication of a block overheating when it's tinted +> yellow/orange/red or smoking. + +The practical takeaway: don't try to smother a big pile of Buffers and +Co-Processors with a handful of Coolant blocks pressed against them. +Build Coolant into dedicated walls or fins (where Coolant blocks touch each +other), and arrange heat sources so each Coolant has only one or two +heat faces to deal with. Then add Substrate on the remaining Buffer/ +Co-Processor faces to crank the speed. + +## Recipes + + + + + + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/device_frame.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/device_frame.md new file mode 100644 index 000000000000..768e79d528fe --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/device_frame.md @@ -0,0 +1,21 @@ +--- +navigation: + parent: items-blocks/index.md + icon: device_frame + title: Device Frame +categories: + - device +description: primary ingredient for devices +item_ids: +- nodeworks:device_frame +--- + +# Device Frame + +An ingredient for all [Devices](../nodeworks-mechanics/devices.md) + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/diagnostic_tool.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/diagnostic_tool.md new file mode 100644 index 000000000000..6c14c4550286 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/diagnostic_tool.md @@ -0,0 +1,73 @@ +--- +navigation: + parent: items-blocks/index.md + icon: diagnostic_tool + title: Diagnostic Tool +categories: + - tool +description: inspect a network's topology, CPUs, scripts, and recent errors +item_ids: +- nodeworks:diagnostic_tool +--- + +# Diagnostic Tool + +A handheld inspector for a Nodeworks network. Right-click any block on +a network to open a panel that summarises everything the network is +made of and everything it's currently doing. + + + +## How to use it + +Right-click any network block on the target network. A +, , +, antenna, or storage block all +work. You can also click any piece of a +[Crafting CPU](crafting_cpu.md) multiblock (Core, Buffer, Coolant, +Substrate, Co-Processor); the tool walks the cluster to find the Core +for you. + +If the block you click isn't on a network, the tool tells you so via an +overlay message and doesn't open. + +## What it shows + +The diagnostic panel pulls together everything the network exposes: + +- **Topology**. Every block on the network with its position, type, and + per-block details. s list the cards on each + face along with the adjacent block they target. +- **Network identity**. The controller's name and colour, with a quick + glance at its redstone mode, handler retry limit, and chunk-loading + toggle. +- **CPUs**. Each on the network, its + current craft (if any), buffer usage, efficiency, and whether the + multiblock is properly formed. +- **Terminals**. Every on the network with + its script list, autorun flag, running state, and which + [Processing Set](recipe_sets.md#processing-set) handlers each running + script has registered. +- **Craftable items**. The full list of items the network can + autocraft, gathered from every + and . +- **Recent errors**. The last 10 script errors from terminals on the + network, with the tick offset showing how long ago each one fired. + +The view is read-only. Nothing you click in the panel changes the +network, it's purely for figuring out what's where and what went +wrong. + +## When to reach for it + +- A craft failed and you want to see the error without standing next + to the . +- You inherited a sprawling network and need a map. +- You're trying to figure out why a recipe isn't autocraftable, the + craftable-item list shows what the network actually knows how to make. +- A script seems stuck, the terminal panel surfaces its running state + and registered handlers without opening every terminal manually. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/dimension_range_upgrade.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/dimension_range_upgrade.md new file mode 100644 index 000000000000..c05e7dc834a2 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/dimension_range_upgrade.md @@ -0,0 +1,22 @@ +--- +navigation: + parent: items-blocks/index.md + icon: dimension_range_upgrade + title: Dimension Range Upgrade +categories: + - infrastructure +description: upgrades range for the +item_ids: +- nodeworks:dimension_range_upgrade +--- + +# Dimension Range Upgrade + +Used to upgrade range for the to be accessible +across the same dimension the antenna is placed in. + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/export_chest.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/export_chest.md new file mode 100644 index 000000000000..d73e3c34f80b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/export_chest.md @@ -0,0 +1,60 @@ +--- +navigation: + parent: items-blocks/index.md + icon: export_chest + title: Export Chest +categories: + - infrastructure +description: pulls items from network storage into its inventory +item_ids: +- nodeworks:export_chest +--- + +# Export Chest + +A 9-slot chest that automatically pulls items out of +[Network Storage](../nodeworks-mechanics/network-storage.md) and into its +own buffer. + + + + + +## Filter + +The chest's GUI takes a list of filter rules using the same pattern syntax +as the . Any item matching a rule is fair +game for export. An empty filter idles the chest so a fresh placement +doesn't immediately drain the network. + +## Push face + +Pick a face in the GUI to auto-drain the buffer into the inventory on +that side. Useful for feeding a hopper, furnace, or machine without +needing a script. Leave it unset to keep the buffer as a manual pickup +spot. + +## Channel + +Set a channel to restrict the pull to storage cards on that channel. The +default pulls from every storage card on the network. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel). + +## Redstone + +The GUI's redstone setting gates whether the chest runs: + +- **High**: active while powered. +- **Low**: active while unpowered. +- **Ignored**: redstone does nothing. + +## Wireless + +Place a on top of the chest and pair +it with a on another network. Items +pushed into the chest get forwarded straight into the receiving +network's storage. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/grapple_beam.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/grapple_beam.md new file mode 100644 index 000000000000..982b8a5634bf --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/grapple_beam.md @@ -0,0 +1,25 @@ +--- +navigation: + parent: items-blocks/index.md + icon: grapple_beam + title: Grapple Beam +categories: + - tool +description: decorative block of celestine +item_ids: +- nodeworks:grapple_beam +--- + +# Grapple Beam + + + + + +Can be used to fling yourself around :) + +If your server allows for it or if you're singleplayer then you can also grab mobs with it. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/import_chest.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/import_chest.md new file mode 100644 index 000000000000..7e02a87997dc --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/import_chest.md @@ -0,0 +1,63 @@ +--- +navigation: + parent: items-blocks/index.md + icon: import_chest + title: Import Chest +categories: + - infrastructure +description: pushes items into network storage from its inventory +item_ids: +- nodeworks:import_chest +--- + +# Import Chest + +A 9-slot chest that automatically pushes anything placed inside it into +[Network Storage](../nodeworks-mechanics/network-storage.md). Drop items +in by hand, with a hopper, or from another mod's pipes and the chest +clears itself into the network. + + + + + +Items that can't be accepted (filters, no space, etc.) stay in the chest +so you can see exactly what's stuck. + +## Channel + +Set a channel in the GUI to restrict the push to storage cards on that +channel. The default pushes to every storage card on the network. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel). + +## Round robin + +Toggle round robin in the GUI to spread inserts across destination +storage cards instead of always filling the first one. Handy when you +want incoming items to load-balance across multiple storage targets. + +## Tick interval + +The GUI exposes how often the chest tries to insert, defaulting to once +per second. Lower for snappier intake at the cost of more network work, +higher for idle setups. + +## Redstone + +The GUI's redstone setting gates whether the chest runs: + +- **High**: active while powered. +- **Low**: active while unpowered. +- **Ignored**: redstone does nothing. + +## Wireless + +Place a on top of the chest and pair +it with a sitting on an + on another network. Items pushed into the +broadcasting Export Chest land in this chest, then route into the local +network's storage like any other intake. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/index.md new file mode 100644 index 000000000000..5236414cd9cb --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/index.md @@ -0,0 +1,36 @@ +--- +navigation: + title: Nodeworks Items/Blocks + position: 20 +--- + +# Items/Blocks + +## Ingredients & Misc Blocks + + + + +## Tools + + + +## Cards + + + +## Infrastructure + + + +## Terminals + + + +## Devices + + + +## Autocrafting + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/inventory_terminal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/inventory_terminal.md new file mode 100644 index 000000000000..4b6c3a7393c8 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/inventory_terminal.md @@ -0,0 +1,46 @@ +--- +navigation: + parent: items-blocks/index.md + icon: inventory_terminal + title: Inventory Terminal +categories: + - terminal +description: a viewport into [Network Storage](../nodeworks-mechanics/network-storage.md) +item_ids: +- nodeworks:inventory_terminal +--- + +# Inventory Terminal + +The Inventory Terminal is a viewport into a [network's storage](../nodeworks-mechanics/network-storage.md). + + + +## Browsing the grid + +![](../assets/images/inventory_terminal_gui_expanded.png) + +- Left-click grabs a stack +- Right-click takes half a stack +- Double-click collects all matching items onto cursor +- Dropping a carried stack onto the grid inserts into [Network Storage](../nodeworks-mechanics/network-storage.md) +- Right-clicking a carried stack into the grid inserts one item +- Hold `Alt` to show auto-craftable items in the network + +The left side has buttons for: + +- Changing layouts +- Sorting the grid +- Filtering by (storage, recipes, or both) +- The kind (items, fluids, or both) +- Auto-focus search toggle + +And in the center is a collapsible crafting grid with buttons to: + +- Auto-pull from network +- Distribute ingredients evenly in the crafting grid +- Push ingredients in the crafting grid to the network storage + +## Recipes + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/io_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/io_card.md new file mode 100644 index 000000000000..3a5556138ee6 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/io_card.md @@ -0,0 +1,59 @@ +--- +navigation: + parent: items-blocks/index.md + icon: io_card + title: IO Card +categories: + - card +description: used for reading and writing an inventory/tank from scripts +item_ids: +- nodeworks:io_card +--- + +# IO Card + +The IO Card lets a network read from and write to the inventory of an adjacent +block on demand. With an IO Card installed, scripts can query what's in the +block and move items or fluids to/from it. + + + +## Installing + +IO Cards go in the face slots of a . Right-click the +face of the node that's touching the block you want to control and drop an +IO Card into any of the 9 slots. The card's behavior applies to *that face*, +so the same node can have IO Cards on different faces controlling different +neighbors. + +![](../assets/images/node_gui.png) + +## What it does + +A block with an IO Card attached shows up on the network as a script-reachable +inventory: + +- `card:find(filter)` returns an [ItemsHandle](../lua-api/items-handle.md) for + matching contents. +- `card:insert(items)` / `card:tryInsert(items)` move items into it. +- `card:count(filter)` totals matching items (and fluids, in mB). + +Unlike a , an IO card's block is **not** part of +[Network Storage](../nodeworks-mechanics/network-storage.md). Scripts have to explicitly move items to or from it, +`network:find` across the whole network won't see its contents, and the + or won't list them. + +## Channel + +The IO Card has a channel picker in its GUI. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how channels +scope which scripts and presets can address this card. + +## Scripting + +See the [CardHandle reference](../lua-api/card-handle.md#inventory-cards) for the full set of +methods available on an IO Card's handle. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/link_crystal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/link_crystal.md new file mode 100644 index 000000000000..9b7b71318e4b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/link_crystal.md @@ -0,0 +1,25 @@ +--- +navigation: + parent: items-blocks/index.md + icon: link_crystal + title: Link Crystal +categories: + - infrastructure +description: used to link to broadcast antennas +item_ids: +- nodeworks:link_crystal +--- + +# Link Crystal + +Used for to pair with + + + +## Usage + +See the pairing steps in the [Broadcast Antenna](./broadcast_antenna.md#pairing) page. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/milky_soul_ball.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/milky_soul_ball.md new file mode 100644 index 000000000000..3597a92f0474 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/milky_soul_ball.md @@ -0,0 +1,26 @@ +--- +navigation: + parent: items-blocks/index.md + icon: milky_soul_ball + title: Milky Soul Ball +categories: + - ingredient +description: contains a unique soul for crafting +item_ids: +- nodeworks:milky_soul_ball +--- + +# Milky Soul Ball + +A unique and milky soul ready for crafting. Optionally you can throw them at your +worst enemies to inflict a Withering effect. :3 + + + +## How to Craft + +Grab a in your hand and right-click on a block of + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/multi_dimension_range_upgrade.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/multi_dimension_range_upgrade.md new file mode 100644 index 000000000000..c006ff5230bc --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/multi_dimension_range_upgrade.md @@ -0,0 +1,22 @@ +--- +navigation: + parent: items-blocks/index.md + icon: multi_dimension_range_upgrade + title: Multi-Dimension Range Upgrade +categories: + - infrastructure +description: upgrades range for the +item_ids: +- nodeworks:multi_dimension_range_upgrade +--- + +# Multi-Dimension Range Upgrade + +Used to upgrade range for the to be accessible +across any dimension. + + + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_controller.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_controller.md new file mode 100644 index 000000000000..6532c7d8504c --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_controller.md @@ -0,0 +1,45 @@ +--- +navigation: + parent: items-blocks/index.md + icon: network_controller + title: Network Controller +categories: + - infrastructure +description: the heart of a network, every network requires one +item_ids: +- nodeworks:network_controller +--- + +# Network Controller + +Every Nodeworks network needs exactly one Controller. Without it, the +[Pipes](pipe.md) and [Nodes](node.md) connected to it stay dormant. + + + + + + +Place a Controller, run pipes from it, and any block that connects to +those pipes joins the network. + +## Identity + +The Controller's GUI lets you name the network and pick a colour. The +name is cosmetic, the colour tints the node glows so multiple networks +in the same area stay easy to tell apart. + +## Chunk loading + +Toggling chunk loading in the GUI keeps every chunk that the network +touches forced-loaded. Useful for autocrafting setups that need to keep +running while you're far away. + +## One per network + +Two Controllers connected to the same pipe run will conflict and both +networks shut down until one is removed. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_wrench.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_wrench.md new file mode 100644 index 000000000000..beb972853748 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/network_wrench.md @@ -0,0 +1,59 @@ +--- +navigation: + parent: items-blocks/index.md + icon: network_wrench + title: Network Wrench +description: toggles pipe connections and links Focus Nodes +item_ids: +- nodeworks:network_wrench +--- + +# Network Wrench + +The Network Wrench is how you adjust the shape of a network without +breaking anything. It toggles individual pipe connections between blocks +and links s across distance. + + + +## Toggling pipe connections + +Shift + right-click any face where two network blocks are touching to +toggle the pipe stub between them. The blocks stay where they are, but +the network treats the side as if there's no pipe there. + +This is the everyday use of the wrench. A few common reasons to reach +for it: + +- Keep a sitting next to a + without the two merging into one network branch +- Split a single network into two by toggling off a single pipe face +- Stop a or device from picking up an + accidental adjacency to a neighbouring network + +Repeat the action on the same face to restore the connection. + +## Linking Focus Nodes + +s are the exception. Two Focus Nodes can be +wired across distance with the wrench: + +1. Shift + right-click a Focus Node on a face that isn't touching + another network block to select it as the pending source. The block + gains a border to show it's selected. +2. Right-click another Focus Node to toggle a link between the two. + +The selection sticks after a successful link so you can chain one source +to many targets without re-selecting between each. + +### Rules + +- Both Focus Nodes must be in the **same dimension** as the selection. +- They must belong to the **same network controller**. The wrench won't + bridge two separate networks. + +The wrench tells you which rule failed via a chat message. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/node.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/node.md new file mode 100644 index 000000000000..cc1dc5030e92 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/node.md @@ -0,0 +1,78 @@ +--- +navigation: + parent: items-blocks/index.md + icon: node + title: Node +categories: + - infrastructure +description: card host on a pipe network +item_ids: +- nodeworks:node +- nodeworks:focus_node +--- + +# Node + +A Node is the block that holds [Cards](../nodeworks-mechanics/cards.md). The +network's connectivity itself runs through [Pipes](pipe.md). A Node is what +you drop into a pipe run wherever you want cards to interact with a +neighbouring block. + + + +## Faces + +Each face adapts to whatever's next to it. A face touching another +network block becomes part of the pipe and disables its card slots. A +face touching a regular block hosts cards that target that neighbour. + +## Opening the GUI + +Right-click a non-Pipe face to open its card grid. Shift + right-click +opens the *opposite* face. Handy when the side you want is buried. Pipe +faces don't open; their tab in the side picker appears dimmed. + +![](../assets/images/node_gui.png) + +## Cards + +Drop a card into any of the 9 slots on a Device face to give that face +a capability: + +- : lets the + network move items in and out of the adjacent block. +- : + marks the adjacent block's inventory as Network Storage. +- : + reads and emits redstone signals from this face. +- : + reads the state of the block it's facing + +Multiple cards on one face stack. A face with both an IO card and a +Redstone card can move items AND emit a redstone signal from the same +side. + +## Focus Node + + + + + + +A is a Node variant for long-distance +connections. Pair two Focus Nodes with the + and the network treats them as +connected even when there's no continuous Pipe between them, useful for +bridging across gaps or jumping between separated machine clusters +without running a Pipe the whole way. + +Focus Nodes still behave like regular Nodes for their six faces: same +Pipe / Device / Free roles, same card slots, same auto-connection to +adjacent Pipes. The wrench-paired link is in addition to whatever +adjacency they pick up locally. + +## Recipe + + + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/observer_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/observer_card.md new file mode 100644 index 000000000000..9429d6c3f885 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/observer_card.md @@ -0,0 +1,52 @@ +--- +navigation: + parent: items-blocks/index.md + icon: observer_card + title: Observer Card +categories: + - card +description: reads the block at the installed node face, id, properties, and change events +item_ids: +- nodeworks:observer_card +--- + +# Observer Card + +Reads the block at the installed face. Exposes the block id, every state +property the block has (growth `age`, `facing`, `waterlogged`, `lit`, ...), +and a change callback so scripts can react the instant a block transitions +to the state you care about. + + + +## What it's for + +Stage-gated farms are the headline use case. A piston wired to a vanilla +observer fires on every growth transition, so it'll break a small bud for +1 shard instead of waiting for the full cluster's 4. With an Observer Card +the script can read the actual stage and only pulse the breaker when the +block becomes the final form. + +It's also the right tool for reads that aren't redstone signals: trapdoor +open / closed, door state, beehive honey level, dripstone fill, daylight +sensor reading, sweet berry / kelp / sugar cane growth, ice / snow forming +under a block, anything with a `BlockState` property you can compare against. + +## Installing and Scripting + +Installs in a Node face the same way an does. +See [IO Card installation](./io_card.md#installing) for the walkthrough. +The card reads the block in front of *that face*. + +See the [ObserverCard Scripting API](../lua-api/card-handle.md#observer-card) +for the methods it exposes. + +## Channel + +The Observer Card has a channel picker in its GUI. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how channels +scope which scripts can address this card. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/pipe.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/pipe.md new file mode 100644 index 000000000000..2b3830a5438e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/pipe.md @@ -0,0 +1,50 @@ +--- +navigation: + parent: items-blocks/index.md + icon: pipe + title: Vacuum Pipe +categories: + - infrastructure +description: the building block of every network +item_ids: +- nodeworks:pipe +- nodeworks:covered_pipe +--- + +# Vacuum Pipe + +The wire of a Nodeworks network. Pipes carry items, signals, and routing +between every block on the network. + + + + + + +Place pipes next to each other (or next to any network block) and they +connect automatically. + +## Hiding Pipes + +### Covered Pipes + +You can also hide pipes by crafting Covered Pipe by taking one block and surrounding +it in 8 Vacuum Pipes in a crafting table. + + + + + + +### Focus Nodes + +You can also use s to go through glass as a way to get through walls + + + + + + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/placer.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/placer.md new file mode 100644 index 000000000000..728aafe80ed9 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/placer.md @@ -0,0 +1,59 @@ +--- +navigation: + parent: items-blocks/index.md + icon: placer + title: Placer +categories: + - device +description: a shared network placer +item_ids: +- nodeworks:placer +--- + +# Placer Block + +The Placer places block-form items at the position in front of itself. The +script picks what to place by item id or by passing an +[ItemsHandle](../lua-api/items-handle.md), the matching item is then pulled +from [Network Storage](../nodeworks-mechanics/network-storage.md) and placed. +Synchronous, the script gets `true` / `false` in the same tick it asked. + + + +## Placing + +The Placer's front face points at whatever you were aiming at when you placed +it down (same shape as a piston or dispenser). Whatever block the Placer +spawns lands directly in front of that face. Only block-form items work, +tools, food, and miscellaneous items will fail the place call. + +## Block filter + +The Placer's GUI has a slot for the block it should place. The matching +item is pulled from +[Network Storage](../nodeworks-mechanics/network-storage.md) each time the +Placer fires. Leave it empty to idle until a script asks for something +specific. + +## Redstone + +The GUI's redstone setting controls when the Placer is allowed to fire: + +- **High**: active while powered. +- **Low**: active while unpowered. +- **Ignored**: redstone does nothing. The Placer only fires when a script + calls into it. + +## Channel + +The Placer has a name and channel picker in its GUI. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how +channels scope which scripts can address this device. + +## Scripting + +See the [PlacerHandle](../lua-api/placer-handle.md) page to see the scripting api. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/portable_inventory_terminal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/portable_inventory_terminal.md new file mode 100644 index 000000000000..f34dee72b84d --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/portable_inventory_terminal.md @@ -0,0 +1,56 @@ +--- +navigation: + parent: items-blocks/index.md + icon: portable_inventory_terminal + title: Portable Inventory Terminal +categories: + - tool +description: a portable viewport into any linked network's storage +item_ids: +- nodeworks:portable_inventory_terminal +--- + +# Portable Inventory Terminal + +A portable + +A hanheld version of the . Connects wirelessly +via a paired to a +on top of a . + + + +## Linking it to a network + +The Portable Inventory Terminal reaches a network through three components you +need in place first: + + + + + +- A on the target network +- A placed on top of that Controller +- A paired to that antenna *(not to a Processing Storage)* + +



+ + +Then with the paired Link Crystal, you place it in the top-right slot of the Portable Inventory Terminal + +The Portable's item texture lights up with the network's color when the link +is live. + +
+ +## Range + +See the page for more info on broadcasting range + +## Using the terminal + +Everything inside the GUI works identically to the . + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/processing_handler.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/processing_handler.md new file mode 100644 index 000000000000..f85b0fe1f5f7 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/processing_handler.md @@ -0,0 +1,85 @@ +--- +navigation: + parent: items-blocks/index.md + icon: processing_handler + title: Processing Handler +categories: + - autocrafting +description: registers a processing set handler using a micro-network +item_ids: +- nodeworks:processing_handler +--- + +# Processing Handler + +A block-based handler for +[Processing Set](./recipe_sets.md#processing-set) recipes. Drop one on +the network, bind it to a recipe, and the +[Crafting CPU](./crafting_cpu.md) will route the recipe's ingredients +into your machine and pull the outputs back without you writing any Lua. + + + + + + Blue channel Storage Card pointing at the top of the furnace + + + Red channel Storage Card pointing at the bottom of the furnace + + + +## Two sides + +The Handler has a front face and a back face: + +- **Back face**: joins the parent network where your + and + live. +- **Front face**: anchors its own **micro-network** of pipes, nodes, and + storage cards. The Handler acts as the controller for this side, so + no is needed (or allowed) on the + front. + +Wire the back into your main network and run a small pipe loop off the +front to whatever machine actually carries out the recipe. + +## Binding a recipe + +Right-click the Handler to open its GUI and pick a + from the parent network's Processing +Storage. Each ingredient in the Set gets its own row in the GUI with a +channel colour, plus one channel colour for the recipe's outputs. + +## Channel routing + +The Handler uses channels to decide which + on the micro-network gets each item: + +- **Input channels** (one per ingredient, default blue). When the CPU + starts a craft, each input is pushed to a storage card on the + micro-network whose channel matches that ingredient's colour. + - *Input items also respect Storage Card filters if you need custom routing by + an expression, data on the item, or stackability* +- **Output channel** (one shared colour, default red). The Handler + watches storage cards on the micro-network with this channel and + pulls finished outputs back into the parent network. + +For the furnace example in the scene above: a blue storage card on top +of the furnace receives the raw input, the furnace processes it, and a +red storage card on the bottom collects the result. + +Different ingredients can use different colours when a single machine +needs them in different slots, like fuel on one side and input on +another. + +## Compared to a scripted handler + +A Processing Handler is the no-script equivalent of +[`network:handle(...)`](../lua-api/network.md#handle). Use the Handler when the recipe is "push inputs +in, pull outputs out." Use a scripted handler when you need custom +timing, or multi-step flows. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/receiver_antenna.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/receiver_antenna.md new file mode 100644 index 000000000000..af0490421608 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/receiver_antenna.md @@ -0,0 +1,40 @@ +--- +navigation: + parent: items-blocks/index.md + icon: receiver_antenna + title: Receiver Antenna +categories: + - infrastructure +description: connects to broadcasted processing storages and export chests +item_ids: +- nodeworks:receiver_antenna +--- + +# Receiver Antenna + +Used to connect one network to another [subnet](../nodeworks-mechanics/subnets.md). +This ends up being useful for splitting up [Processing Set](./recipe_sets.md#processing-set) recipes across different +networks for [autocrafting](../nodeworks-mechanics/autocrafting.md) + + + + + + Receiving processing set recipes from another network + + + Receives items from broadcasting export chests + + + +## Wireless item intake + +Place the Receiver Antenna on top of an and +pair it with a sitting on an + in another network. Items pushed into the +broadcasting Export Chest land in this Import Chest, giving you a wireless +conveyor between two networks. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/recipe_sets.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/recipe_sets.md new file mode 100644 index 000000000000..f109f296948e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/recipe_sets.md @@ -0,0 +1,96 @@ +--- +navigation: + parent: items-blocks/index.md + icon: instruction_set + title: Recipe Sets +categories: + - autocrafting +description: stores crafting recipes for [autocrafting](../nodeworks-mechanics/autocrafting.md) +item_ids: +- nodeworks:instruction_set +- nodeworks:processing_set +--- + +# Recipe Sets + +There are two types of recipe sets that are used to store crafting recipes used +in [autocrafting](../nodeworks-mechanics/autocrafting.md). + +Recipes Sets are template items that store a single recipe for the +[autocrafting](../nodeworks-mechanics/autocrafting.md) system to carry out. Each +Set is authored in its own GUI, then dropped into a matching [Storage Block](./storage_blocks.md) + +Two flavors exist, covering two kinds of recipes: + +- **Instruction Set:** vanilla 3x3 crafting recipes (shaped and shapeless) +- **Processing Set:** everything else (smelting, modded machines, multi-output processes, anything with a timeout) + +--- + +## Instruction Set + + + +A 3x3 crafting template. Anything that works in a vanilla crafting table works here. + +### Creating a recipe + +Right-click to open. Click a ghost slot with an item in hand to pin a ghost +copy there (no inventory consumption), click an empty slot again to clear. +The result slot auto-fills whenever the pattern matches a known crafting +recipe. **Clear All** resets the grid. + +The GUI also has a **tag substitutions** toggle. When on (the default), +the recipe accepts any item from the same tag as the pinned ingredient, +so an oak plank slot will happily use birch, spruce, or anything else in +`#minecraft:planks`. Turn it off to lock the recipe to exact item ids. + +> **Tip:** JEI's **(+)** recipe-transfer button works on this GUI so you can pick any crafting +> recipe in JEI and hit (+) to fill the grid in one step + +### Deploying it + +Drop the filled Set into an . Adjacent +Instruction Storages form a cluster. Every Set in the cluster is visible to +the CPU as long as *any* block in the cluster is on the network. + +--- + +## Processing Set + + + +A freeform recipe with up to 9 inputs and 3 outputs, plus an optional +per-craft timeout. Use it for anything the 3×3 grid can't express (smelting, +blasting, modded machine recipes, multi-output processes, or anything where +*"N ticks elapse before the output appears"*) + +### Creating a recipe + +Right-click to open. The GUI has: + +- **Input grid**: (3×3) ghost slots for any inputs, in any position. +- **Output column**: (3 slots) ghost slots for outputs. +- **Timeout field**: 0–999 ticks (0 = no timeout). `+` and `-` buttons step by 20, shift-click steps by 100. +- **Serial toggle**: when on, the CPU won't run this recipe in parallel with + itself. +- **Clear All**: resets everything. + +Per-slot counts are adjusted by scrolling over a filled slot (scroll up +1, +scroll down -1, scroll down at 1 clears). + +> **Tip:** JEI's **(+)** works here too, and it's *universal*. Any recipe category JEI +> knows about (smelting / blasting / modded) is fair game. + +### Deploying it + +Drop the filled Set into a . Like +Instruction Storage, adjacent Processing Storages form a cluster. The CPU +coordinates with whichever external machine actually carries out the recipe. + +## Recipes + + + + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/redstone_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/redstone_card.md new file mode 100644 index 000000000000..edd16781e25b --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/redstone_card.md @@ -0,0 +1,36 @@ +--- +navigation: + parent: items-blocks/index.md + icon: redstone_card + title: Redstone Card +categories: + - card +description: reads and writes redstone signals at the installed node face +item_ids: +- nodeworks:redstone_card +--- + +# Redstone Card + +Reads and writes redstone signals at the installed face. + + + +## Installing and Scripting + +Installs in a Node face the same way an does. +See [IO Card installation](./io_card.md#installing) for the walkthrough. +The card reads and writes the redstone signal on *that face*. + +See the [RedstoneCard Scripting API](../lua-api/card-handle.md#redstone-card) +is different from the other cards. + +## Channel + +The Redstone Card has a channel picker in its GUI. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how channels +scope which scripts can address this card. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/scripting_terminal.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/scripting_terminal.md new file mode 100644 index 000000000000..fe1866dc570e --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/scripting_terminal.md @@ -0,0 +1,65 @@ +--- +navigation: + parent: items-blocks/index.md + icon: terminal + title: Scripting Terminal +categories: + - terminal +description: where you write and run Lua scripts that control a network +item_ids: +- nodeworks:terminal +--- + +# Scripting Terminal + +The Scripting Terminal is where you write and run Lua scripts that control a network. + + + +## Opening the Editor + +Right-click the terminal to open. The editor has three panels: + +- **Sidebar**, lists every card and variable on the network. Click to insert a + `network:get("…")` line at your cursor. +- **Script tabs**, `main` plus any modules you create. `main` runs when you hit + Start, other tabs are loaded via [`require(name)`](../lua-api/index.md). +- **Output panel**, output from `print(…)`, plus any script errors. + - You can also click the left-hand arrow to expand/collapse the output or drag the separator bar to change its size + +![](../assets/images/terminal_gui.png) + +## Running Scripts + +(also see the [Scripting API](../lua-api/index.md) reference for everything scripts +can do, network queries, crafting, scheduler callbacks, variables.) + +Click Start to load and run the current `main` tab. The script exits once `main` +finishes unless it registers callbacks to keep running. Click Stop to end the +script. + +### AutoRun + +Toggle auto-run in the editor to have the script start automatically when the +terminal loads. The terminal only loads when its chunk is loaded, so auto-run +does NOT imply "runs whenever the server is up." A player needs to be in range +for the chunk to load, or the network's +needs chunk-loading enabled so the chunk stays loaded even when nobody is +nearby. + +![](../assets/images/autorun.png) + +### Redstone + +A redstone pulse on the terminal toggles its script. If the script is stopped, +the pulse starts it. If it's already running, the pulse stops it. Any rising +edge works, a button tap, a pressure plate step, or a freshly placed torch. + +> If a script gets killed by the wall-clock timeout, redstone can't restart it +> until you open the editor and edit the script. This stops a redstone clock +> pointed at a misbehaving terminal from re-triggering the same broken script +> every cycle. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_blocks.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_blocks.md new file mode 100644 index 000000000000..99c133fa634a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_blocks.md @@ -0,0 +1,54 @@ +--- +navigation: + parent: items-blocks/index.md + icon: instruction_storage + title: Recipe Storage Blocks +categories: + - autocrafting +description: houses Recipe Sets so Crafting CPUs can see them +item_ids: +- nodeworks:instruction_storage +- nodeworks:processing_storage +--- + +# Recipe Storage Blocks + +Storage Blocks are where you keep your filled out [Recipe Sets](./recipe_sets.md) +once they're read for the to use. Righ-click to +open, drop the Recipe Sets into the slots, and you're done. + +Each type of Recipe Set has its own Storage Block + +- **Instruction Storage:** holds Instruction Sets +- **Processing Storage:** holds Processing Sets + +## How they work + +Wire a Storage Block to a Node and every Recipe Set inside becomes visible to +the CPU. + + + + + A cluster of **connected** Processing Storage all get exported together since they're touching + + + +Storage Blocks can also be placed right next to each other to form a cluster. +You only need to wire **one** block in a cluster, the rest tag along through +the shared faces. Break the block that bridges two halves and the group +splits back into two, each figuring out on its own whether it's still +reachable. The block's emissive glow matches the network colour of whichever +network it belongs to, so at a glance you can tell which group goes where. + +## Clustering Recipe Storage Blocks + +If you have one Recipe Storage Blocks connected to a network, any adjacent Recipe Storage Blockss +will cluster together and also connect to the network. + +## Recipes + + + + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_card.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_card.md new file mode 100644 index 000000000000..43b49209e7ea --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_card.md @@ -0,0 +1,146 @@ +--- +navigation: + parent: items-blocks/index.md + icon: storage_card + title: Storage Card +categories: + - card +description: marks the adjacent block as part of network storage +item_ids: +- nodeworks:storage_card +--- + +# Storage Card + +A Storage Card marks the adjacent block as part of [Network Storage](../nodeworks-mechanics/network-storage.md). The +shared pool the network queries, routes into, and lists in the Inventory +Terminal. + + + +## 配置 + +When you right-click with a **Storage Card** you can set the priority, channel, +and filters. + +![](../assets/images/storage-card-gui.png) + +> **Tip:** Use a to copy the card's settings +> (optionally name and channel as well) which lets you bulk set Card settings +> using a template. +> +> You can also use [`network:route()`](../lua-api/network.md#route) to bulk set card +> settings without even touching them. + +## Target face + +You can pick which face of the adjacent block the card talks to. By +default the card uses the face the node is pointed at, which is usually +what you want. Override it for blocks with side-specific slots like +furnaces, where the top accepts input, the side accepts fuel, and the +bottom yields output. + +## Channel + +The Storage Card's GUI also has a channel picker. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how channels +scope which scripts, routing rules, and presets see this card. + +## Filters + +Each Storage Card can be configured to accept only specific items so a network +with multiple cards routes incoming items to the right place. A fresh card has +no filters and accepts everything. + +### Mode + +The **Mode** toggle in the Storage Card GUI flips the rule list between + +- **Allow**: only items matching at least one rule are accepted +- **Deny**: items matching at least one rule are rejected, everything else passes through + +With no rules in the list, Mode has no effect, but the **Stackability** and +**NBT** filters below still apply on top. A card only accepts everything when +all three filters are at their defaults (no rules, Any Stackability, Any NBT). + +### Rules + +Each rule is a single line of filter syntax, evaluated against the item trying to +enter the card: + +| Syntax | Matches | +| ----------------------- | ---------------------------------------------- | +| `minecraft:cobblestone` | exact item id | +| `#minecraft:logs` | every item in this tag | +| `minecraft:*` | every item from this mod / namespace | +| `/^.*_ore$/` | items whose id matches this regular expression | +| `*` | every item/fluid | + +You can add rules three different ways: + +1. Click **[+ Add Rule]** at the bottom of the list and type into the new row. +Autocomplete suggests item ids and tags as you type +2. Drag any item from JEI onto the rule list. The item's id becomes a new rule +3. From a Scripting Terminal, use [`network:route()`](../lua-api/network.md#route) +to set rules across many cards at once + +### Stackability and NBT + +Two extra toggles narrow what the card accepts beyond the rule list: + +- **Stackability**: cycles through **Any** / **Stackable Only** / **Non-stackable only**. +Useful for separating tools and armor from bulk resources without listing every item id +- **NBT**: cycles through **Any** / **Has data** / **No data**. +Items with NBT (damaged tools, named items, enchanted books) can be split from their +pristine versions. + +All three settings combine. An item only enters the card if it passes +Stackability, passes NBT, and matches the rule list. A card with +`Mode: Allow`, `Stackability: Stackable only`, `NBT: No data`, and rule +`#minecraft:swords` accepts nothing in practice. Swords aren't stackable, +so the Stackability check rejects everything before the rule list is even +consulted. Pick settings that make sense together. + +### Examples + +**Bulk cobblestone storage** + +> **Mode:** Allow +> +> **Stackability:** Any +> +> **NBT:** Any +> +> **Rules:** #c:cobblestone + +Accepts any cobblestone in the `#c:cobblestones` tag + +**Non-stackable only** + +> **Mode:** Allow +> +> **Stackability:** Non-stackable only +> +> **NBT:** Any +> +> **Rules:** *Empty* + +A storage card that just accepts any non-stackable items doesn't require any rules + +## Installation and scripting + +Installed the same way an is. Slot into a face of +a node that's touching the block. The scripting API is identical to an IO +Card (see [CardHandle](../lua-api/card-handle.md#inventory-cards) for the full set of methods) + +## The difference from IO + +'s blocks are script-controlled inventories. +Scripts must explicitly move items to/from them. A Storage Card puts its +block *into* the network's shared pool: `network:find` sees it, the + and list it, and crafting recipes pull ingredients from it +automatically. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_meter.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_meter.md new file mode 100644 index 000000000000..ad83c91a0cf7 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/storage_meter.md @@ -0,0 +1,69 @@ +--- +navigation: + parent: items-blocks/index.md + icon: storage_meter + title: Storage Meter +categories: + - device +description: tracks the amount of items/fluids its configured to watch +item_ids: +- nodeworks:storage_meter +--- + +# Storage Meter + +The Storage Meter watches an item in the network and emits a redstone +signal when its stock drops below your threshold. It can also start an autocraft +job to replenish the stock. + + + + + + + + + + + Has Autocraft enabled and replenishes the stock of doors in the network automatically + + + +## Using Storage Meters + +Right-click it with the item you want it to watch. Right-click again with +an empty hand to open the GUI and set the threshold and channel. + +It emits a redstone signal whenever the stock dips below the threshold. +With Autocraft on (the default), it'll also start a craft job to top up +the stock. Turn Autocraft off if you'd rather drive a + with the signal. + +The status label at the bottom of the GUI tells you what it's doing. Hover +it for details. + +## Subnet Example + + + + + Cooks to + + + + + + + + +This example shows a subnet with a Storage Meter watching a chest for iron ingots. When it's below it sends a redstone signal to another network's which triggers an autocrafting job using a . + +## Channel + +The Storage Meter uses a channel picker in its GUI to choose where the crafted item should go as well as the channel of the Network Storage being watched. + +> **Note:** See [Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for more info. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/user.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/user.md new file mode 100644 index 000000000000..3ef0ed619dd9 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/user.md @@ -0,0 +1,69 @@ +--- +navigation: + parent: items-blocks/index.md + icon: user + title: User +categories: + - device +description: right-clicks with an item on the block in front of it +item_ids: +- nodeworks:user +--- + +# User Block + +The User pulls an item from +[Network Storage](../nodeworks-mechanics/network-storage.md) and +right-clicks with it on whatever's in front of the block. Use it for +bone-mealing crops, brushing suspicious blocks, lighting tnt with flint +and steel, filling buckets, or anything else a player would normally do +by hand. + + + +## Placing + +The User's front face points at whatever you were aiming at when you +placed it down (same shape as a piston or dispenser). It targets the +first non-air block up to two positions in front of itself, so a User +above an empty space above a crop still reaches the crop. + +## Item filter + +The User's GUI has a slot for the item it should use. The matching item +is pulled from Network Storage when the User fires and returned once the +action finishes. Filter syntax is the same as the +, so bare ids, tags, and wildcards all +work. + +## Mode + +The User runs in one of two modes: + +- **Instant**: a single right-click per fire. Good for one-shot actions + like applying bone meal or flint and steel. +- **Hold**: keeps the right-click held down across ticks until released. + Good for tools that need to be held to do their thing, like a brush. A hold auto-releases after 30 seconds. + +## Redstone + +The GUI's redstone setting controls when the User is allowed to fire: + +- **High**: active while powered. +- **Low**: active while unpowered. +- **Ignored**: redstone does nothing. The User only fires when a script + calls into it. + +## Channel + +The User has a name and channel picker in its GUI. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how +channels scope which scripts can address this device. + +## Scripting + +See the [UserHandle](../lua-api/user-handle.md) page for the scripting api. + +## Recipe + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/variable.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/variable.md new file mode 100644 index 000000000000..063c42beccf8 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/items-blocks/variable.md @@ -0,0 +1,54 @@ +--- +navigation: + parent: items-blocks/index.md + icon: variable + title: Variable +categories: + - device +description: a shared network variable +item_ids: +- nodeworks:variable +--- + +# Variable Block + +A Variable block is a value that can be shared across an entire network. + + + +## Configuration + +After connecting a Variable to a network you can selects its **type** and give it +a **name**. Both are important for seeing your variable in a . + +![](../assets/images/variable_gui_count.png) + +In this case, a **number** variable with the name `count` + +When you open any on the same network you'll see it displayed +in the sidebar where you can reference it. + +![](../assets/images/variable_in_terminal.png) + +### Types + +- **number** + - a numeric value (integer or decimal) +- **string** + - any text up to 256 characters +- **bool** + - `true` or `false` + +## Channel + +The Variable's GUI also has a channel picker. See +[Choosing a Channel](../lua-api/channel.md#choosing-a-channel) for how channels +scope which scripts can address this variable. + +## Scripting + +See the [VariableHandle](../lua-api/variable-handle.md) page to see the scripting api. + +## Recipe + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/breaker-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/breaker-handle.md new file mode 100644 index 000000000000..f32ea2cac3c3 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/breaker-handle.md @@ -0,0 +1,158 @@ +--- +navigation: + parent: lua-api/index.md + title: Breaker Handle + icon: breaker +categories: + - api_types +description: a device used to break blocks in front of it +--- + +# BreakerHandle + +A `BreakerHandle` is a reference to a on the network, +returned by [`network:get(name)`](network.md#get). It starts a multi-tick break +of the block in front of the breaker and routes the drops back to the network +(or to a custom handler). + + + +The breaker mines at diamond-pickaxe tier and uses the wooden-pickaxe duration +formula, so harder blocks take noticeably longer to break than easier ones. +Only one break can be in progress at a time per breaker, calling `:mine()` +again while a break is running is a no-op. + +## Properties + +- **`.name`** + - the breaker's alias (same label shown in the terminal sidebar) + +## mine + +Starts a multi-tick break of the block at the breaker's facing position. +Returns a [BreakBuilder](./breaker-handle.md#breakbuilder) so the script can +chain `:connect(fn)` to redirect the drops. If no chain follows, the drops +flow into [Network Storage](../nodeworks-mechanics/network-storage.md) using +the standard [Storage Card](../items-blocks/storage_card.md) priority rules. + + +```lua +local breaker = network:get("quarry_1") +breaker:mine() -- drops go to network storage +``` + + +If the target is air, unbreakable, or above the breaker's tier, `:mine()` +returns a no-op builder so chained calls don't crash. + +## cancel + +Aborts the in-flight break, if any. Safe to call when idle. The block isn't +broken and no drops are produced. + + +```lua +local breaker = network:get("breaker_1") +breaker:mine() +if dangerous() then + breaker:cancel() -- stop before completion +end +``` + + +## block + +Returns the block id at the breaker's facing position, the same shape as +[`ObserverCard:block`](./card-handle.md#observer-card). Useful for gating a +break on the block's identity. + + +```lua +local breaker = network:get("breaker_1") +if breaker:block() == "minecraft:stone" then + breaker:mine() +end +``` + + +## state + +Returns a property table for the block at the breaker's facing position. Same +shape as [`ObserverCard:state`](./card-handle.md#observer-card), every +`BlockState` property the block has (growth `age`, `facing`, `lit`, +`waterlogged`, ...) becomes a field. + + +```lua +local breaker = network:get("crop_breaker") +local state = breaker:state() +if state.age == 7 then + breaker:mine() -- only break fully-grown crops +end +``` + + +## isMining + +Returns `true` while a break is in progress, `false` when idle. Use it to +avoid issuing a second `:mine()` mid-break (the second call is a no-op anyway, +but `:isMining()` lets the script branch cleanly). + + +```lua +local breaker = network:get("breaker_1") +if not breaker:isMining() then + breaker:mine() +end +``` + + +## progress + +Returns a fraction from `0` to `1` representing how far along the current +break is. `0` when idle. Useful for driving a progress display or pacing +follow-up actions. + + +```lua +local breaker = network:get("breaker_1") +print(string.format("%.0f%%", breaker:progress() * 100)) +``` + + +--- + +## BreakBuilder + +Returned by [`Breaker:mine()`](./breaker-handle.md#mine). Configures how the +drops route once the break completes. With no chain, drops flow to network +storage automatically. Chain `:connect(fn)` to redirect them to a script +handler instead. + +### connect + +Redirects the drops from this break to a callback. The handler receives one +[ItemsHandle](./items-handle.md)-shaped value per dropped stack, so a single +break of a multi-drop block (e.g. a fortune-affected ore) calls the handler +multiple times. + +The handler can read the drop's `.id`, `.name`, `.count`, and `.kind` to +decide what to do. Items the handler doesn't claim spill back into network +storage as the default routing. + + +```lua +local breaker = network:get("breaker_1") +local chest = network:get("ore_chest") +breaker:mine():connect(function(item: ItemsHandle) + if item.id == "minecraft:diamond" then + chest:insert(item) -- diamonds go to a dedicated chest + end + -- everything else falls through to network storage +end) +``` + + +> **Note:** The breaker's `:connect` handler runs on break completion, not on +> every tick. Errors inside the handler are swallowed so a bad callback can't +> jam the breaker. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/card-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/card-handle.md new file mode 100644 index 000000000000..f64190ae2372 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/card-handle.md @@ -0,0 +1,359 @@ +--- +navigation: + parent: lua-api/index.md + title: CardHandle + icon: blank_card +categories: + - api_types +description: reference to a single card in a network +--- + +# CardHandle + +A reference to a single card on the network. You get one from [`network:get(alias)`](network.md#get) +or from a [HandleList](handle-list.md) returned by [`network:getAll(type)`](network.md#getAll). + + + +--- + +## Properties + +- **`.name`** + - the card's alias (same label shown in the terminal sidebar) + +--- + +## Inventory Cards + +*Applies to IO Cards and Storage Cards.* Both expose the same Lua API, the +difference is in how the network treats the block they're attached to. See + and for the in-world +behavior. + +### face + +Narrow to a specific face of the adjacent block. Useful when the block +has a different inventory on each side (furnace inputs vs outputs, etc.). + +By default a card will choose the face it's facing. + + + + + `card:face("top")` + + + `card` + + + + +```lua +local card = network:get("io_1") +card:insert(coal) +card:face("top"):insert(inputItem) +``` + + +### slots + +Narrow the card's inventory to specific slots using their indices (index starts at 1) + + + + + + + + + + + +```lua +local card = network:get("io_1") +card:slots(2, 4):find("*") -- selects Stone and Diorite +``` + + +### find + +Scans the card's inventory for items/fluids matching the filter. Filter syntax is +identical to [`network:find`](network.md#find), the only difference is the scope +is this card's slots/tanks instead of very storage card on the network. + + +```lua +local coalInCard = card:find("minecraft:coal") +if coalInCard then + print(coalInCard.count, "coal in this card") +end +``` + + +### findEach + +Identical to [find](./card-handle.md#find) except this returns a list of [ItemsHandle](./items-handle.md)'s. +Each entry is unique by its Item ID and if it contains NBT Data. + +If you had diamond sword in your network, some with enchantments and some without +they would be separated into different entries + + + + + + + + + + + +```lua +local allItems = card:findEach("*") +for _, val in allItems do + print(val.name) +end +-- Cobblestone +-- Oak Planks +-- Stick +``` + + +### insert + +Moves items or fluids *into* this card's inventory. Either the full amount fits and +moves or nothing moves at all. You never end up with a partial transfer. +Returns `true` when the full amount landed, `false` if it wouldn't fit. +Mirrors [`network:insert`](network.md#insert) except it's scoped to this card. + + +```lua +local coal = network:find("minecraft:coal") +if coal and card:insert(coal, 32) then + print("stored 32 coal in this card") +end +``` + + +### tryInsert + +Like [`insert`](card-handle.md#insert) but moves whatever fits instead of +all-or-nothing. Returns the count that actually landed (0 up to the requested amount). +Anything that didn't fit stays in the source. Use this when a partial move is fine. + + +```lua +local coal = network:find("minecraft:coal") +if coal then + local moved = card:tryInsert(coal) + print("moved", moved, "of", coal.count, "coal") +end +``` + + +### count + +Returns the total quantity in this card's inventory +that matches the filter. (Fluids count in mB) + +The filtering is the exact same syntax as [find](network.md#find) + + +```lua +print(card:count("#minecraft:coals")) +``` + + +--- + +## Redstone Card + +*Applies to 's only.* The inventory methods above don't apply, a +redstone card's `card:find()` is nil. + +### powered + +Returns `true` if the incoming redstone signal is greater than 0. + + + + + + + + + +```lua +local card = network:get("redstone_1") +print(card:powered()) +-- true +``` + + +### strength + +Returns the incoming redstone signal strength from 0 to 15. + + + + + + + + + +```lua +local card = network:get("redstone_1") +print(card:strength()) +-- "14" +``` + + +### set + +Emits a redstone signal. Boolean maps to 15 or 0 just like a . Number is clamped to 0 to 15. + + + + + 15 strength + + + + + + + + +```lua +local card = network:get("redstone_1") +card:set(true) -- emit a signal of 15 strength like a lever +card:set(false) -- set emitted signal to 0 +``` + + +You can use a number to specify the strength of the signal emitted + + + + + 3 strength + + + + + + + + +```lua +local card = network:get("redstone_1") +card:set(3) +``` + + +### onChange + +Registers a callback fired whenever the incoming redstone signal strength changes. + + + + + + + + redstone clock/pulser + + + + +```lua +local card = network:get("redstone_1") +-- print "state changed" when redstone torch turns on and off +local lastPowered = card:powered() +card:onChange(function(strength: number) + local powered = strength > 0 + if lastPowered == powered then + return + end + lastPowered = powered + print("state changed") +end) +``` + + +> **Tip:** It's also recommended to turn on the ["Autorun"](../items-blocks/scripting_terminal.md#autorun) of the +> when using `:onChange` + +![](../assets/images/autorun.png) + +## Observer Card + +*Applies to 's only.* The inventory methods above +don't apply. An observer card's `card:find()` is nil. The card watches the block +in front of the installed face and exposes its id, properties, and a change event. + +### block + +Returns the block id at the watched position as a `"namespace:path"` string. + + +```lua +local watcher = network:get("watcher_1") +print(watcher:block()) +-- "nodeworks:celestine_cluster" +``` + + +If the watched chunk isn't loaded the call still returns the cached block (Minecraft +will load the chunk to read it). For high-volume scripts prefer `:onChange` over +polling `:block()` every tick. + +### state + +Returns the property table for the watched block. Keys are the block's +property names (`age`, `facing`, `waterlogged`, `lit`, `axis`, ...). Values +come back as numbers, booleans, or lowercase strings depending on the +property's type. Air and other propertyless blocks return an empty table. + + +```lua +local s = network:get("watcher_1"):state() +if s.age == 3 then + print("fully grown") +end +``` + + +Different blocks expose different properties, what `state()` returns depends +entirely on what the watched block is. Use `:block()` first if you need to +branch on which block you're inspecting. + +### onChange + +Registers a callback that fires whenever the watched block id or any state +property changes. Replaces any previous handler on the same card. The handler +receives the new block id and the new property table. + + +```lua +local watcher = network:get("watcher_1") +local breaker = network:get("breaker_1") + +watcher:onChange(function(block: string, state: { [string]: any }) + if block == "nodeworks:celestine_cluster" then + breaker:set(true) + scheduler:delay(2, function() breaker:set(false) end) + end +end) +``` + + +The first poll after registration seeds the "last seen" state silently, a +script that restarts won't fire a phantom event for a block that was already +in its final form before the script came up. + +> **Tip:** Like the redstone `:onChange`, this is the kind of callback you'll +> usually want autorunning. Turn on ["Autorun"](../items-blocks/scripting_terminal.md#autorun) +> on the so the handler keeps firing across logins. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/channel.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/channel.md new file mode 100644 index 000000000000..b35f77802a2a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/channel.md @@ -0,0 +1,84 @@ +--- +navigation: + parent: lua-api/index.md + title: Channel + icon: io_card +categories: + - api_types +description: a dye-color-scoped view of the network +--- + +# Channel + +A `Channel` is a dye-color-scoped view of the network. You get one from +[`network:channel(color)`](network.md#channel). Lookups through a Channel only +see cards, variables, and devices whose channel matches that color, the channel +is picked in each card or device's own GUI. Multiple subsystems can share one +network without their card aliases stepping on each other. + + +```lua +local red = network:channel("red") +local blue = network:channel("blue") +red:getAll("redstone"):set(true) -- only the red-channel pistons fire +blue:getAll("redstone"):set(true) -- only the blue-channel pistons fire +``` + + +The color name must be one of the 16 vanilla dye colors (`white`, `red`, +`blue`, `light_blue`, `light_gray`, …). An unknown color raises an error. + +## Choosing a Channel + +In all [Cards](../nodeworks-mechanics/cards.md) and [Devices](../nodeworks-mechanics/devices.md), there will be a way to pick a Channel. By default all +devices and Cards start on `white`. You can click to expand a list of colors to +pick one + +![](../assets/images/choose_channel.png) + +## get + +Alias lookup scoped to this channel. Returns a [CardHandle](card-handle.md), +[VariableHandle](variable-handle.md), Breaker, or Placer, the same name +namespace as [`network:get`](network.md#get). Errors when no member on the +channel matches the alias. + + +```lua +local red = network:channel("red") +local counter = red:get("counter") -- variable named "counter" on the red channel +local door = red:get("door") -- card named "door" on the red channel +``` + + +## getAll + +Returns a [HandleList](handle-list.md) of every member on this channel +matching the given type. Same type strings as +[`network:getAll`](network.md#getAll), `"io"`, `"storage"`, `"redstone"`, +`"observer"`, `"variable"`, `"breaker"`, `"placer"`. Pass nothing to get +every member on the channel regardless of type. + + +```lua +local red = network:channel("red") +red:getAll("observer"):onChange(function(block, state) + print("red-channel observer fired:", block) +end) +``` + + +## getFirst + +The first member on this channel of the given type, or `nil` when none match. +Useful when there's only ever one of something per channel and you don't want +to index into a HandleList. + + +```lua +local sensor = network:channel("blue"):getFirst("observer") +if sensor then + print(sensor.name, "is the blue-channel observer") +end +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/craft-builder.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/craft-builder.md new file mode 100644 index 000000000000..7fe5767d2930 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/craft-builder.md @@ -0,0 +1,120 @@ +--- +navigation: + parent: lua-api/index.md + title: CraftBuilder + icon: minecraft:crafting_table +categories: + - api_types +description: returned by [`network:craft`](network.md#craft) and configures how the craft result is delivered once it completes +--- + +# CraftBuilder + +A `CraftBuilder` is what [`network:craft`](network.md#craft) hands back. It +represents a craft the network has planned but not yet delivered. By default +the result lands in [Network Storage](../nodeworks-mechanics/network-storage.md) +when the craft finishes. If you want a callback instead, chain `:connect(fn)`. + +The craft might finish on the same tick (vanilla recipes pulled together out +of storage) or take many ticks (anything routed through a +[`network:handle`](network.md#handle) processing handler, or a multi-stage +crafting tree). Either way, the builder's API is the same. + +> **Note:** `network:craft` always returns a builder, even when the craft +> can't be planned (no recipe, missing ingredients, no Crafting CPU). The +> failure surfaces through `:connect`'s callback as `nil`. + +## Default: stores the result + +If you don't chain anything, the finished items are pushed into Network +Storage automatically using the normal [Storage Card](../items-blocks/storage_card.md) +priority and [`network:route`](network.md#route) rules. After that you can +query them through `network:find` like anything else in the pool. + + +```lua +-- fire-and-forget: craft 16 torches, they land in storage +network:craft("minecraft:torch", 16) +``` + + +## connect + +Hands the finished items off to a callback **instead** of auto-storing. +Calling `:connect` flips the builder out of the default behavior, the +runtime won't auto-store, the callback owns the result. + +The callback's argument is `ItemsHandle?`, an [ItemsHandle](items-handle.md) +on success or `nil` on failure. Always check before using. + + +```lua +local oven = network:get("oven") +network:craft("minecraft:bread", 4):connect(function(items: ItemsHandle?) + if not items then + print("bread craft failed") + return + end + oven:insert(items) -- finished bread goes straight into the oven +end) +``` + + +The callback fires once when the craft resolves. Failure modes that surface +as `nil`: + +- Plan failure: no recipe, missing ingredients, no Crafting CPU on the network. +- Async timeout: a processing handler never delivered the outputs. +- CPU offline: the Crafting CPU was broken or removed mid-craft. + +In every failure case the runtime also releases any partial CPU buffer back +into Network Storage so items aren't stranded. + +### You're responsible for moving the items + +The handle the callback receives is a **live reference to the items still +sitting in the Crafting CPU's buffer**. Calling `card:insert(items)` / +`network:insert(items)` drains them out of the buffer into the destination. + +Anything still in the buffer when the callback returns is **dropped at the +CPU's position** and a terminal error is logged. The contract is "you took +the handle, you're responsible for moving the items," failing to drain it +isn't silent. + + +```lua +local chest = network:get("ore_chest") +network:craft("minecraft:iron_ingot", 8):connect(function(items: ItemsHandle?) + if not items then return end + if not chest:insert(items) then + -- chest full: fall back to network storage instead of dropping + network:insert(items) + end +end) +``` + + +This is intentionally different from auto-store, which always routes through +the network's storage cards (and only drops in-world if every storage card +refuses). With `:connect`, the callback decides where the items go, and the +runtime trusts you to actually move them. + +> **Note:** Errors thrown inside the callback are logged to the terminal but +> don't take down the rest of your script. + +## When connect runs synchronously + +Vanilla recipes whose ingredients are already in storage finish on the same +tick. The callback still fires through the same path, just one tick later +than the `:craft` call so that `:connect` has a chance to register before +resolution. You don't need to special-case this, the API behaves identically +for sync and async crafts. + + +```lua +-- works the same whether the craft is instant or takes 30s of smelting +network:craft("minecraft:iron_ingot", 8):connect(function(items: ItemsHandle?) + if items then chest:insert(items) end +end) +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/handle-list.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/handle-list.md new file mode 100644 index 000000000000..0cf659725f56 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/handle-list.md @@ -0,0 +1,97 @@ +--- +navigation: + parent: lua-api/index.md + title: HandleList + icon: minecraft:red_bundle +categories: + - api_types +description: a fan-out list of cards or variables returned by getAll +--- + +# HandleList + +A `HandleList` is a list of cards or variables that **broadcasts write +methods across every member**. You get one from +[`network:getAll(type)`](network.md#getAll) or +[`Channel:getAll(type)`](network.md#channel-getall). + +Calling a write method on the list invokes that method on each member with +the same arguments, in order. Read methods aren't exposed on the list, their +return values are the whole point of calling them, and silently dropping +them across N members would be a footgun. To read per-member, call `:list()` +and iterate. + + +```lua +-- Toggle every red-channel piston on at once. +network:channel("red"):getAll("redstone"):set(true) +-- Register the same onChange handler on every observer in one line. +network:getAll("observer"):onChange(function(block, state) + if block == "nodeworks:celestine_cluster" then + -- ... + end +end) +``` + + +## Which methods broadcast + +Only **write methods** fan out across the list, ones whose call site doesn't +depend on the return value. Reads like `:powered()`, `:count()`, `:get()`, +`:block()` are intentionally absent so a return value isn't silently dropped +across N members. To read per-member, call `:list()` and inspect each member +individually. + +Each type's own page (e.g. [RedstoneCard](card-handle.md#redstone-card), +[VariableHandle](variable-handle.md)) is the source of truth for which of its +methods are reads versus writes. + +## list + +The escape hatch. Returns the underlying array so you can iterate per-member, +read individual values, or apply per-member logic that doesn't fit the +broadcast shape. + + +```lua +local pistons = network:channel("red"):getAll("redstone") +for _, p in pistons:list() do + if p:powered() then + print(p.name, "is currently powered") + end +end +``` + + +## count + +How many members the list has. Cheaper than `#list:list()` because it doesn't +build the array. + + +```lua +local watchers = network:getAll("observer") +print(watchers:count(), "observer cards on the network") +``` + + +## face + +Returns a new HandleList whose card members have their access face overridden +to `name`. The original list isn't modified, the override applies only to the +returned copy. Members that aren't [CardHandle](card-handle.md)'s (variables, +breakers, placers) pass through unchanged, those handle types ignore face. + +The override survives when the list is fed into a preset +([Importer](importer.md) / [Stocker](stocker.md)), so a wildcard fan-out can +read or write a non-default face on every matched card with one expression. + + +```lua +-- pull furnace outputs (bottom face) from every io_* card into the output chest +importer:from(network:cards("io_*"):face("bottom")):to("output"):start() +``` + + +Same shape as [`CardHandle:face`](card-handle.md#face), but applied across the +whole list at once. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/importer.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/importer.md new file mode 100644 index 000000000000..7a1f4e6f0c50 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/importer.md @@ -0,0 +1,174 @@ +--- +navigation: + parent: lua-api/index.md + title: Importer + icon: minecraft:hopper +categories: + - api_types + - api_preset +description: move items from A to B with a distribution strategy +--- + +# Importer + +The `importer` global builds movers that pull items from one or more sources +and deposit them into one or more targets. Every importer is a scheduled task +under the hood, so it keeps running at its configured interval until the +script stops or you call `:stop()` on the handle. + +## from + + +```lua +Importer:from(...sources: string | CardHandle | network): ImporterBuilder +``` + + +Starts an importer chain. Sources can be any mix of card aliases, CardHandle +objects, or the `network` global (meaning the whole Network Storage pool). +At least one source is required. + + +```lua +importer:from("farmChest") -- one named source +importer:from(network) -- network pool as source +importer:from("chestA", network, network:get("chestB")) -- mixed +``` + + +## to + + +```lua +ImporterBuilder:to(...targets: string | CardHandle | network): ImporterBuilder +``` + + +Sets the destinations. Same polymorphism as `:from`: card aliases, CardHandle +objects, or `network` for the pool. At least one target is required. + + +```lua +importer:from("farm"):to("storage1", "storage2"):start() +importer:from("mobFarm"):to(network):start() -- deposit into the pool +``` + + +## filter + + +```lua +ImporterBuilder:filter(pattern: string): ImporterBuilder +``` + + +Narrows the mover to items (or fluids) matching the filter. **Optional.** The +default is `*`, which moves every item. Use filter syntax from +[Network:find](network.md#find) including `$item:id`, `$fluid:id`, `#tag`, +`modname:*`, and regex. + + +```lua +-- Move only cobblestone +importer:from(network) + :filter("$item:minecraft:cobblestone") + :to("io_*") + :start() + +-- Move all c:ores items +importer:from("mobFarm"):filter("#c:ores"):to("storage"):start() +``` + + +## Distribution + +The importer has two ways of splitting items across targets. The default is +fill, you opt into round robin explicitly. + +### Fill (default) + +Fills the first target first. Once it's full, overflow goes to the next target, +and so on. Good when you have a priority order and want one chest to stay topped +up before any excess lands elsewhere. + + +```lua +importer:from("furnaceOutput") + :filter("$item:iron_ingot") + :to("mainChest", "overflow") + :start() +``` + + +### roundrobin + + +```lua +ImporterBuilder:roundrobin(step: number?): ImporterBuilder +``` + + +Distributes evenly across every target on every tick. `step` is the max items +delivered to each target per tick (default 1). With step=1, three items in +the source land as one in each of three targets in a single tick. For bulk +flow, raise the step or speed up the tick rate with `:every(1)`. + + +```lua +importer:from("bufferChest") + :to("furnace1", "furnace2", "furnace3") + :roundrobin() + :every(10) + :start() +``` + + +The round robin cursor rotates one position per tick so fairness holds even +when the source is running thin and only some targets get items that tick. + +## Wildcards in card aliases + +Both `:from` and `:to` accept `*` wildcards in card names. A single +`"io_*"` expands to every card whose alias matches the pattern at the +moment the importer resolves its snapshot, and re-expands any time the +network topology changes. + + +```lua +-- Fan out from one chest to every card named io_... +importer:from("input"):to("io_*"):roundrobin():start() + +-- Pull from a whole group of source chests into a single output +importer:from("farm_*"):to("storage"):start() +``` + + +## Example: two-stage smelter array + +Ores feed in round robin to three furnaces, outputs collect into a central +chest. + + +```lua +-- Feed ore evenly to three furnaces +importer:from("oreBuffer") + :filter("$item:iron_ore") + :to("furnace1", "furnace2", "furnace3") + :roundrobin() + :every(10) + :start() + +-- Collect ingots from all three into the output chest +importer:from("furnace1", "furnace2", "furnace3") + :filter("$item:iron_ingot") + :to("outputChest") + :start() +``` + + +## See also + +* [Shared preset methods](presets.md#shared-methods) (`:every`, `:start`, + `:stop`, `:isRunning`). +* [Stocker](stocker.md) for the "maintain a level" pattern. +* [Network:find](network.md#find) for filter syntax details. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/index.md new file mode 100644 index 000000000000..9fda297fbf8a --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/index.md @@ -0,0 +1,34 @@ +--- +navigation: + title: Nodeworks Scripting API + position: 40 +--- + +# Nodeworks Scripting API + + + +Nodeworks uses [Lua](https://www.lua.org/docs.html) as its scripting language, +with a few quality-of-life extensions the editor handles before the script runs: + +- **Type annotations:** ( `local x: CardHandle`, `function(xs: { CardHandle }): ItemsHandle`, etc. ) + - Tells the editor what a variable, parameter, or return value is. In return you get accurate hover tooltips, better autocompletion, and element-type inference inside for-loops + +## Built-ins + + + +- [clock()](): fractional seconds elapsed since the script started running +- [print(...)](): log to terminal output +- [require(name)](): load another script tab from the same terminal by name + +## Presets + +Declarative builders that wrap common scheduler loops in one-line chains. See +[Presets](presets.md) for the shared pattern. + + + +## Types + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/input-items.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/input-items.md new file mode 100644 index 000000000000..4975e7b36b43 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/input-items.md @@ -0,0 +1,67 @@ +--- +navigation: + parent: lua-api/index.md + title: InputItems + icon: minecraft:cobblestone +categories: + - api_types +description: the second argument passed to [network:handle callbacks](network.md#handle) a per-recipe bag of [`ItemsHandle`](items-handle.md) fields keyed by the recipe's input slot names +--- + +# InputItems + +`InputItems` is the second argument your [`network:handle`](network.md#handle) +function receives. The network has already pulled the recipe's ingredients +out of storage for you, they're waiting on this table, one field per input +slot. Your job is to pump those items into the actual machine. + +Each field is a full [ItemsHandle](items-handle.md), so you call `:insert`, +`:tryInsert`, `:count`, etc. on it just like any other handle. + +## Field names + +The field names are **camelCased from the input item ids**. So +`minecraft:raw_iron` becomes `items.rawIron`, `minecraft:copper_ingot` +becomes `items.copperIngot`. The script editor autocompletes the right names +for whichever recipe you're handling, no need to memorise them. + + +```lua +local furnace = network:get("furnace") +network:handle("...", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) -- minecraft:raw_iron + job:pull(furnace:face("bottom")) +end) +``` + + +### Duplicate ingredients + +If the recipe has the same ingredient in more than one slot, the second +occurrence gets a `2` suffix, the third gets `3`, and so on. So a recipe +that takes two copper ingots and one gold ingot exposes them as +`items.copperIngot`, `items.goldIngot`, `items.copperIngot2`. + + +```lua +local press = network:get("press") +network:handle("...", function(job: Job, items: InputItems) + press:face("top"):insert(items.copperIngot) + press:face("top"):insert(items.copperIngot2) + press:face("north"):insert(items.goldIngot) + job:pull(press:face("bottom")) +end) +``` + + +## You must use everything + +The handler is expected to move every input into the machine. If anything's +left in `items.` when the handler returns, the network treats the +craft as incomplete and retries the recipe later. There's no "skip this +input" mode, the recipe says it needs N copper ingots and N copper ingots +have to land somewhere. + +> **Note:** "Use it" means insert it somewhere reachable, network storage +> via `network:insert` counts. The check is just "did the script consume +> the items it was given?", not "did they end up in the right machine." diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/items-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/items-handle.md new file mode 100644 index 000000000000..0c253fa73640 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/items-handle.md @@ -0,0 +1,272 @@ +--- +navigation: + parent: lua-api/index.md + title: ItemsHandle + icon: minecraft:bundle +categories: + - api_types +description: a specific resource (items or fluid) with count, source, and transfer ops. +--- + +# ItemsHandle + +An `ItemsHandle` is a **single resource type with a count attached**. It's +the value most network and card methods hand back when you ask "what's in +storage?" and the value those same methods accept when you say "move this +somewhere." + +> **Note:** A handle is a **snapshot** taken when the call returned. The +> `.count` doesn't update as items move in or out of storage afterwards. +> If you need a fresh count, call `:find` again. + +--- + +## What a handle represents (and doesn't) + +A handle is an **aggregate of every matching resource at the queried +location**, not a single inventory stack. Two important consequences: + +**The same handle covers both items and fluids.** The `.kind` field tells +you which one you're looking at. Counts are stack units for items and +millibuckets (mB) for fluids. Covered in detail under [count](./items-handle.md#count) and +[kind](./items-handle.md#kind). + +**The count can exceed `maxStackSize`.** `network:find("minecraft:coal")` +might return a handle with `count = 192` even though a single inventory +slot only holds 64. The handle is "every coal anywhere in the network", +which can be spread across many slots, many storage cards, or many tanks. +The same is true for [card:find](card-handle.md#find), which aggregates +across the card's slots and tanks. + +If you need each distinct stack separately (e.g. an enchanted sword +versus an un-enchanted one of the same id), use +[`findEach`](network.md#findEach) instead. It splits by id **and** +NBT data so each unique combination becomes its own handle. + + +```lua +local allCoal = network:find("minecraft:coal") +print(allCoal.count) -- 192, total across the whole network + +for _, h in network:findEach("minecraft:diamond_sword") do + print(h.name, h.hasData) -- enchanted vs plain swords as separate entries +end +``` + + +--- + +## Properties + +### id + +The resource id of what this handle points at. Same shape for both kinds: +`"minecraft:diamond"` for an item, `"minecraft:water"` for a fluid. + + +```lua +local coal = network:find("minecraft:coal") +print(coal.id) -- "minecraft:coal" +``` + + +### name + +The display name as the player sees it in tooltips. Translated, formatted, +and respects custom names (anvil-renamed items show the renamed string). + + +```lua +local sword = network:find("minecraft:diamond_sword") +print(sword.name) -- "Diamond Sword" (or "Excalibur" if renamed) +``` + + +### count + +How much of the resource the handle represents. **Items are in stack units** +(individual items, not stacks of 64). **Fluids are in mB** (millibuckets, +1000 mB = 1 bucket). + + +```lua +local coal = network:find("minecraft:coal") +print(coal.count) -- 192 (192 individual coal pieces) +-- or for fluids +local water = network:find("minecraft:water") +print(water.count) -- 4000 (4 buckets in mB) +``` + + +### kind + +`"item"` or `"fluid"`. Branch on this when a script handles both. + + +```lua +for _, h in network:findEach("*") do + if h.kind == "fluid" then + print(h.count, "mB of", h.name) + else + print(h.count, "x", h.name) + end +end +``` + + +### stackable + +`true` for items with a max stack size greater than 1 (cobblestone, +ingots, planks, ...), `false` for tools, armour, and anything unique +(potions with custom NBT, written books). Fluids are always `false` here, +they're tracked by volume not stacks. + + +```lua +for _, item in inputChest:findEach("*") do + if not item.stackable then + nonStackables:insert(item) + else + network:insert(item) + end +end +``` + + +Example of moving non-stacking items in another chest outside of your network + +### maxStackSize + +The largest stack the resource can occupy in a single inventory slot. +`64` for most items, `16` for snowballs and ender pearls, `1` for tools +and armour. Fluids report `1`, not meaningful. + + +```lua +local coal = network:find("minecraft:coal") +print(coal.maxStackSize) -- 64 +``` + + +### hasData + +`true` if the stack carries non-default NBT, enchantments, custom names, +written-book content, dyed armour, suspicious-stew effects, etc. Useful for +sorting "interesting" items away from plain bulk. + + +```lua +for _, item in inputChest:findEach("*") do + if item.hasData then + enchantedItems:insert(item) + else + network:insert(item) + end +end +``` + + +--- + +## Methods + +### hasTag + +Returns `true` if the resource is a member of the given tag. Accepts the tag +id with or without the leading `#`, both `"minecraft:logs"` and +`"#minecraft:logs"` work. + + +```lua +for _, h in network:findEach("*") do + if h:hasTag("minecraft:logs") then + print(h.name, "is a log type") + end +end +``` + + +Tag membership is the same set Minecraft uses for crafting recipes and +biome decisions, so anything that works in a vanilla "any log" recipe will +match here. + +### matches + +Returns `true` if the resource matches the given filter, using the same +filter syntax as [`network:find`](network.md#find). Useful for routing +predicates and per-item branching without needing a full `:find` round-trip. + + +```lua +function smelt(item: ItemsHandle) + if item:matches("/_ore$/") then + machine:insert(item) + return + end + furnace:insert(item) +end +``` + + +--- + +## Passing a handle into transfer methods + +A handle isn't just a read-only value, it's also the **source for moving +those items**. Most transfer methods take a handle as their argument and +move from wherever it came from into the new destination. + + +```lua +local coal = network:find("minecraft:coal") +if coal then + -- move all of it into the chest + chest:insert(coal) +end +``` + + +The methods that consume a handle this way: + +- [`card:insert`](card-handle.md#insert) / [`card:tryInsert`](card-handle.md#tryinsert), into the card's adjacent inventory +- [`network:insert`](network.md#insert) / [`network:tryInsert`](network.md#tryinsert), into network storage with routing rules +- [`placer:place`](placer-handle.md#place), uses the handle's `.id` to pick what to place + +The handle's `.count` is the maximum these methods will move. Pass an +optional second argument to cap the move at fewer, useful for small +destinations like a furnace's fuel slot: + + +```lua +local coal = network:find("minecraft:coal") +furnace:insert(coal, 8) -- top up the fuel slot with 8 coal +``` + + +> **Note:** `:insert` is all-or-nothing. If the destination can't fit the +> full amount you're trying to move, nothing moves and the call returns +> `false`. Use `:tryInsert` when a partial transfer is fine, or pass the +> second-arg cap so the move stays within the destination's capacity. + +--- + +## nil when nothing matches + +`:find` and `findEach`'s entries return `nil` when the filter has no match. +A handle with `count = 0` doesn't exist, the absence of a result is +expressed by absence. Always check before chaining: + + +```lua +local coal = network:find("minecraft:coal") +if coal then + print(coal.count, "coal available") +else + print("no coal in storage") +end +``` + + +The editor's type system tracks this, hovering `coal` shows +`ItemsHandle?` (the `?` is the "or nil" marker) so it'll prompt you when +you forget the check. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/job.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/job.md new file mode 100644 index 000000000000..63af2cda696f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/job.md @@ -0,0 +1,78 @@ +--- +navigation: + parent: lua-api/index.md + title: Job + icon: minecraft:paper +categories: + - api_types +description: the first argument passed to a [network:handle callback](network.md#handle) and represents the in-flight processing job the handler is responsible for producing outputs for +--- + +# Job + +A `Job` is the first argument your [`network:handle`](network.md#handle) +function receives. Each time the network needs to run a recipe on your +Processing Set, it calls your handler with a fresh `Job` and the +[items](input-items.md) it pulled from storage. Your handler puts those items +into the machine, then calls `job:pull(card)` to tell the network where the +finished items will come out. + +## pull + +Tells the network where the finished items will come out. Pass one or more +[CardHandle](card-handle.md)s and the network watches them until the full +output count has been collected. + +If the outputs are already sitting in one of the cards (instant recipes, +shapeless crafts), the craft finishes on the same tick. Otherwise the network +keeps checking each tick and grabs whatever's in the card so far, so a +furnace that drips out one ingot at a time still works fine. + + +```lua +local furnace = network:get("furnace") +network:handle("...", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) + -- pull from the bottom face once the smelt completes + job:pull(furnace:face("bottom")) +end) +``` + + +### Multiple source cards + +Pass more than one card if the finished items could land in any of several +places. The network checks each card in order and grabs from whichever has +the items. Useful when you have downstream pipes or hoppers that route the +output into different chests depending on the item. + + +```lua +local furnace = network:get("furnace") +local outboxA = network:get("outbox_a") +local outboxB = network:get("outbox_b") +network:handle("...", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) + -- finished ingots get sorted into one of two chests, pull from either + job:pull(outboxA, outboxB) +end) +``` + + +### Put items in first + +`:pull` only handles the output side. You still have to insert the +[InputItems](input-items.md) into the machine yourself. If anything's left +in `items.` when your handler returns, the craft is considered +incomplete and the network will try the recipe again. + +### Timeout + +If the outputs never show up, the craft eventually times out and the inputs +are returned to storage. Each Processing Set has its own timeout (in ticks) +that you can tune in its GUI, defaults to 15 seconds. Bump it up for slow +machines like large smelting batches or modded multi-second recipes. + +> **Note:** An error inside your handler stops *that one craft* but doesn't +> take down the rest of your script. If a craft hangs unexpectedly, check the +> terminal log, the error will be there. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/network.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/network.md new file mode 100644 index 000000000000..159920771536 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/network.md @@ -0,0 +1,399 @@ +--- +navigation: + parent: lua-api/index.md + title: Network + icon: node +categories: + - api_builtin +description: query storage, route items, open craft jobs, register handlers +--- + +# Network + +The `network` module is the entry point into the live Nodeworks network the is +attached to. It queries storage, routes items between handles, and registers callbacks. + +## get + +Returns a reference to anything on the network addressed by name, any +, , , +, or , typically used at +the top of the script. Cards take priority on a name collision with a variable. + +You can click on the sidebar of the scripting terminal to auto-get them as well. + +![about to click item](../assets/images/click-to-add-card-01.png) ![after clicking item](../assets/images/click-to-add-card-02.png) + + + + + Renamed to **"chest"** + + + Renamed to **"furnace"** + + + + +```lua +local chest = network:get("chest") -- gets the Storage Card +local furnace = network:get("furnace") -- gets the IO Card +local count = network:get("count") -- gets a Variable named "count" +``` + + +--- + +## getAll + +Returns a [HandleList](handle-list.md) of every card or variable matching the +given type. The HandleList broadcasts write methods (`:set`, `:onChange`, …) +across every member, so toggling many pistons or registering a handler on +many observers takes one line. To iterate per-member, call `:list()`. + + + + + + + + + + + + +```lua +-- Broadcast: turn every redstone card on at once +network:getAll("redstone"):set(true) +-- Iterate per-member when you need the value of a read method +local storages = network:getAll("storage") +for _, storage in storages:list() do + print(storage.name) +end +-- "storage_0" +-- "storage_1" +``` + + +--- + +## cards + +Returns a [HandleList](handle-list.md) of the matching globbed card names. Useful +for when you want to interact with multiple cards at the same time with the same +naming convention. + + +```lua +local allPistonCards = network:cards("piston_*") +allPistonCards:set(true) -- turn on all pistons +``` + + +--- + +## channel + +Scopes lookups to a single dye-color channel. Returns a [`Channel`](./channel.md) handle whose +`:get`, `:getAll`, and `:getFirst` only see cards, variables, and devices set to +that color, the same channel filter applies. Errors on unknown color names. + + +```lua +local red = network:channel("red") +red:getAll("redstone"):set(true) -- only the red-channel pistons +local count = red:get("counter") -- variable on the red channel +``` + + +--- + +## channels + +Returns a list of every dye-color channel currently in use on the network, +any color that has at least one card, variable, breaker, or placer assigned +to it. Order is by `DyeColor` id ascending, so iteration is stable. Useful +for discovering channels at runtime instead of hard-coding the list. + +> **Note:** `white` is the default channel for new members, so it shows up +> here in almost any non-empty network. + + +```lua +for _, color in network:channels() do + print(color, "is in use") +end +-- "white" is in use +-- "red" is in use +-- "blue" is in use +``` + + +A common pattern: drive the same handler over every active channel without +caring which colors the player chose. + + +```lua +for _, color in network:channels() do + network:channel(color):getAll("redstone"):set(false) +end +``` + + +--- + +## find + +Scans all [Network Storage](../nodeworks-mechanics/network-storage.md) for +items/fluids matching the filter. Returns an aggregated handle *(count summed across storage)* +or `nil` if nothing matches. + + +```lua +local all = network:find("*") -- gets all items and fluids if any +local allItems = network:find("$item:*") -- only items +local allFluids = network:find("$fluid:*") -- only fluids +local allCoal = network:find("minecraft:coal") -- item id +local allLogs = network:find("#minecraft:logs") -- tags +local allRaw = network:find("/^Raw.*/") -- regular expressions +``` + + +When using items from `:find` you should check to see if you have any first + + +```lua +local allCoal = network:find("minecraft:coal") +if allCoal then + print("we have coal") +end +``` + + +--- + +## findEach + +Like [find](./network.md#find), scan all [Network Storage](../nodeworks-mechanics/network-storage.md) +for matching items/fluids matching the filter. But instead returns a list of [ItemsHandle](./items-handle.md)'s. +Each entry is unique by its Item ID and if it contains NBT Data. + + +```lua +for _, items in network:findEach("$item:*") do + print(items.id, items.count, items.kind) +end +``` + + +If you had diamond sword in your network, some with enchantments and some without +they would be separated into different entries + + +```lua +for _, items in network:findEach("minecraft:diamond_sword") do + print(items.id, items.hasData) +end +-- "minecraft:diamond_sword" true +-- "minecraft:diamond_sword" false +``` + + +--- + +## count + +Returns the total quantity in [Network Storage](../nodeworks-mechanics/network-storage.md) +that matches the filter. (Fluids count in mB) + +The filtering is the exact same syntax as [find](network.md#find) + + +```lua +print("swords:", network:count("minecraft:diamond_sword")) +print("cobblestone:", network:count("minecraft:cobblestone")) +print("all:", network:count("*")) +-- "swords:" 3 +-- "cobblestone:" 256 +-- "all:" 259 +``` + + +--- + +## insert + +Inserts an [ItemsHandle](items-handle.md) into [Network Storage](../nodeworks-mechanics/network-storage.md) using the standard + priority rules. Every single item has to fit otherwise +none are moved and the function returns `false`. If you want a best-effort insert then +use [tryInsert](./network.md#tryinsert) + + +```lua +local ok = network:insert(items) +if ok then + print("all items were moved") +else + print("no items were moved, not enough space") +end +``` + + +--- + +## tryInsert + +Like [`insert`](network.md#insert) but moves whatever fits instead of +all-or-nothing. Returns the count that actually landed (0 up to the requested amount). +Anything that didn't fit stays in the source. Use this when a partial move is fine. + + +```lua +local moved = network:tryInsert(items) +print(moved .. " items were moved") -- can be 0 to items.count +``` + + +--- + +## craft + +(also see [Auto-Crafting](../nodeworks-mechanics/autocrafting.md)) + +Queues a craft for the given item. Returns a [CraftBuilder](./craft-builder.md). +By default the finished items are auto-stored into +[Network Storage](../nodeworks-mechanics/network-storage.md) once the craft +completes, no chain needed: + + +```lua +-- fire-and-forget: bread lands in storage when ready +network:craft("minecraft:bread", 4) +``` + + +Chain `:connect(fn)` to receive the result yourself. The callback gets an +[ItemsHandle?](items-handle.md), non-nil on success, `nil` on failure (plan +failed, async timeout, no CPU). Calling `:connect` overrides the auto-store. + + +```lua +local furnace = network:get("furnace") +network:craft("minecraft:charcoal"):connect(function(item: ItemsHandle?) + if item then + furnace:insert(item) + end +end) +``` + + +--- + +## shapeless + +Instantly crafts a shapeless recipe with ingredients from [Network Storage](../nodeworks-mechanics/network-storage.md). +If the recipe is invalid or ingredients are missing then nothing is crafted and +the function returns `nil`. + + +```lua +-- craft a flint and steel, output automatically goes into network storage. +network:shapeless("minecraft:flint", 1, "minecraft:iron_ingot", 1) +``` + + +--- + +## handle + +(also see [Auto-Crafting](../nodeworks-mechanics/autocrafting.md)) + +Registers a processing handler for an in-network . +The handler is invoked with inputs and must use the passed [Job](job.md) to `pull` +outputs. All items given from the [InputItems](input-items.md) **must** be taken +by the handler. + + + + + Renamed to **"furnace"** + + + + + **➜** + + + + + + +```lua +local furnace = network:get("furnace") +-- handler for raw iron -> iron ingot +network:handle("…", function(job: Job, items: InputItems) + furnace:face("top"):insert(items.rawIron) + job:pull(furnace:face("bottom")) +end) +``` + + +--- + +## route + +Bulk-edits the [filter settings](../items-blocks/storage_card.md#filters) of every + whose name matches a pattern. Returns a builder +whose methods chain so the whole rule set for a row of cards can be written +in one call. Each method mutates the matching cards immediately, the same as +right-clicking each card and editing its GUI by hand. + +The pattern is a name with `*` as a wildcard. `cobblestone_*` matches `cobblestone_0`, +`cobblestone_1`, etc. `*` alone matches every Storage Card on the network. + + +```lua +network:route("cobblestone_*") + :reset() + :rule("#c:cobblestones") + :noNbt() + :allow() +``` + + +### Builder methods + +| Method | Effect | +| ------------------------------------------------------ | ------------------------------------------------- | +| `:rule(filter)` | Appends a rule (same syntax as the GUI rule list) | +| `:clearRules()` | Drops every rule, leaves modes alone | +| `:allow()` / `:deny()` | Sets the rule-list mode | +| `:stackable()` / `:nonStackable()` / `:anyStackable()` | Sets the Stackability filter | +| `:hasNbt()` / `:noNbt()` / `:anyNbt()` | Sets the NBT filter | +| `:reset()` | Clears rules, sets Allow + Any + Any | + +Calls return the same builder so they chain. Mutations are immediate and +persist across save/load. + +--- + +## debug + +Prints a summary of the network topology + + +```lua +network:debug() +-- === Network Debug === +-- Controller: BlockPos{x=-25, y=70, z=10} +-- Nodes: 1 +-- Node BlockPos{x=-25, y=70, z=9}: 1 cards +-- NORTH: cobblestone_storage (storage) +-- Terminals: 1 +-- BlockPos{x=-26, y=70, z=9} +-- CPUs: 0 +-- Crafters (Instruction Sets): 0 +-- Processing APIs: 0 +-- Variables: 0 +``` + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/placer-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/placer-handle.md new file mode 100644 index 000000000000..1eafb4d22675 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/placer-handle.md @@ -0,0 +1,91 @@ +--- +navigation: + parent: lua-api/index.md + title: PlacerHandle + icon: placer +categories: + - api_types +description: a device to place blocks in front of it +--- + +# PlacerHandle + +A `PlacerHandle` is a reference to a on the network, +returned by [`network:get(name)`](network.md#get). It pulls one of a chosen +item from [Network Storage](../nodeworks-mechanics/network-storage.md) and +places it as a block at the placer's facing position. + + + +`:place(...)` is synchronous, it returns `true` / `false` in the same tick the +script called it. No multi-tick progress, no builder, no callback. Only items +that are `BlockItem`s (have a placeable block form) succeed, the call fails +fast on tools, food, or anything non-placeable. + +## Properties + +- **`.name`** + - the placer's alias (same label shown in the terminal sidebar) + +## place + +Pulls one of the chosen item from network storage and places it at the +placer's facing position. Returns `true` on success. + +The argument can be either an item id string or an [ItemsHandle](./items-handle.md). +With a handle, the placer reads `.id` and pulls one of *that* item from the +network pool the same way it would for the bare-string form. The handle's own +source isn't drained, the network's storage cards are. + + +```lua +local placer = network:get("placer_1") +placer:place("minecraft:cobblestone") +``` + + +Returns `false` (and places nothing) when: +- the network has no matching item available +- the target position is non-air +- the item isn't a placeable block (e.g. `minecraft:diamond`, `minecraft:stick`) + + +```lua +local placer = network:get("bridge_builder") +local ok = placer:place("minecraft:oak_planks") +if not ok then + print("nothing placed, no planks in storage or target blocked") +end +``` + + +## block + +Returns the block id at the placer's facing position, the same shape as +[`ObserverCard:block`](./card-handle.md#observer-card). Useful for "is the +slot still empty / is it the block I expect" checks before calling `:place`. + + +```lua +local placer = network:get("placer_1") +if placer:block() == "minecraft:air" then + placer:place("minecraft:torch") +end +``` + + +## isBlocked + +Returns `true` if the target position can't be replaced (non-air and not a +replaceable block like grass or snow), `false` if a place would land. Cheaper +than calling `:place` and checking the return value when you only want to +know whether the slot is free. + + +```lua +local placer = network:get("placer_1") +if not placer:isBlocked() then + placer:place("minecraft:cobblestone") +end +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/presets.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/presets.md new file mode 100644 index 000000000000..b33b7d19556f --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/presets.md @@ -0,0 +1,114 @@ +--- +navigation: + parent: lua-api/index.md + title: Presets + icon: terminal +categories: + - api_builtin +description: declarative builders (importer, stocker) for common item movement and stocking patterns +--- + +# Presets + +Presets are declarative builders for the two scripting patterns that show up most +often: **moving items from A to B** and **keeping a stock level topped up**. Each +preset is a chain of method calls that reads left to right like a sentence, and +ends in `:start()` to start it. + +Presets sit on top of the existing scripting API. They're still Lua, still use +cards and filters the same way, and they're still torn down when the script +stops. The difference is one line of preset replaces roughly 15 lines of a +scheduler loop with manual state tracking. + + +```lua +-- move cobblestone from a farm chest into Network Storage, once per second. +importer:from("mobFarm"):filter("$item:cobblestone"):to(network):start() +-- keep 64 arrows stocked in a dispenser, crafting more when short. +stocker:ensure("minecraft:arrow"):to("dispenser"):keep(64):start() +``` + + +## Current Presets + +* [Importer](importer.md) moves items from one or more sources to one or more + targets. Default is fill (exhaust each target before moving on). Call + `:roundrobin()` to cycle through targets instead. +* [Stocker](stocker.md) maintains a target's stock at a `:keep(n)` watermark by + pulling from storage, crafting, or both. Never extracts once the level is + reached. + +## Source and target references + +Everywhere a preset takes a source or target, it accepts three shapes: + +1. A **string** card alias: `"bufferChest"`. +2. A **CardHandle** from `network:get(...)`. +3. The **`network`** global itself, meaning "the whole Network Storage pool." + + +```lua +-- All three forms are valid and can be mixed. +importer:from("farm", network:get("secondary"), network) + :to("output") + :start() +``` + + +Card resolution happens by name every time the network topology changes, so a +card that gets broken and replaced under the same name keeps working without +restarting the preset. Missing cards are skipped silently until they return. + +## Shared methods + +Every `ImporterBuilder` and `StockerBuilder` understands the same lifecycle and +control methods. + +### every + + +```lua +ImporterBuilder:every(ticks: number): ImporterBuilder +StockerBuilder:every(ticks: number): StockerBuilder +``` + + +Sets how often the preset re-evaluates. Default is 20 ticks (once per second). +Changing the rate mid-run cancels the current scheduler task and re-registers +at the new interval, so `imp:every(5)` takes effect immediately. + +### start / stop / isRunning + + +```lua +ImporterBuilder:start() +ImporterBuilder:stop() +ImporterBuilder:isRunning(): boolean +``` + + +`:start()` validates the chain and begins ticking. It's a no op if the builder +is already running, so calling it repeatedly is safe. `:stop()` stops ticking +but keeps all configuration, so a later `:start()` resumes the same chain +including any round robin cursor position. + + +```lua +local imp = importer:from("src"):to("dst") +scheduler:second(function() + if someCondition() and not imp:isRunning() then + imp:start() + elseif imp:isRunning() and not someCondition() then + imp:stop() + end +end) +``` + + +## Cleanup on script stop + +When the Scripting Terminal stops (manually or from a network disconnect), +every preset registered during that script's lifetime is stopped automatically. +Dangling builders that were created but never `:start()` are also cleaned up. +Starting the script again rebuilds every preset from scratch, so you can +freely edit chain code between runs without worrying about leftover tasks. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/scheduler.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/scheduler.md new file mode 100644 index 000000000000..7bb91fc215d2 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/scheduler.md @@ -0,0 +1,72 @@ +--- +navigation: + parent: lua-api/index.md + title: Scheduler + icon: minecraft:repeater +categories: + - api_builtin +description: tick/second/delay callbacks +--- + +# Scheduler + +The `scheduler` module registers periodic and delayed callbacks that run on +the server tick (20 TPS). Every registration returns a task id you can pass +to `:cancel` to stop it. + +> **Tip:** It's also recommended to turn on the ["Autorun"](../items-blocks/scripting_terminal.md#autorun) of the if you want this to always run [`scheduler:tick`](scheduler.md#tick) or [`scheduler:second`](scheduler.md#second) + +![](../assets/images/autorun.png) + +## tick + +Runs a provided callback every server tick + + +```lua +scheduler:tick(function() + -- runs 20 times/second +end) +``` + + +## second + +Runs a provided callback every second (20 ticks) + + +```lua +scheduler:second(function() + -- runs once per second +end) +``` + + +## delay + +Delays a callback function by the provided number of ticks. + + +```lua +scheduler:delay(20, function() + -- runs after one second has passed +end) +``` + + +## cancel + +Stops a given task's ID. This is safe to call on already-cancelled or expired IDs. + + +```lua +local task = scheduler:tick(function() + print("hello") +end) +-- cancel the scheduler:tick task after one second +scheduler:delay(20, function() + scheduler:cancel(task) +end) +-- "hello" (x20) +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/stocker.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/stocker.md new file mode 100644 index 000000000000..8fdeb3aff6e4 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/stocker.md @@ -0,0 +1,181 @@ +--- +navigation: + parent: lua-api/index.md + title: Stocker + icon: minecraft:observer +categories: + - api_types + - api_preset +description: keep a target topped up by pulling, crafting, or both +--- + +# Stocker + +The `stocker` global builds level maintainers. You set a target container, a +`:keep(n)` watermark, and a source (pull, craft, or both), and the stocker +tops the target up whenever it dips below the watermark. It never extracts +once the watermark is reached, if the player dumps extras in, they stay. + +## Three source modes + +A stocker chain starts with one of three factory methods, depending on where +you want items to come from. + +### from + + +```lua +Stocker:from(...sources: string | CardHandle | network): StockerBuilder +``` + + +Pull from specific cards or the network pool. Never crafts if short. Good for +"pull from this specific buffer chest" or "pull from the pool, wait if empty." +Pair with [`:filter`](./stocker.md#filter) to match only a specific item type, without a +filter the stocker tops up the target to `:keep(n)` worth of any items. + + +```lua +-- Pull arrows from two specific chests +stocker:from("chest1", "chest2"):filter("$item:arrow"):to("dispenser"):keep(64):start() + +-- Pull from the network pool, wait if the pool runs dry +stocker:from(network):filter("$item:arrow"):to("dispenser"):keep(64):start() +``` + + +### ensure + + +```lua +Stocker:ensure(itemId: string): StockerBuilder +``` + + +Pull from the network pool first, craft the rest if the pool is short. The +most common form, covers the "always have N of this" pattern. Takes an exact +item id because crafting needs a concrete output to plan against. + + +```lua +stocker:ensure("minecraft:arrow"):to("dispenser"):keep(64):start() +stocker:ensure("minecraft:iron_ingot"):to(network):keep(256):start() +``` + + +### craft + + +```lua +Stocker:craft(itemId: string): StockerBuilder +``` + + +Always craft to maintain the level. Never pulls from existing storage. Useful +when you want to guarantee fresh output or when an ingredient is scarce and +you'd rather top up by crafting than by pulling from a shared chest. + + +```lua +stocker:craft("minecraft:bread"):to("foodChest"):keep(16):start() +``` + + +## Required methods + +### to + + +```lua +StockerBuilder:to(target: string | CardHandle | network): StockerBuilder +``` + + +Sets the destination. Accepts a card alias, CardHandle object, or `network` +for "keep the level in the pool itself." The stocker counts matching items in +the target, when you use `network`, it counts across every storage card. + +### keep + + +```lua +StockerBuilder:keep(amount: number): StockerBuilder +``` + + +Target stock level. The stocker tops up to this count and stops. If the +current count ever exceeds this (player dumped extras in, another script +inserted, etc.), the stocker does nothing. It only ever fills, never drains. + +## Optional methods + +### filter + + +```lua +StockerBuilder:filter(pattern: string): StockerBuilder +``` + + +Narrows what the stocker counts toward `:keep(n)` in the target. Defaults to +`*` (any item). Set it when you want the stocker to only care about a specific +type of item pulled from a heterogeneous source. **`:ensure` and `:craft` set +this automatically** to their item id, so you only need `:filter` with +`:from`. + + +```lua +stocker:from("buffer") + :filter("$item:arrow") + :to("dispenser") + :keep(64) + :start() +``` + + +### batch + + +```lua +StockerBuilder:batch(size: number): StockerBuilder +``` + + +Coalesces craft requests into this batch size. Default 0 means "craft exactly +what's missing" (so a shortfall of 3 crafts 3, even if the recipe is cheap). +Setting `:batch(64)` makes the stocker craft 64 at a time, which is useful +for recipes with large setup cost (multi-input, multi-step) where many tiny +crafts would thrash the CPU. + + +```lua +stocker:craft("minecraft:iron_ingot"):to("chest"):keep(64):batch(32):start() +-- Shortfall of 10 crafts a full 32, target may temporarily hold 74 after delivery. +``` + + +The target can temporarily exceed `:keep(n)` by the batch leftover, subsequent +ticks do nothing until the stock drops below the watermark again. + +## Example: arrow dispenser with fallback crafting + + +```lua +stocker:ensure("minecraft:arrow") + :to("trapDispenser") + :keep(64) + :batch(16) + :every(20) + :start() +``` + + +Every second: if the dispenser has fewer than 64 arrows, pull from the pool +first, if still short, craft 16 more. Repeats until the dispenser is full. + +## See also + +* [Shared preset methods](presets.md#shared-methods) (`:every`, `:start`, + `:stop`, `:isRunning`). +* [Importer](importer.md) for continuous A-to-B movement without a level goal. +* [Network:craft](network.md#craft) for the underlying craft primitive. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/user-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/user-handle.md new file mode 100644 index 000000000000..61476e6f7536 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/user-handle.md @@ -0,0 +1,143 @@ +--- +navigation: + parent: lua-api/index.md + title: UserHandle + icon: user +categories: + - api_types +description: a device that right-clicks with an item in front of it +--- + +# UserHandle + +A `UserHandle` is a reference to a on the network, +returned by [`network:get(name)`](network.md#get). It pulls one item from +[Network Storage](../nodeworks-mechanics/network-storage.md) and +right-clicks with it on whatever's in front of the block. + + + +The User has two modes. **Instant** fires a single right-click per +`:use()` call. **Hold** keeps the right-click held down across multiple +ticks until `:stop()` runs (or the held item finishes its action, or the +30-second timeout elapses). Filters use the same syntax as + rules. + +## Properties + +- **`.name`** + - the user's alias (same label shown in the terminal sidebar) +- **`.kind`** + - always `"user"` + +## use + +Fires the User. In **instant** mode it right-clicks once and returns +whether the action landed. In **hold** mode it starts a hold and returns +whether the hold entered the held state. + +Returns `false` (without firing) when the User is already using, on +cooldown, blocked by its filter, has nothing matching in storage, or +has no controller on the network. + + +```lua +local farmer = network:get("crop_farmer") +farmer:use() +``` + + +To restart a hold cleanly, call `:stop()` first. + +## stop + +Cancels a pending instant fire or releases an in-progress hold. Safe to +call when idle, returns `false` without erroring. The retract animation +that returns the reserved item to network storage is non-cancellable. + + +```lua +local user = network:get("user_1") +local watcher = network:get("observ_1") +user:setMode("hold") +user:use() -- start using a brush on a sus block +-- when the block changes to normal sand or gravel, stop the user +watcher:onChange(function(block: BlockId, state: any) + if block == "minecraft:gravel" or block == "minecraft:sand" then + user:stop() + end +end) +``` + + +## isUsing + +Returns `true` while a hold is active, `false` otherwise. + + +```lua +local user = network:get("user_1") +if not user:isUsing() then + user:use() +end +``` + + +## mode + +Returns the current mode as a string, either `"instant"` or `"hold"`. + + +```lua +local user = network:get("user_1") +print(user:mode()) -- "instant" +``` + + +## setMode + +Sets the User's mode. Accepts `"instant"` or `"hold"` (case-insensitive). + + +```lua +local user = network:get("crop_farmer") +user:setMode("hold") +``` + + +## filter + +Returns the current filter rule as a string, empty when nothing is set. + + +```lua +local user = network:get("user_1") +print(user:filter()) -- "minecraft:bone_meal" +``` + + +## setFilter + +Sets the User's filter rule. Uses the same syntax as + filters, so bare item ids, +`#namespace:tag`, `minecraft:*`, `/regex/`, and the `$item:` / `$fluid:` +prefixes all work. + + +```lua +local user = network:get("crop_farmer") +user:setFilter("minecraft:bone_meal") +``` + + +## facing + +Returns the direction the User is facing as a lowercase string +(`"north"`, `"south"`, `"east"`, `"west"`, `"up"`, `"down"`). + + +```lua +local user = network:get("user_1") +print(user:facing()) -- "north" +``` + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/variable-handle.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/variable-handle.md new file mode 100644 index 000000000000..3f631b8bec5c --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/lua-api/variable-handle.md @@ -0,0 +1,219 @@ +--- +navigation: + parent: lua-api/index.md + title: VariableHandle + icon: variable +categories: + - api_types +description: reference to a in a network +--- + +# VariableHandle + +A `VariableHandle` is a reference to a in the +network, returned by [`network:get(name)`](network.md#get) (the same accessor +used for cards). The handle tracks the variable's declared type. Each type of +variable gains specific helpers on top of the shared core API below. + + + +> **Note:** All mutations are atomic. A second script calling `:set` or `:cas` +> on the same variable can never interleave mid-operation. + +## Properties + +- **`.name`** + - the variable's alias (same label shown in the terminal sidebar) + +## Core methods + +### get / set + +Retrieves and sets the variable's current value + + +```lua +local myNumericVar = network:get("myNumericVar") +print(myNumericVar:get()) +myNumericVar:set(1) +print(myNumericVar:get()) +-- "0" +-- "1" +``` + + +### cas + +Compare-and-swap. Sets the variable to `new` only if its current value equals +`expected`. Otherwise the current value is left untouched. Returns `true` if +the swap succeeded, `false` if something else had already changed the value. + +Use this whenever the new value you want to write **depends on the current value** +and more than one script might touch the variable. `:set` will happily overwrite +whatever is there, so two scripts racing each other can stomp each other's work. +`:cas` refuses to write unless the variable still looks like the value you think it is. + + +```lua +-- claim a job slot: only the first script that reads "" wins +if slot:cas("", "worker_A") then + print("i got the job") +else + print("someone else already claimed it") +end +``` + + +A typical read-modify-write loop when the value might change mid-flight: + + +```lua +-- decrement only while > 0, retrying on contention +while true do + local current = counter:get() + if current <= 0 then + break -- nothing left to take + end + if counter:cas(current, current - 1) then + break -- we got it + end + -- another script moved the value between :get and :cas, try again +end +``` + + +> **Note:** For straightforward arithmetic, [`increment / decrement`](variable-handle.md#increment--decrement) are already +> atomic and simpler. Use `:cas` when the transition isn't just "+/-" n + +### type + +Returns a string that represents the "type" of this `VariableHandle` + +- **`NumberVariableHandle`** + - `"number"` +- **`BoolVariableHandle`** + - `"bool"` +- **`StringVariableHandle`** + - `"string"` + + +```lua +local numberVar = network:get("numberVar") +local boolVar = network:get("boolVar") +local stringVar = network:get("stringVar") +print(numberVar:type()) +print(boolVar:type()) +print(stringVar:type()) +-- "number" +-- "bool" +-- "string" +``` + + +## BoolVariableHandle + +A [`VariableHandle`](./variable-handle.md) pointing at a declared +with the type `bool`. Adds methods that only work on bool variables. + +### toggle + +Flips the current value. (`true` becomes `false`, `false` becomes `true`) and +returns the new value. + + +```lua +local lights = network:get("lights") +print(lights:get()) +lights:toggle() +print(lights:get()) +-- "false" +-- "true" +``` + + +> **Note:** Useful as a "press to toggle" action wired to a redstone button via +> [`RedstoneCard:onChange`](./card-handle.md#onchange) + +### tryLock / unlock + +A bool variable doubles as a mutual-exclusion lock. `:tryLock()` atomically flips +the variable from `false` to `true` and returns `true` on success. If the bool variable +was already `true` (another script holds it), it returns `false` **without blocking**. +`:unlock()` flips it back to `false`. + + +```lua +local mutex = network:get("job_mutex") -- bool variable +if mutex:tryLock() then + -- do job + mutex:unlock() +end +``` + + +> **Important:** `:tryLock` doesn't wait if the lock is held. It'll return `false` immediately instead. Design your script to either retry later ([`scheduler:delay`](scheduler.md#delay)) or skip the work if it can't claim the lock. +> +> Always pair a successful `:tryLock` with `:unlock`. Wrap the critical section in `pcall` as above so the lock doesn't get stuck if your code errors out. + +## NumberVariableHandle + +A [`VariableHandle`](./variable-handle.md) pointing at a declared +with the type `number`. Adds methods that only work on number variables. + +### increment / decrement + +Adds or subtracts from the variable's current value. Both take an amount and returns +the new value. + + +```lua +local counter = network:get("counter") +counter:set(0) +counter:increment(1) -- +1 -> 1 +counter:increment(5) -- +5 -> 6 +counter:decrement(2) -- -2 -> 4 +``` + + +### min / max + +- `:min(n)` sets the variable to whichever is smaller: the current value or `n`. +- `:max(n)` sets it to whichever is larger. + +Both return the new value. + + +```lua +local best = network:get("best_score") +best:set(42) +best:max(50) -- 42 vs 50 -> 50 (new high) +best:max(35) -- 50 vs 35 -> 50 (unchanged) +best:min(10) -- 50 vs 10 -> 10 (capped) +``` + + +## StringVariableHandle + +A [`VariableHandle`](./variable-handle.md) pointing at a declared +with the type `string`. Adds methods that only work on string variables. + +### append / length / clear + +- `:append(str)` adds `str` to the end of the current value and returns the new +string. +- `:length()` returns how many characters are in the current value. +- `:clear()` empties the variable (sets it to `""`). + + +```lua +local log = network:get("log") +log:clear() +log:append("start ") +log:append("middle ") +log:append("end") +print(log:get()) +print(log:length()) +-- "start middle end" +-- 16 +``` + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/autocrafting.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/autocrafting.md new file mode 100644 index 000000000000..28f2c642f1f2 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/autocrafting.md @@ -0,0 +1,160 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: Auto-Crafting + icon: crafting_core +categories: + - mechanic +--- + +# Auto-Crafting + +Auto-Crafting is what turns "I'd like 64 iron pickaxes" into 64 actual iron pickaxes. +You tell the network what recipes exist, the network stocks the ingredients, and +a does the work. + + + + + + +## Getting it working + +You need four things, all on the same network: + +1. **A CPU.** Drop a , stick at least one + on it, and wire the Core to a + . See [Crafting CPU](../items-blocks/crafting_cpu.md) + for extras like more buffers, coolant, and substrate. +2. **Recipes.** Author each recipe into an + (vanilla 3×3 crafting) or a + (anything else), then drop them into an + or + and wire that to the network. +3. **Ingredients.** The raw materials have to be somewhere in [Network Storage](./network-storage.md). Any chest plugged in with a counts. +4. **A way to ask.** Either an for you + to click on, or a script running on a that + calls `network:craft(...)`. + +Once all four are in place, items the network can make show up in the Inventory Terminal (can be shown through filters or by holding Left-Alt to show plus icons), and `network:craft("...")` returns a +builder instead of nil. + +## Requesting a craft + +### From the Inventory Terminal + +Open the terminal, find the item, and `Alt+click` it. Enter a quantity and confirm. +The **Craft Queue** at the top of the terminal shows all queued items. When the craft +finishes, the item will show with a small indicator and you can grab it. Next time +you open the terminal it'll show with the rest of the items instead. + +Holding `Alt` highlights every auto-craftable item in the network knows how to make, +even ones with zero in stock. + +### From a script + +A script can queue a craft with `network:craft` and decide where the result goes: + + +```lua +-- the result auto-stores into Network Storage when it's ready +network:craft("minecraft:door") +``` + + +Or chain `:connect(fn)` to run custom code the moment the craft completes + + +```lua +local furnace = network:get("someFurnaceCard") +network:craft("minecraft:charcoal"):connect(function(item: ItemsHandle?) + if item then + furnace:insert(item) + end +end) +``` + + +See [network:craft](../lua-api/network.md#craft) and [CraftBuilder](../lua-api/craft-builder.md) for the full API. + +## Cancelling a craft + +Right-click the to open its GUI. The **"Cancel"** +button shows up whenever there's a craft running. Clicking it aborts the craft, +returns everything in the buffer to Network Storage, and frees the CPU. + +## Processing Sets need a handler + + recipes just work. Vanilla 3x3 crafting is +self-contained, so the CPU knows exactly how to execute them. + + recipes don't. A Processing Set *declares* a +recipe ("8 raw iron becomes 8 raw iron ingots") but doesn't know **how** that +transformation actually happens. Somebody has to put the raw iron into a furnace +and pull the ingots back out, and that somebody is called a **handler**. + +You have two ways to register one: + +### With a Processing Handler block + + + + + + Blue channel Storage Card pointing at the top of the furnace + + + Red channel Storage Card pointing at the bottom of the furnace + + + +Drop a on the network and bind it to the +recipe in its GUI. Wire its back to the parent network, then run a small +subnet of pipes off its front to whatever machine carries out the recipe. +The CPU drives the machine for you, no scripting required. This is the +right pick for almost any "stuff in one side, stuff out the other" +machine. + +### With a scripted handler + +For recipes that need custom timing, conditional routing, or multi-step +flows you can write a Lua handler on a : + + +```lua +local furnace = network:get("someFurnaceCard") +network:handle("...", function(job: Job, inputs: InputItems) + -- put raw iron into the top face of the furnace (like a hopper on top of the furnace) + furnace:face("top"):insert(inputs.rawIron) + -- wait for the output to appear by pulling from the bottom of the furnace (like a hopper again) + job:pull(furnace:face("bottom")) +end) +``` + + +If you try to autocraft something that needs a Processing Set and no handler is registered, +the craft fails with a message telling you which recipe is missing a handler. + +See [network:handle](../lua-api/network.md#handle), [Job](../lua-api/job.md), and +[InputItems](../lua-api/input-items.md) for the full pattern. + +## When something goes wrong + +If a craft fails, the starts emitting red +redstone dust particles in a pulsing cloud around the block. It keeps +pulsing until you either open the Core's GUI and dismiss the error or +start a new craft that succeeds. Scan for the red dust first when +something's off, the Core itself is the fastest way to find which CPU +is complaining. + +![](../assets/images/crafting_cpu_erroring.png) + +The concrete messages the CPU reports: + +| Message | What it means | +| -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Crafting CPU at (x, y, z) is not formed | The Core has no touching it, or the Core isn't wired to the network. | +| Missing ingredients: N× item, ... No recipe available and not enough in storage. | The network has no way to source those items, and no recipe produces them either. Stock them in a networked chest or write a recipe. | +| No handler registered for: X. Add a `network:handle("recipe", ...)` call in a connected Terminal's script. | X is a Processing Set recipe with no Lua handler to drive it. See [Processing Sets need a handler](./autocrafting.md#processing-sets-need-a-handler) above. | +| Craft needs N unique item types, CPU only holds M. Add more Buffer blocks or upgrade tiers. | Your CPU's count can't hold enough distinct item types for this craft's intermediates. Add buffers. | +| Craft requires up to N items of one type in buffer, CPU only holds M. Upgrade Buffer tiers or add more blocks. | Same problem, different axis: one step of the craft would overflow a buffer's per type capacity. | diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/cards.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/cards.md new file mode 100644 index 000000000000..e9b1d2fa9dc2 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/cards.md @@ -0,0 +1,17 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: Cards + icon: blank_card +categories: + - mechanic +--- + +# Cards + +A "Card" typically refers to a component placed into a +that the Network can interact with. + +Here are the cards: + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/devices.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/devices.md new file mode 100644 index 000000000000..c1cc8ef3ca6d --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/devices.md @@ -0,0 +1,14 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: Devices + icon: variable +categories: + - mechanic +--- + +# Devices + +A "Device" refers to a connectable block to a network that can be scripted + + diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/index.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/index.md new file mode 100644 index 000000000000..d318dca198f2 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/index.md @@ -0,0 +1,9 @@ +--- +navigation: + title: Nodeworks Mechanics + position: 30 +--- + +# Nodeworks Mechanics + + \ No newline at end of file diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/network-storage.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/network-storage.md new file mode 100644 index 000000000000..d8d5538d5308 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/network-storage.md @@ -0,0 +1,76 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: Network Storage + icon: minecraft:chest +categories: + - mechanic +--- + +# Network Storage + +Network Storage is the shared pool of items and fluids a Nodeworks network +treats as its own. Any block with a installed +joins this pool. Scripts read from and write to it, the + displays and interacts with it, and the +crafting system pulls ingredients from it. + + + + + includes this chest into Network Storage + + + includes this chest into Network Storage + + + You can use the to view inside Network Storage + + + +## What's in the Network Storage pool + +Everything inside every block attached to a . If you break a +Storage Card's node connection, that block drops out of the pool immediately. + +### Not in the pool + +'s blocks are NOT part of Network Storage. +Scripts have to explicitly move items to/from an IO-carded block. The +network won't see its contents via `network:find`, and the or won't list them. + +## Priority and routing + +Each has a **priority** that controls the order +`network:insert` / `:tryInsert` fill storage. Writes land in the highest-priority +matching card first and spill into lower-priority cards as each one fills up. +Two cards with the same priority are filled in connection order. + +Scripts can override the default priority order for specific items by registering +a route with [`network:route`](../lua-api/network.md#route). + +Set a card's priority directly in its GUI. See +[Storage Card](../items-blocks/storage_card.md#configuring-priority) for the interface, and +the for copying priority (and every other +card setting) across a batch of cards at once. + +## Scripting with Network Storage + +See the [Network API](../lua-api/network.md) page for the full set of read/write +functions scripts use to interact with the pool. + +## Viewing and managing through the Inventory Terminal + + + + + + +The and are the primary +ways to see and interact with Network Storage without writing scripts. +It shows the full pool in a searchable grid, lets you extract items into your +inventory, insert items back into storage, and request crafts. Everything it +displays is pulled live from the Storage Cards connected to this network. + +See the [Inventory Terminal](../items-blocks/inventory_terminal.md) page for +the interface details. diff --git a/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/subnets.md b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/subnets.md new file mode 100644 index 000000000000..a983999811e3 --- /dev/null +++ b/projects/assets/nodeworks/26.1/nodeworks/nodeworksguide/nodeworks-mechanics/subnets.md @@ -0,0 +1,82 @@ +--- +navigation: + parent: nodeworks-mechanics/index.md + title: Subnets + icon: broadcast_antenna +categories: + - networking + - mechanic +--- + +# Subnets + +A subnet is just a second network that exposes some of its capabilities +to another network wirelessly. Each subnet has its own +, its own storage, and its own +crafting setup. They communicate with the main network through paired +s and +s. + + + + + +## Why split a network + +A monolithic network works fine for small bases, but as you add more +machines and recipes, splitting things up becomes a useful organizing +tool: + +- **Specialization**. A subnet dedicated to smelting, brewing, or ore + processing keeps the recipes and machines for that job in one place + instead of scattered across the main base. +- **Reuse**. Build a smeltery subnet once, then pair its recipes with + every base you have. +- **Isolation**. A crash, lag spike, or stuck craft on one subnet + doesn't affect the rest. Each network runs its own CPU, storage, and + scripts. +- **Tidiness**. The main network only sees the recipes the subnet + broadcasts, not the pipes and machines behind them. + +## Exposing processing recipes + +The most common subnet setup: a subnet that owns a cluster of + blocks full of + recipes, broadcasting them so any +other network can pull from those recipes during autocrafting. + +1. On the subnet, build out the + cluster with whatever + s the subnet should provide. +2. Place a directly on top of any + in the cluster. +3. Pair it with a from the antenna's GUI. +4. On the receiving network, place a + wired into the network and slot + the same into its GUI. + +The receiving network now sees every recipe in the subnet's Processing +Storage cluster as if they were stored locally. Crafts that need those +recipes work like any other autocraft. + +The subnet still owns the machines and ingredients. The receiving +network just gets to ask for the output and trust the subnet to deliver. + +## Wireless item transfer + +Subnets can also exchange items directly using broadcasting +s paired to +s on top of +s. See the export chest and receiver +antenna pages for the pairing flow. + +## Range + +Antennas have a default range of 128 blocks. Range upgrades extend that +across chunks and dimensions, so a subnet doesn't have to be next to +the network using it. Common patterns: + +- A smeltery subnet in the Nether feeding a main base in the Overworld. +- A mob farm subnet broadcasting drops to a sorting base elsewhere. +- A shared "library" subnet of generic recipes that every other base + on the server consumes.