@aztec/protocol-contracts 0.56.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/artifacts/AuthRegistry.d.json.ts +5 -3
  2. package/artifacts/AuthRegistry.json +1 -1
  3. package/artifacts/ContractClassRegisterer.d.json.ts +5 -3
  4. package/artifacts/ContractClassRegisterer.json +1 -1
  5. package/artifacts/ContractInstanceDeployer.d.json.ts +5 -3
  6. package/artifacts/ContractInstanceDeployer.json +1 -1
  7. package/artifacts/FeeJuice.d.json.ts +5 -3
  8. package/artifacts/FeeJuice.json +1 -1
  9. package/artifacts/MultiCallEntrypoint.d.json.ts +5 -3
  10. package/artifacts/MultiCallEntrypoint.json +1 -1
  11. package/artifacts/Router.d.json.ts +5 -3
  12. package/artifacts/Router.json +1 -1
  13. package/artifacts/keys/AuthRegistry/set_authorized_private.vk.data.json +134 -0
  14. package/artifacts/keys/ContractClassRegisterer/broadcast_private_function.vk.data.json +134 -0
  15. package/artifacts/keys/ContractClassRegisterer/broadcast_unconstrained_function.vk.data.json +134 -0
  16. package/artifacts/keys/ContractClassRegisterer/register.vk.data.json +134 -0
  17. package/artifacts/keys/ContractInstanceDeployer/deploy.vk.data.json +134 -0
  18. package/artifacts/keys/FeeJuice/claim.vk.data.json +134 -0
  19. package/artifacts/keys/FeeJuice/initialize.vk.data.json +134 -0
  20. package/artifacts/keys/MultiCallEntrypoint/entrypoint.vk.data.json +134 -0
  21. package/artifacts/keys/Router/check_block_number.vk.data.json +134 -0
  22. package/artifacts/keys/Router/check_timestamp.vk.data.json +134 -0
  23. package/dest/auth-registry/index.d.ts +0 -3
  24. package/dest/auth-registry/index.d.ts.map +1 -1
  25. package/dest/auth-registry/index.js +2 -12
  26. package/dest/build_protocol_contract_tree.d.ts +6 -0
  27. package/dest/build_protocol_contract_tree.d.ts.map +1 -0
  28. package/dest/build_protocol_contract_tree.js +12 -0
  29. package/dest/class-registerer/index.d.ts +0 -2
  30. package/dest/class-registerer/index.d.ts.map +1 -1
  31. package/dest/class-registerer/index.js +2 -9
  32. package/dest/fee-juice/index.d.ts +0 -4
  33. package/dest/fee-juice/index.d.ts.map +1 -1
  34. package/dest/fee-juice/index.js +2 -10
  35. package/dest/index.d.ts +3 -1
  36. package/dest/index.d.ts.map +1 -1
  37. package/dest/index.js +4 -2
  38. package/dest/instance-deployer/index.d.ts +0 -2
  39. package/dest/instance-deployer/index.d.ts.map +1 -1
  40. package/dest/instance-deployer/index.js +2 -9
  41. package/dest/multi-call-entrypoint/index.d.ts +0 -2
  42. package/dest/multi-call-entrypoint/index.d.ts.map +1 -1
  43. package/dest/multi-call-entrypoint/index.js +2 -6
  44. package/dest/protocol_contract.d.ts +4 -4
  45. package/dest/protocol_contract.d.ts.map +1 -1
  46. package/dest/protocol_contract.js +12 -9
  47. package/dest/protocol_contract_data.d.ts +17 -0
  48. package/dest/protocol_contract_data.d.ts.map +1 -0
  49. package/dest/protocol_contract_data.js +51 -0
  50. package/dest/protocol_contract_tree.d.ts +3 -0
  51. package/dest/protocol_contract_tree.d.ts.map +1 -0
  52. package/dest/protocol_contract_tree.js +21 -0
  53. package/dest/router/index.d.ts +0 -3
  54. package/dest/router/index.d.ts.map +1 -1
  55. package/dest/router/index.js +2 -12
  56. package/dest/scripts/generate_data.d.ts +2 -0
  57. package/dest/scripts/generate_data.d.ts.map +1 -0
  58. package/dest/scripts/generate_data.js +172 -0
  59. package/package.json +9 -6
  60. package/src/auth-registry/index.ts +1 -17
  61. package/src/build_protocol_contract_tree.ts +23 -0
  62. package/src/class-registerer/index.ts +1 -12
  63. package/src/fee-juice/index.ts +1 -14
  64. package/src/index.ts +3 -1
  65. package/src/instance-deployer/index.ts +1 -12
  66. package/src/multi-call-entrypoint/index.ts +1 -8
  67. package/src/protocol_contract.ts +20 -13
  68. package/src/protocol_contract_data.ts +63 -0
  69. package/src/protocol_contract_tree.ts +27 -0
  70. package/src/router/index.ts +1 -17
  71. package/src/scripts/generate_data.ts +208 -0
  72. package/dest/auth-registry/artifact.d.ts +0 -2
  73. package/dest/auth-registry/artifact.d.ts.map +0 -1
  74. package/dest/auth-registry/artifact.js +0 -4
  75. package/dest/class-registerer/artifact.d.ts +0 -2
  76. package/dest/class-registerer/artifact.d.ts.map +0 -1
  77. package/dest/class-registerer/artifact.js +0 -4
  78. package/dest/fee-juice/artifact.d.ts +0 -2
  79. package/dest/fee-juice/artifact.d.ts.map +0 -1
  80. package/dest/fee-juice/artifact.js +0 -4
  81. package/dest/instance-deployer/artifact.d.ts +0 -2
  82. package/dest/instance-deployer/artifact.d.ts.map +0 -1
  83. package/dest/instance-deployer/artifact.js +0 -4
  84. package/dest/multi-call-entrypoint/artifact.d.ts +0 -2
  85. package/dest/multi-call-entrypoint/artifact.d.ts.map +0 -1
  86. package/dest/multi-call-entrypoint/artifact.js +0 -4
  87. package/dest/router/artifact.d.ts +0 -2
  88. package/dest/router/artifact.d.ts.map +0 -1
  89. package/dest/router/artifact.js +0 -4
  90. package/src/auth-registry/artifact.ts +0 -6
  91. package/src/class-registerer/artifact.ts +0 -8
  92. package/src/fee-juice/artifact.ts +0 -6
  93. package/src/instance-deployer/artifact.ts +0 -8
  94. package/src/multi-call-entrypoint/artifact.ts +0 -6
  95. package/src/router/artifact.ts +0 -6
@@ -1 +1 @@
1
- {"transpiled":true,"noir_version":"0.34.0+02fea6abe8637b9fb8f9535d1709b367d5e1da5c","name":"MultiCallEntrypoint","functions":[{"name":"entrypoint","is_unconstrained":false,"custom_attributes":["private"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"slot_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"app_payload","type":{"fields":[{"name":"function_calls","type":{"kind":"array","length":4,"type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"target_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_public","type":{"kind":"boolean"}},{"name":"is_static","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::entrypoint::function_call::FunctionCall"}}},{"name":"nonce","type":{"kind":"field"}}],"kind":"struct","path":"authwit::entrypoint::app::AppPayload"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::public_call_request::PublicCallRequest"}}},{"name":"public_teardown_call_request","type":{"fields":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::public_call_request::PublicCallRequest"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"slot_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/+29CbiOVdsGvG3zPBMhlHnaa2MbilAURVEUhcyZM4YiQ4hCyBxFCIWMReaiKIqiKIpQFIXIEP1rve/e3/u8Xt/3vy3nuf/7/N3Pcaxj72eznvu61nWe17Tuez1Jov756nRTVNTFHP/8PYkdSeN/RtuR/6q/JfyM/D3ZNf6W4hpz013jbxmu8bdM1/hblmv8Lacd1a762y3X+H/5r/G3Atf4W8Fr/K3wNf5W9Bp/K36NNShxjb+VusbcMtf4fzHX+FvsNeaWu8b/K3+Nv1W4xtxK1/h/leN/Rr4S3leL/1k2Jq5cuTYVYtuYsqZFTGyllhXLx5Qr3zKuoqloylcs3zq2YtmybSqWq1ihUstKFWIqmXJl25i25SuVbRvzz9fj0f/6rJjresW2YsrZ1FtOE3f1X5xsjmLJImR163Al/vciUf/6vWjE703j/0/CvGb2fXM7nrCjRfS//p7wSnrVGsRc38sUA35Ws2icbVrCMBQTw1y/4sDPag5cv1Yi61cC+FlPANevNXD9ruUbWkb4hlYRv7eO+L3FVb6hjX3f1o52djyZCL6hJPCz2gBt014E26WAn9UWuH4dRNavNPCz2gHXryPZN7SP8AEdIn7vGPH7k1f5hk72fWc7utjRNRF8QxngZ3UC2uYpEWzHAD+rM3D9uomsnwF+Vhfg+nUn+4anInxAt4jfu0f83vUq39DDvu9pRy87eieCb4gFflYPoG2eFsF2WeBn9QSuXx+R9SsH/KxewPXrS/YNT0f4gD4Rv/eN+L33Vb6hn33/jB3P2tE/EXxDeeBn9QPaZoAItuOAn/UMcP2eE1m/CsDPeha4fgPJvmFAhA94LuL3gRG/97/KNwyy7wfbMcSO5xPBN1QEftYgoG2GimC7EvCzBgPXb5jI+lUGftYQ4PoNJ/uGoRE+YFjE78Mjfn/+Kt/wgn0/wo6RdryYCL7hduBnvQC0zUtk27wUYYMREb+PjPj9xatsM8q+H23HGDtevoZtosG2KRyFW8+xuPU0kfue7nPz25/J4/W/eg80Kuo/9xdjru+F3FuLiZR3XDRRYPfh6M8dDyQcS+/x0f9aYNDn/luwQpNuLHBNXwGS7lr2uV75isfbB72GxYEyTgAnOWiMOxtPiMbbZiI4ACY47IkRDtu9UkT95yvIDpspZ1EROYuIyDmWzN3r5Zi7ScIlcWj/lwz4WcAbOf7N1lFYnWOuxhAcTMhAkDzqX3dbXv0KnV/o/BByhs7vxnF+0RGfOSn+zWSXFDIqvuLXMBqiEkB91nhSq2FSfOYa+UKDdxKw+ptCrv5iru9lEqq/pCJYut7Pmhpwezi8TCVUktNIleS0CD6qVNWvRnMCCtofI3E/PeC4dzaZTrD1DBLuZxBxz/IBrwW8i+bs/xpB79dJGHidiAEWH7JnuDExkCMDx+ej86aZQD8NtLVBrl8kh2YSOeSaGQw/OkvAj84i6P0GyY++8X9g4Hpldo2IElH4WyZYDY7r1Xd2wLE5lpTbzBHg5ByC3nNJnJxL9MuTSBh4UwADbxL0nkfCwDxybGbU9vMFMDCfoPcCEgYWEDEwltTfeUsAA28R9H6bhIG3IzCQ8ELXPQtvsLpnIZlX4wn4WkTC16L/Al8x1/cySHwtAvZlF5PWdDERX+5mBkb+9k7A/XYSkt5LbtB+wlIS9pcSse/sP5uwFssCjoEiJOwvD7jek0m16oobtF+xksT5lUTOs+r2d0lr8S459jNqtvcEYj9D71U3aL9iNQn7q4nYn0CK/e8LxH4G9tfcoH2atSTsr41O/McwgcfI/dtjmOuiiQKvi8Z/7npgU4Cl9/rofy0w6HOpj2EuBq7pBmAD6Fr2uV75ysTbB72GZYAybgy4w3Y23khw2JtIDntThMN2r8R4EgnpsJlylhKRs6SInMhG87Xku16OuQ8N+pNIwHNFtR/DRAYC5/ySRhieIa/L5CcAk5+2/3wxjGgSfolcjw/i33yYkNYnRJAP4qNd5N8+jOaWwNOjYY86xMaz33wAzPQ+jMYaGO3pHHk+IGXiYHtXTLA3eg02BzyTdDbaTNB7CymT3ELkvLP/e4S1+Eig/bOKoPfH0ZwsAi3nVgH7vE+wzzYBvdcQ9P4EqLfLulPbMTD+8xzXHe7dT9eid9hy6+yuuTb+fTj+/zv+Nx8Vc30vWpz+NBrHhaTxXLj6hfp81toi14Al43a0jIx2G6MlmYv8HCeiyNlO0Ds36TnOZERgXq/OO3AgN0DcGKQtyE7SJHzejegkdwTdSSZE8WjC51YDkfAz4CJGVu7uc/OTDK+wrp+HmZZBrgFLxp1BdyLu8xiZVl6BTGsnQe98IpnWTqAz2gXMtIC4MfnCTEvCSe4KupMkZQSxyIzgC1Km9YVepgVd1y/DTMsg14Al4262E0FkHLsJGUcBkYxjN5CUewLa2ykQZhwSzmIP21nEXN+LFRnLIiPjV6SM4yu9jAO6rl+HGYdBrgFLxr1BdyLuZnBGb+dWgd7OXoLet4lkWnuBzmgfMNMC4sbcFmZaEk5yX9CdJCkjKIfMCL4hZVrf6GVa0HX9Nsy0DHINWDLuV+jt7MeD/d8Uv14ZD+iAnRYxFcB+IPrGjJjlkZ79O1LE/E4vYkLX9fswYhrkGrBkPBj0iOlq3pioYH/DQAxQ30NggzAymIOEnkmRgH9zjtP7EEHvoiK9ooPA4PADsFcExI0pGvaKJILWD+ygFXN9L1aGFofM0A6TMt/DepkvdF2PhJmvQa4BS8ajQXci7ugjxq5cCYFduaMEvUuKZFpHgc7oR2CmBcSNKRlmWhJO8segO0lSRlABmRH8RMq0ftLLtKDreizMtAxyDVgyHg+6E3GHNzIyrTICmdZxgt4xIpnWcaAz+hmYaQFxY2LCTEvCSf4cdCfJOqvwl2gsgBiZ0C8EvU+QssIT0f869dq9D0+9/pec4anXWDnRp16z5DxEkjMKK+e/HUp8Mv7Nr873oBfEfRWC++qCq8s7xNcsoD5rPTAwRDrIk9H/KpsTXuAy15wEZpa/BTxAJny1Bvo7i1lYut7POhVwezi8nCIkLKdJCcvpiIQlMU6qnxpxgev93PiDzFtFXeN1nZ99zZPqz8S/+T066t9PpT8T/Z8n1f8ezesPTo3mnFR/BkjU36OxBkYTypH0DBCMCS+CvVtMJVV/Z6MDrbdxNjpL0PscyZmeI3Le2f8dwlr8EXAMOL2XEPQ+L6D3MoLeFwT0Xk7Q+6KA3isIel8C6u22ANLYUTT+85zvcDxyP90X07vT0B2+3Fq767ovrn43+v9/J7Oz4tKfQFsljbfV1S/U57PWFrkGLBkvo2VktIQZVWjZgO+pOp0vE/QuJ7KnehlYwF3BgdwAcWPKZZBxkrQ9VQUneSXoTjIhikcTPrcaiIR/kSrVv4iVqsK6uoVAratqpoVcA5aMSZIG3Im4z2NkWhUEMi1nHPTnVhTJtCKBeb06R+NAboC4MRXDTEvCSUYH3UmSMoJYZEaQNCkn03Kfm59keIV1TRZmWiaZgBNJznYiiIwjOSHjuF0k40gOzDhSADMOZG/n9jDjkHAWKW7QjKMsMjKmJGUcKfUyDui6pgozDpNKwImkDroTcQ8sMHo7VQR6O6kJmVZVkUwrNTDTSgPMtIC4MVXDTEvCSaa5QTOtcsiMIC0p00qrl2lB1zVdmGmZdAJOJL1Cb8cJGU1U/HplzKADdlrEVAB7hhs0YpZHevaMpIiZUS9iQtc1UxgxTSYBJ5I56E7EPVTP6E1UF+hNZCb0JmqI9CYyAzOaLMDeBBA3pkbYm5Bwkllu0EwrDpkRZCVlWln1Mi3oumYLMy2TTcCJZA+6E3HHQTEyrZoCmVZ2QqZVSyTTyg7MtHIAMy0gbkytMNOScJI5btBMqwIyI8hJyrRy6mVa0HW9Kcy0zE0CTiRX0J3Ir6SeVm2BTCsXIdOqI5Jp5QJmWrmBmRYQN6ZOmGlJOMncN2imVRGZEdxMyrRu1su0oOuaJ8y0TB4BJ5I36E5kMSnTqiuQaeUlZFr1RDKtvMBMKx8w0wLixtQLMy0JJ5nvBs20KiEzgltImdYtepkWdF3zh5mWyS/gRAoE3YmcJGVa9QUyrQKETKuBSKZVAJhpFQRmWkDcmAZhpiXhJAsG3Umyvt/g1qRYADEyoVsJTvI2UlZ4GzEr3BDN+RrYQgSCulc0WE7klyQVDjjunU0KE3BfhIT7IkTcs74wqigY92i9nf2LEjBQjISBYkQMsPjQMMONiYFGpCIhKVjO4kA/DbS1Qa5fJIeKx3NItSOyNTr4MpYg5TtwkpYEgl8VUCWTBl/GUiqAKo0TNFYVUKUFAFVGBVAxOEHLqgIqRgBQJuj9raWk3kasQI0XS8jvy5JqvLLkXU9DWItyAhgoR9C7PAkD5YkYYPGhsUCdz8BAE5E6Pw5Y6gBtbZqQ6vy4CA5F/S9cuu4vyMGtaTnV5KyCQHJWkZXtR4MFLQzcsa8UgtNUEgBn5aBXDq5quECoHJoGPGNw2XJlQsbQTCRjuB2YMQBtbZoJZJq3E3BzB6nauCNC1oQXOLDFIQNblfC+WFNFILBVFcm6KiDBeWcITnOnADiriYCzPBKc1cPNBFNdAJw1gl4SrCRtJtwl0Ei+i5Da3U1K7e4mbybUIKxFTQEM1CToXYuEgVrkzQQGH1oIlHgMDLQUaQ3cA2wNAG1tWpI2E+65xmZCkEvke8NEz9wrkOjVDnqi9y4p0asjEOTrEBz8faQgfx850atNWIv7BTBwP0HvuiQM1CUnegw+tBFI9BgYaCuS6NUDJnpAW5u2pESvHj/Ra4FM9B4I283mAYFE70GRdnNLJDjrh+A09QXA2UAEnK2Q4HwoBKd5SACcD4uAExrWG4b9G9NQAJyNgt6/cbV7I0L98ohA7f4IQe9HSbX7o2J1R+Pw5mLTWMBBNbkR647HQnCaxwTA+bgGOE0MEpxNw7rDNBUAZzMRcEKfGWoegtM0FwDnEyJhvS0SnC3Coti0EABnS4WiuCWhOGwlUBS3IujdmlQUt6YXxdjUrk3ooEwbAQfVVsFBtSUQtZ2Ag2pH0PtJkoN6ku+gyiEdVPswvTftBRxUB5HaE/pwWscQnKajADg7iYATekN95xCcprMAOLuIgBMa1ruGdYfpKgDOpxTqjqcI+Xc3gbqjG0Hv7qS6o7tY3dEj3JA1PQQcVM8bse7oFYLT9BIAZ28RcELvs3o6rDvM0wLg7CMCTuh9Vn1DcJq+AuDsJwLOSkhwPhMWxeYZAXA+q1AUP0soDvsLFMX9CXoPIBXFA/hFMTS1ey50UOY5AQc1UMFBDSQQdZCAgxpE0HswyUEN5juoNkgHNSRM780QAQf1vEh6D70ZeGgITjNUAJzDNMAZC70RdHgITjNcAJwviHhOaFgfEdYdZoQAOEcq1B0jCfn3iwJ1x4sEvV8i1R0vidUdo8INWTNKwEGNvhHrjjEhOM0YAXC+LFJ3QO+zGhvWHWasADjHiYATep/V+BCcZrwAOF8RAWdZJDgnhEWxmSAAzokKRfFEQnE4SaAonkTQezKpKJ5ML4qxqd2U0EGZKQIOaqqCg5pKIOo0AQc1jaD3qyQH9WpS3rd5TLUYmB6NX4vpAceA+yaj6QQMzBDA/gyC3q+RsP8aEfvO/91KWIvXBTDwOkHvmSQMzCRigMWH9gLfZsTAQAeRbzOahcOqAdradCB9m9GseA6596mj/vOFthkar1ujgy/jG0i/r2qokgKV2ezQUDGmtICh5oSGijExAoaaG/Reh6v35hLynTcFcv03CXrPI+X684i5/mqLgVOEXsd8AQzMJ2BgAQkDC8j1HoMPnQXqPQYGuojUe28B6z2grU0XUr33lni9V0Eg6XmbdXsEmqQLcYKWVwXUQgFALVLIohcRoki3gEfPbaTMsbtI9FwMjJ5AW5vuAlnXYgJf3iFl3u9EyJrwQsu+BCd7nGowWiIQjJaqZDfLcIJWUAXUMgFALVfIbpYTvPUKgf7QCoLeK0lRaiWxP7SWlOm9K4CBdwkYeI+EgffIPUIGH3oJZKsMDPQWqXJWAascoK1Nb1KPcFUEh6L+Fy5d75quxq1pRdXkbLVAcva+Sra/BidoJVVArREA1FoVQK3DCdpCFVDrBAC1XgVQG3CCtlQF1AYBQG1U6EdsJOTjmwRq0U0EvT8g1aIfJEIe/SFO9laqTuVDAaeyWSVKbcEJ2loVUFsEAPWRCqA+xgnaRhVQHwsAaqsKoLbhBG2rCqhtAoD6RCGP/oSQT34qkEd/StB7OymP3p6UfRCLgZ7tvQO4DqoOaoeAg/qMFfHA4DRIcH4egtN8LgDOnSLgjEWCc1cITrNLAJxfiIATGta/xCldVhWcXwqAc7dC3bGbkH/vEag79hD0/opUd3wlVnd8jVuHcqoO6msBB7X3Rqw79oXgNPsEwPmNCDjjkOD8Nqw7zLcC4NwvAk7ouc4HwrrDHBAA53cKdcd3hPz7e4G643uC3gdJdcdBft1REemgDoXR0xwScFA/iETPSkhwHg7BaQ4LgPOICDhbIMF5NASnOSoAzh9FwAkN6z+FdYf5SQCcxxTqjmOE/Pu4QN1xnKD3z6S642exuuOXsKVsfhFwUCduxLrjZAhOc1IAnL+KgLMNEpy/hXWH+U0AnKdEwNkKCc7TYd1hTguA84xC3XGGkH//LlB3/E7Q+yyp7jhLrztiofdZnQujpzkn4KD+0IiesdD7rM6H4DTnBcB5QQSc0Oc7LobgNBcFwHlJBJzQsP5nWHeYPwXAeVmh7rhMyL+vCNQdVwh6/0WqO/4SqzuikoUtZeAa0GRMQpCRAU5o3REdgtNEC4AzqQg4oc93JAMqrQrOZALgTC4CTujzHSlwSsvWHSkEwJkSLSOj7nBCovPvVGDFGXVHKoLeqYF6R9Yd7nPzR/37C+ygoPdZpQmjp0kj4KDSikRP6H1W6UJwmnQC4EwvAk7o8x0ZQnCaDALgzCgCTmhYzxTWHSaTADgzK9QdmQn5dxaBuiMLQe+spLojq1jdkS1sKZtsAg4q+41Yd+QIwWlyCIAzpwg4oc933BTWHeYmAXDmEgEn9PmO3GHdYXILgPNmhbrjZkL+nUeg7shD0Dsvqe7IS687ykLvs8oXRk+TT8BB3aIRPctC77PKH4LT5BcAZwERcEKf7ygYgtMUFADnrSLghIb128K6w9wmAM5CCnVHIUL+XVig7ihM0LsIqe4oIlZ3FA1byqaogIMqdiPWHcVDcJriAuAsIQJO6PMdJcO6w5QUAGcpEXBCn+8oHdYdprQAOMso1B1lCPl3jEDdEUPQ25DqDsOvO6D3WcWG0dPECjiosiLRE3qfVbkQnKacADjLi4AT+nxHXAhOEycAzgoi4ISG9Yph3WEqCoCzkkLdUYmQf1cWqDsqE/S+nVR33C5Wd9wRtpTNHQIOqsqNWHdUDcFpqgqA804RcEKf76gW1h2mmgA4q4uAE/p8R42w7jA1BMB5l0LdcRch/75boO64m6B3TVLdUZNed5SD3mdVK4yeppaAg7pHI3qWg95ndW8ITnOvADhri4AT+nxHnRCcpo4AOO8TASc0rN8f1h3mfgFw1lWoO+oS8u96AnVHPYLeD5DqjgfE6o4Hw5ayeVDAQdW/EeuOBiE4TQMBcD4kAk7o8x0Ph3WHeVgAnA1FwAl9vqNRWHeYRgLgfESh7niEkH8/KlB3PErQuzGp7mjMrzug91k1CaOnaSLgoB4TiZ7Q+6weD8FpHhcAZ1MRcEKf72gWgtM0EwBncxFwQsP6E2HdYZ4QAGcLhbqjBSH/bilQd7Qk6N2KVHe0Eqs7WoctZdNawEG1uRHrjrYhOE1bAXC2EwEn9PmOJ8O6wzwpAM72IuCEPt/RIaw7TAcBcHZUqDs6EvLvTgJ1RyeC3p1JdUdnet1RHnqfVZcwepouAg6qq0b0LA+9z+qpEJzmKQFwdhMBJ/T5ju4hOE13AXD2EAEnNKz3DOsO01MAnL0U6o5ehPy7t0Dd0Zug99OkuuNpsbqjT9hSNn0EHFTfG7Hu6BeC0/QTAOczIuCEPt/xbFh3mGcFwNlfBJzQ5zsGhHWHGSAAzucU6o7nCPn3QIG6YyBB70GkumMQv+6A3mc1OIyeZrCAgxoiEj2h91k9H4LTPC8AzqEi4IQ+3zEsBKcZJgDO4SLghIb1F8K6w7wgAM4RCnXHCEL+PVKg7hhJ0PtFUt3xoljd8VLYUjYvCTioUTdi3TE6BKcZLQDOMSLghD7f8XJYd5iXBcA5VgSc0Oc7xoV1hxknAM7xCnXHeEL+/YpA3fEKQe8JpLpjAr3uiIPeZzUxjJ5mooCDmqQRPeOg91lNDsFpJguAc4oIOKHPd0wNwWmmCoBzmgg4oWH91bDuMK8KgHO6Qt0xnZB/zxCoO2YQ9H6NVHe8JlZ3vB62lM3rAg5q5o1Yd8wKwWlmCYDzDRFwQp/vmB3WHWa2ADjniIAT+nzH3LDuMHMFwPmmQt3xJiH/nidQd8wj6D2fVHfM59cd0PusFoTR0ywQcFBviURP6H1Wb4fgNG8LgHOhCDihz3csCsFpFgmAc7EIOKFh/Z2w7jDvCIBziULdsYSQfy8VqDuWEvReRqo7lonVHcvDlrJZLuCgVtyIdcfKEJxmpQA43xUBJ/T5jvfCusO8JwDOVSLghD7fsTqsO8xqAXC+r1B3vE/Iv9cI1B1rCHqvJdUda+l1RwXofVbrwuhp1gk4qPUa0bMC9D6rDSE4zQYBcG4UASf0+Y5NITjNJgFwfiACTmhY/zCsO8yHAuDcrFB3bCbk31sE6o4tBL0/ItUdH4nVHR+HLWXzsYCD2noj1h3bQnCabQLg/EQEnNDnOz4N6w7zqQA4t4uAE/p8x46w7jA7BMD5mULd8Rkh//5coO74nKD3TlLdsZNfd0Dvs9oVRk+zS8BBfSESPaH3WX0ZgtN8KQDO3SLghD7fsScEp9kjAM6vRMAJDetfh3WH+VoAnHsV6o69hPx7n0DdsY+g9zekuuMbsbrj27ClbL4VcFD7b8S640AITnNAAJzfiYAT+nzH92HdYb4XAOdBEXBCn+84FNYd5pAAOH9QqDt+IOTfhwXqjsMEvY+Q6o4jEXUHAwO/ROPX4qgABo4SMPAjCQM/EjEwwdp/OgEDPwUcA6eszj8RMHBMAPvHCHofJ2H/OBH7LD/QN8ONiYF+GfCJWVQ8FpBy/ozDqgHa2iDXL5JDP1+jd4le01+Aa9oQuKaNSGv6C9EvLbaxaT0hJp8g+egT/wW+Yq7vZZD4ilyH613Tk6Q1PUnO+/8g4Kt/wOOey/lKJMXrPUAk7v0K5BDQ1mZAwHHj+HKewJdBAnwpReDLYBG+/AbkC9DWZrAAbsoQcDNUBDenAupnVdbvNHD9GgPXrwmpljhNzPWWkmqJM6S890wi1BJIfJ0B1hK/k9b0dyK+nK+vSPD1ZwPeR3WcukDg1XCB3uHtBHu/IBKbzgF9B9DW5gVSbDoX0Sdm1FUXCRx6USA/rkrg0EsiHPoDyCGgrc1LAn2ISwS+jBHgSzUCX14W4ct5IF+AtjYq63cBuH4tgOvXkhSzLxDz/ZWkevIiqfa5mAj1JBJfF4H15CXSml5KhP3kP4Fr2gbI2bYkzv5J5Oy7JM5eJuHrciJwFomvy0DOXiGt6RVyD+hBQn72l8A9hA0IekclD77eDxP0ThJwvV3v6xGC3tHJOZx3n5s/isf5JoS1SCqA/ccJeicT0LsZQe/kAno/QdA7hYCva0XQOyXJ16Uk+jq3Fu0Ia5GKtBapyH6/A2EtUgv4gU4EvdMI6N2FoHdaAf/XjaB3OhLn05E535OwFukFsN+boHcGAb37EPTOKKB3P4LemQR8XX+C3plJvi4zOdcbRFiLLKS1yEL2+88T1iKrgB8YRtA7m4DeLxD0zi7g/14k6J2DxPkcZM6PJqxFTgHsv0zQ+yYBvccR9M4loPcrBL1zC/i6SQS9byb5upvJud40wlrkIa1Fnoi1SHih77vIi5PdtAfed9GBdN9FXiK+3D0X0wn4ykfCV77/Al8x1/cySHxFrsP1ruktpDW9hYgvdz/wGwR8jQ/4/cAfWb1d/Ebr/YrI/az5gRwC2tq8InD//GwCXyYFXO+PSXyZLMKXAkC+AG1tJgvwZQ6BL9NEcFMweSB9o1FZv1uB69cZuH5dSLXErcRcb3U05x7u20h5722JUEsg8XUbsJYoRFrTQuRa4m2Cry8c8H6Y49Q2Aq+mCzzHv5hg7xkisakI0HcAbW1mkGKT0zfB1gzfsZSApZkB59AnpLpqlgiHigI5BLS1UVm/YsD16wVcv94kH1SMmL+sJeXHxUm5XPFEyI+R+CoOzI9LkNa0BDk/fp8Q40oGPD92eq8l6F1KQO/1BL1LC9wfsImgdxkS58uQOb+ZsBYxAtj/iKC3EdB7K0HvWAHOf0rQuyyJ82XJnP+MsBblBLC/k6B3eQG9vyDoHSfA+T0EvSuQOF+BzPm9hLWoKID9bwh6VxLQez9B78oCnP+eoPftJM7fTub8D4S1uEMA+0cIelcR0PtHgt5VBTh/nKD3nSTO30nm/AnCWlQTwP6vBL2rC+h9iqB3DQHO/07Q+y4S5+8ic/4PwlrcLYD9CwS9awrofYmgdy0Bzl8h6H0PifP3kDmfhPD9xvcKYD8pQe/aAnonJ+hdR4DzqQh630fi/H1kzqclrMX9AthPT9C7roDeGQl61xPgfBaC3g+QOP8AmfPZCWvxoAD2cxL0ri+gdy6C3g0EOJ+HoPdDJM4/ROb8LYS1eFgA+wUIejcU0PtWgt6NBDhfmKD3IyTOP0LmfDHCWjwqgP0SBL0bC+hdiqB3EwHOxxD0fozE+cfInC9LWIvHBbBfnqB3UwG9KxD0bibA+coEvZuTON+czPkqhLV4QgD7dxL0biGgd3WC3i0FOH83Qe9WJM63InP+HsJatBbAfm2C3m0E9L6PoHdbAc7XI+jdjsT5dmTO1yesxZMC2H+IoHd7Ab0bEvTuIMD5Rwl6dyRxviOZ848R1qKTAPabEvTuLKB3c4LeXQQ435Kgd1cS57uSOd+GsBZPCWC/HUHvbgJ6tyfo3V2A850Ievcgcb4HmfNdCWvRUwD73Qh69xLQuwdB794CnO9N0PtpEuefJnO+L2Et+ghg/xmC3n0F9O5P0LufAOcHEvR+hsT5Z8icH0JYi2cFsD+UoHd/Ab2HE/QeIMD5kQS9nyNx/jky50cR1mKgAPbHEPQeJKD3WILegwU4/wpB7yEkzg8hc34SYS2eF8D+FILeQwX0nkbQe5gA52cQ9B5O4vxwMudnEtbiBQHsv0HQe4SA3nMIeo8U4Pw8gt4vkjj/IpnzbxHW4iUB7C8k6D1KQO/FBL1HC3B+KUHvMSTOjyFzfgVhLV4WwP67BL3HCui9iqD3OAHOryHoPZ7E+fFkzq8nrMUrAtjfSNB7goDeHxD0nijA+S0EvSeROD+JzPmthLWYLID9Twh6TxHQeztB76kCnP+coPc0EuenkTn/BWEtXhXA/m6C3tMF9P6KoPcMAc7vI+j9Gonzr5E5v5+wFq8LYP87gt4zBfQ+SNB7lgDnDxP0foPE+TciOJ/wQn+X9Gyc7KYv8Luk+5G+S3o20Y+675H+iYCvOSR8zfkv8BVzfS+DxFfkOlzvms4lrenc+DW1P6KiIzAW+ULjrmwUVpeE15vJiQK7D0d/7jwgQFh6z0v+rwUGfW5MVMQrGizzyWS4NZ0PdAbXss91f9lqvH3Qa1gOKOOCgCdZzsYLkuNt8xbJYb8V4bDdK0XUf76C7LCZcsaKyGlE5Iz0pTHX+bqWfNf9pcv2M6yIcP+XDPhZ5Um2jsLqHHM1huBgQgYC5/ySRhg+ikgCRObd9p8vhgFNwi+Ra/F2fHRYmDx+QRKix9vxkS7ybwsToayae/2Zbmw8683bwKx5Idi4aA/nSPM2KQMHE6XiXFImtYiUSS0it1Y+iia0VjIEGgP/aFnmJ2BgbgZOFEW3Jxcj20fA9uTcgOPG8eVjAl/mC/ClAIEvC0T48g6QL0BbmwUCuClIwM1CEdwsCaifXSiAm8IE3CwNeJfPxZdPCPFlsYC9ixLs/Y6In1gG9BNAW5t3BHBTkoCb5QK3XJQi6L1CQO/SBL1XCugdQ9D7XQG9DUHv9wT0jiXovUpA73IEvVcL6F2eoPf7AnrHEfReI6B3RYLeawX0rkTQe52A3pUJeq8X0PsOgt4bBPSuQtB7o4DeVQl6bxLQuxpB7w8E9K5O0PtDAb1rEPTeLKD33QS9twjoXZOg90cCetci6P2xgN73EvTeKqB3bYLe2wT0rkPQ+xMBve8n6P2pgN51CXpvF9C7HkHvHQJ6P0jQ+zMBvesT9P5cQO8GBL13Cuj9MEHvXQJ6NyTo/YWA3o0Ien8poPejBL13C+jdmKD3HgG9mxD0/kpA78cJen8toHdTgt57BfRuRtB7n4DeTxD0/kZA7xYEvb8V0LslQe/9Anq3Juh9QEDvNgS9vxPQuy1B7+8F9H6SoPdBAb3bE/Q+JKB3B4LePwjo3Ymg92EBvTsT9D4ioHcXgt5HBfR+iqD3jwJ6dyPo/ZOA3t0Jeh8T0LsnQe/jAnr3Iuj9s4DevQl6/yKgdx+C3icE9O5L0PukgN79CHr/KqD3swS9fxPQuz9B71MCeg8g6H1aQO+BBL3PCOg9iKD37wJ6DybofVZA7+cJep8T0HsoQe8/BPQeRtD7vIDeLxD0viCg9wiC3hcF9B5J0PuSgN4vEfT+U0DvUQS9LwvoPZqg9xUBvV8m6P2XgN5jCXq7rxMIut7jCHonEdD7FYLe0QJ6TyDonVRA74kEvZMJ6D2ZoHdyAb2nEPROIaD3VILeKQX0fpWgdyoBvacT9E4toPcMgt5pBPR+naB3WgG9ZxL0Tieg9yyC3umBertvd0prx8D4z3Pf2eDOoXdniheyw51lXcQOd3ZwCTvcmbXu/FZ3lmkZO9zZnu6cS3fmY1k73BmI7jxAdzZeBTvcWXHu3DR3htjtdrgztdz5Uu6spTvtcGcPuXN43Jk0d9nhzmhx55W4szvuscOdZeHOdXBnHNxnh3vm3z3/7p4Ff8AO92y0e07YPTP7kB3uGVL3PKV7tvARO9yzdu65M/cM1mN2uGeS3PM57lmV5na4Zzfccwzunv5Wdrh73N393u7e53Z2uHuB3X2x7h7Rjna4eybd/YPuXrqudrh7y9x9Vu6eox52uHtw3P0o7t6Mp+1w9yq4fXu3h/2MHW5P1+1vur2+5+xwe19uH8jtiQyxw+0RuH656x0Pt8P1Ul1f0fXYXrTD9Zxc/8X1IsbY4WpzV6e6mm28/d3VMC6fd7ntJPve5Xou73E5wDT73sVEFx+cr3RfS+58h+ORw5T7yuKEF5gLtO/DyQDkQtJ4Llz9Qn0+aW1NhhTBlzEjWka0gO5rHRkAXUY+3BzxpVrOOOjPXU46FD8ZEZjXq3MmHMgNEDcGaQuykzQJn3cjOslMAXeS/xPFo8GKR34d5vWSMDNwEd36JXxDnvvc/BzDS6xrljDTMlkEnEjWoGda7vMYmda7AplWVkKm9Z5IppUVmGllA2ZaQNyY98JMS8JJZrtBM61YZEaQnZRpZdfLtKDrmiPMtEwOASeSk+1EEBlHTkLG8b5IxpETmHHcFNDezvthxiHhLG66QTOOssjImIuUceTSyzig65o7zDhMbgEncnPQezuxUZzezlqB3s7NhExrnUimdTMw08oDzLSAuDHrwkxLwknmuUEzrXLIjCAvKdPKq5dpQdc1X5hpmXwCTuQWhd6OEzKaqPj1yphfB+y0iKkA9vw3aMQsj/TsBUgRs4BexISua8EwYpqCAk7k1qBHTFfzlo/6J7GQiicDflZ5oL63kR+PQWQwtxJ6JhvJvaKY63v946a82wh6bxLpFd0KzDALAXtFQNyYTWGvSCJoFbpBM984ZIZWmJT5FtbLfKHrWiTMfE0RASdSNOi7cs7FM3blNgvsyhUlZFpbRDKtosBMqxgw0wLixmwJMy0JJ1nsBs20KiAzguKkTKu4XqYFXdcSYaZlSgg4kZJBz7ROJuNkWlsFMq2ShExrm0imVRKYaZUCZlpA3JhtYaYl4SRLBd1JKjztXpqUaZWOz7SSx79PEfWfL8bRNihdmHLGishpROR0yYiCnLel4MiZ8KoW/zPmOl/REZ9ZJp64MS7pQS/IPOsdykX9p4O8XqdWDvhZ85Lj9I10kGUiStGEFzpQlAFmawaYrUVF4cnlbO5slVQES9f7WbEBt4fDSyyhUipLSljKRiQsSSO4GPmC33wL8C1t//lqdQ1xr/ezTcIvkWtRLj4glE8RvyAJC1gu3tiRfyt/DSeHvi3plusnVWw8uEw5oMMsnwJrXDSRHDnLpYCB5X9e15I15vpeLZyNGc4kjuRM4nh9ZrPesvGPaPxabA/47WTulOlfk+H13kFqvaETkQrAgA+0tdkRcNw4vpwn8GWnAF9+I/BllwhfKgL5ArS12SWAm1ME3OwWwU2lgPrZ3QK4OUvATeUUwY8vFwnx5SsBe/9BsPfXIn7idqCfANrafC2Qj10i8OUbAb6cJ/DlWxG+3AHkC9DW5lsB3PxFwE2VgMdVp3cU4RajqgJ6JyHofaeA3kkJelcT0DsZQe/qAnonJ+hdQ0DvFAS97xLQOzVB77sF9E5D0LumgN5pCXrXEtA7PUHvewT0zkDQ+14BvTMS9K4toHcmgt51BPTOStD7PgG9sxH0vl9A7+wEvesK6J2ToHc9Ab1vIuj9gIDeuQh6Pyigd26C3vWBervHuNLZUTT+89y9IG5/2+1V/m7/0e2RnbM/3Z6E67Nesr9fscP1+Fy/y/V+ot19cvan6wu4GtnViyndN2Xb4WooV0+43Dqdfe9yTZd3uRzExePM9m9Z7HAxyvlr57ty2PeOyw7XzsZO35vt3/Lwvl2bdh9YA/Bzsemi/vOF+nzS2hrkGrBkfCjoj3y5R5AYAP0u4M/FOp0fIuj9vchzsQ8Bbxx+GLhRBsSN+T6DjJOkPRer4CQfDriT/J8oHg1WPBZIwoakO8Mb8u4Ml1jXRmGmZRoJOJFHgp5puc9jZFo/CGRajxD0PiySaT0CdEaPAjMtIG7M4TDTknCSj96gmVYsMiNoTMq0GutlWtB1bRJmWqaJgBN5jO1EEBnHY4SM40eRjOMxICkfD2hv58cw45BwFo/foBlHWWRkbErKOJrqZRzQdW0WZhymmYATaR703o47II/R2zkm0NtpTtD7uEim1RzojJ4AZlpA3JjjYaYl4SSfuEEzrXLIjKAFKdNqoZdpQde1ZZhpmZYCTqSVQm+nFWHLuBUQ7K11wE6LmApgb32DRszySM/ehhQx2+hFTOi6tg0jpmkr4ETaBb034Q5xZ/QmTgj0JtoR9D4p0ptoB3RGTwJ7E0DcmJNhb0LCST55g2ZacciMoD0p02qvl2lB17VDmGmZDgJOpGPQMy3n4hmZ1imBTKsjQe/TIplWR6Az6gTMtIC4MafDTEvCSXa6QTOtCsiMoDMp0+qsl2lB17VLmGmZLgJOpGvQM60YUk/rrECm1ZWg9zmRTKsr0Bk9Bcy0gLgx58JMS8JJPnWDZloVkRlBN1Km1U0v04Kua/cw0zLdBZxIj6BnWu6rqhmZ1gWBTKsHQe+LIplWD6Az6gnMtIC4MRfDTEvCSfa8QTOtSsiMoBcp0+qll2lB17V3mGmZ3gJO5OmgZ1plSD2tywKZ1tMEva+IZFpPA51RH2CmBcSNuRJmWhJOsk/QnaTCiYF9SZlWX16mZebbdV1AOFO8HwH07hUNlnNectxnPZMC64zQtnY2eYYQcJ8l4f5ZIu4NKenqn4KbdMVc38s4+/cn6D2AhIEBRAyw+JAk442JgeiMHJ+P/n7f54B+Gmhrg1y/SA49F88h1S7D1ujgyzgQ6fdVDVUyafBlHBQaKsaUFjDU4NBQMSZGwFBDgt47cN87xahxnxfI9Z8n5HlDSbn+UGKu72q9IYS1GCaAgWEEvYeTMDCciAEWH5IL1HsMDKQQqfdeANZ7QFubFKR67wXxeq+CQNIzIuhJj0t4KhNInzrgzs4F+hEEvdOIOLuRQGcHtLVJIxAkRxJw8yIpUXoxQtaEVzRhTVDr8BJuHcqpBraXUgRfxlFBD2znSNV8eoHANorgoDKIBLbRwMAGtLXJIBDYRhNwM4YU2MbwA1scMrC9HN4HbF4WCGxjSXckocFZAQnOcSE4zTgBcI4XAWd5JDhfwSldVhWcrwiAc0LQS4JLpJJgosDmzkRCajeJlNpNIm/wTSCsxWQBDEwm6D2FhIEp5A0+Bh8yC5R4DAxkEWkNTAW2BoC2NllIG3xTIziU8ApyiTwtTPTMNIFE79WgJ3pXSInedIEgP53g4GeQgvwMcqL3KmEtXhPAwGsEvV8nYeB1cqLH4EN2gUSPgYEcIoneTGCiB7S1yUFK9GbyE70WyERvVthuNrMEEr03RNrNLZHgnB2C08wWAOccEXC2QoJzbghOM1cAnG+KgBMa1ueF/RszTwCc84Pev4kmnTazQKB2X0Co294i1e5vkfs38wlr8bYABt4m6L2QhIGF5P4Ngw+5BPo3DAzkFunfLAL2b4C2NrlJ/ZtFYv2bxeFDGmaxQKL3jsLTh9UIji6vwEMa7xD0zifi4JcAHTzQ1iafQGKwhICbpaTkcCn/IQ1o73dZGNjMMoHAtlwhsFUnELWAQGBbTtC7oEhgWwEMbEBbm4ICgW0FATcrSYFtJT2wmRhkYHs33Dcy7woEtvc09o0M9MyHVSE4zSoBcK4W2dRsiwTn++GmpnlfAJxrgl4SpCRtaq4V2NBaS0jt1pFSu3XkTc01hLVYL4CB9QS9N5AwsIG8qcngQyGBEo+BgcIirYGNwNYA0NamMGlTcyN9UxNbIm8KEz2zSSDR+yDoiV4qUqL3oUCQ/5Dg4DeTgvxmcqL3AWEttghgYAtB749IGPiInOgx+FBMINFjYKC4SKL3MTDRA9raFCcleh/zE71yyERva9huNlsFEr1tInsh0MPuPgnBaT4RAOenIuCEHtCzPQSn2S4Azh0i4ISG9c/C/o35TACcnwe9f5OO1L/ZKVC77yTUbbtItfsucv/mc8JafCGAgS8Ien9JwsCX5P4Ngw+lBPo3DAyUFunf7Ab2b4C2NqVJ/ZvdYv2bPeFDGmaPQKL3lcJDGvcQHJ0ReEjjK4LesSIO/muggwfa2sQKJAZfE3Czl5Qc7uU/pAHt/e4LA5vZJxDYvlEIbPcSiFpeILB9Q9A7TiSwfQsMbEBbmziBwPYtATf7SYFtPz+wQc+LORDuG5kDAoHtO5F9I+iZD9+H4DTfC4DzoAg4KyHBeSjc1DSHBMD5Q9BLgsykTc3DAhtahwmp3RFSaneEvKn5A2Etjgpg4ChB7x9JGPiRvKnJ4EMlgRKPgYHKIq2Bn4CtAaCtTWXSpuZP/E1NaIl8LEz0zDGBRO940BO9LKRE72eBIP8zwcH/Qgryv5ATveOEtTghgIETBL1PkjBwkpzoMfhQRSDRY2Cgqkii9ysw0QPa2lQlJXq/8hO9NshE77ew3Wx+E0j0Tom0m6GH3Z0OwWlOC4DzjAY4Y6EH9PwegtP8LgDOsyKeExrWz4X9G3NOAJx/BL1/k4PUvzkvULufJ9RtF0i1+wVy/+YPwlpcFMDARYLel0gYuETu3zD4UF2gf8PAQA2R/s2fwP4N0NamBql/86dY/+Zy+JCGuSyQ6F1ReEijHsHR1RR4SOMKQe9aIg7+L6CDB9ra1BJIDP4i4CYqJSewuc8lP6QB7f0mSRkGNuAa0GSMTikQ2B4gELW2QGCLTonXu45IYEuKA6YB2trUEQhsSQm4SUYKbMnogS0Wel5McuA6qAa25AKBLUVKjp9DgxN65kPKEJwmpQA4U4mAsywSnKlxSstuaqYWAGeaoJcEN5M2NdOmDH5ql5aQ2qUjpXbuc/OTQOrKozSEtUgvgIH0BL0zkDCQgYgBFh/qCpR4DAzUE2kNZAS2BoC2NvVIm5oZU7I3NbElcqYw0TOZBBK9zEFP9PKQEr0sAkE+C8HBZyUF+azkRC8zYS2yCWAgG0Hv7CQMZCcnegw+1BdI9BgYaCCS6OUAJnpAW5sGpEQvB5FDt5BiaU4BP5qTwKGbSH70JjIG/rGvDP7cWGDxkEsAT7kIeMpNwlNuclxmcKuhQFxmYKCRSFy+GRiXgbY2jUhx+eZ4Drn3aaP+84W2GRqvW6ODL2MepN9XNVTJpMGXMW9oqBhTWsBQ+UJDxZgYAUPdonAP7i2EfCe/QK6fn6B3AVKuX4CY6xeKrx3Ra1FQAAMFCRi4lYSBW8n1HoMPjQXqPQYGmojUe7cB6z2grU0TUr13m3i9V0Eg6SmkkPQUIpC+acCd3VJSoG8m4uwKA50d0NammUCQLEzgSxFSolQkXlZVJ79QwMkXDbqTL0Jydi0CTlYX3IoSyNpSxMkXAzp5oK1NSwEnX4yAm+IkJ19c3MkvEXDyJcI+c4xZJmCokgolV0mCdykl0GMsRdC7NMmrlib2GEuQMrIyAhgoQ8BADAkDMeQ+M4MPbQSyKwYG2opk5QaYlQNtbdqS+sxGvM+8WiDpiQ2z0xizRsBQZUNDxZh1AoYqFxoqxmwQMFR5hXqvPCHfiRPI9eMIelcg5foViLl+GVK9V1EAAxUJGKhEwkAlcr3H4EN7gXqPgYEOIvVeZWC9B7S16UCq9yqL13sfCiQ9tyskPbcTSN854M7uXVKg7yLi7O4AOjugrU0XgSB5B4EvVUiJUhXxLectAk6+qoKTr0oAbbeAk/U9kpPvLuLk7wQ6eaCtTXcBJ38ngS/VSE6+mriT/1jAyVcP+8wxZpuAoWooROMaBO9yl0CP8S6C3neTvOrdxB5jWVJmUlMAAzUJGKhFwkAtcp+ZwYdeAtkVAwO9RbLye4BZOdDWpjepz3wP/cBoE4M8MPpeoC9RTfTuTRl8GWun5PAdDU6DBGedEJymjgA47xMBZywSnPeH4DT3C4Czrgg4oWG9Hvh7IBTBWU8AnA8o9G8eINQvDwrU7g8yzr0n1e71ibV7BVL/poEABhoQMPAQCQMPkfs3DD70FejfMDDQT6R/8zCwfwO0telH6t88LNa/aYizTznVRK+hQKLXSCHRa0RwdP0D7uDXkpKbASIO/hGggwfa2gwQSAweIfDlUVJy+GiErAmvIPd+G4eBzTQWCGxNFAJbEwJRBwXcQa0jBbbBIoHtMWBgA9raDBYIbI8R+PI4KbA9zg9sccjA1jTcNzJNBQJbM5F9I+j3hzcP941McwFwPqGQdT1BiCItBPYMWjBO9yVFz5bEPYPbSRloKwEMtCJgoDUJA63J+0YMPgwVyKIZGBgmUn21AVZfQFubYaR9ozb8faOKyESvbViFmLYCiV47kSqkEhKcT4bgNE8KgLO9CDhbIMHZIQSn6SAAzo4i4ISG9U5h/8Z0EgBnZ4X+TWdC/dJFoHbvQtC7K6l270qs3e8k9W+eEsDAU4wThEgY6Ebu3zD4MEKgf8PAwEiR/k13YP8GaGszktS/6S7Wv+kR3h5leggkej0VEr2eBEc3KuAO/gNScjNaxMH3Ajp4oK3NaIHEoBfjQBdSctibf3sUtPf7dBjYzNMCga2PQmDrQyDq2IA7qA9JgW2cSGDrCwxsQFubcQKBrS/jSVdSYOvHD2xtkIHtmXDfyDwjENieFdk3aoUEZ/9w38j0FwDnAIWsawAhijwnsGfwHEHvgaToOZC4Z3AXKQMdJICBQQQMDCZhYDB534jBhwkCWTQDAxNFqq8hwOoLaGszkbRvNIS+bxQLPS/m+bAKMc8LJHpDNaqQWOiZD8NCcJphAuAcLgJO6Hm/L4TgNC8IgHOECDihYX1k2L8xIwXA+aJC/+ZFQv3ykkDt/hLjNhhS7T6KWLvfw7o1RgADowkYGEPCwBhy/4bBhykC/RsGBqaK9G9eBvZvgLY2U0n9m5fF+jdjw9ujzFiBRG+cQqI3juDopgfcwW8lJTczRBz8eKCDB9razBBIDMYT+PIKKTl8hX57FLb3OyEMbGaCQGCbqBDYJhKIOjPgDmobKbDNEglsk4CBDWhrM0sgsE0i8GUyKbBN5gc26Hm/U8J9IzNFILBNFdk3gp73Oy3cNzLTBMD5qkLW9SqjnSCwZzCdoPcMUvScQdwzuI+Ugb4mgIHXCBh4nYSB18n7Rgw+zBHIohkYmCtSfc0EVl9AW5u5pH2jmfx9I+h5MbPCKsTMEkj03hCpQqBnPswOwWlmC4Bzjgg4oef9zg3BaeYKgPNNEXBCw/q8sH9j5gmAc75C/2Y+oX5ZIFC7LyDo/Rapdn+LWLs/QOrfvC2AgbcJGFhIwsBCcv+GwYf5Av0bBgYWiPRvFgH7N0BbmwWk/s0isf7N4vD2KLNYINF7RyHRe4cR7ALu4D8jJTeLRBz8EqCDB9raLBJIDJYQ+LKUlBwu5d8eBe39LgsDm1kmENiWKwS25QSiLgm4g/qcFNiWigS2FcDABrS1WSoQ2FYQ+LKSFNhW8gMb9Lzfd8N9I/OuQGB7T2TfCHre76pw38isEgDnaoWsazUhirwvsGfwPkHvNaTouYa4Z/AQKQNdK4CBtQQMrCNhYB1534jBhxUCWTQDAytFqq/1wOoLaGuzkrRvtJ6+b1QWel7MhrAKMRsEEr2NGlVIWeiZD5tCcJpNAuD8QASc0PN+PwzBaT4UAOdmEXBCw/qWsH9jtgiA8yOF/s1HhPrlY4Ha/WOC3ltJtftWYu3+CKl/s00AA9sIGPiEhIFPyP0bBh9WCfRvGBhYLdK/+RTYvwHa2qwm9W8+FevfbA9vjzLbBRK9HQqJ3g6Co1sbcAe/m5TcrBNx8J8BHTzQ1madQGLwGYEvn5OSw8/pt0dhe787w8BmdgoEtl0KgW0XgagbA+6g9pAC2yaRwPYFMLABbW02CQS2Lwh8+ZIU2L7kBzboeb+7w30js1sgsO0R2TeCnvf7VbhvZL4SAOfXClnX14Qosldgz2AvQe99pOi5j7hn8BgpA/1GAAPfEDDwLQkD35L3jRh82CyQRTMwsEWk+toPrL6AtjZbSPtG+/n7RtDzYg6EVYg5IJDofSdShUDPfPg+BKf5XgCcB0XACT3v91AITnNIAJw/iIATGtYPh/0bc1gAnEcU+jdHCPXLUYHa/ShB7x9JtfuPxNq9Oal/85MABn4iYOAYCQPHyP0bBh+2CvRvGBjYJtK/OQ7s3wBtbbaR+jfHxfo3P4e3R5mfBRK9XxQSvV8Ijm57wB38N6TkZoeIgz8BdPBAW5sdAonBCQJfTpKSw5P826Ogvd9fw8BmfhUIbL8pBLbfCETdGXAH9S0psO0SCWyngIENaGuzSyCwnSLw5TQpsJ3mBzboeb9nwn0jc0YgsP0usm8EPe/3bLhvZM4KgPOcQtZ1jhBF/hDYM/iDoPd5UvQ8T9wzaEXKQC8IYOACAQMXSRi4SN43YvBht0AWzcDAHpHq6xKw+gLa2uwh7Rtdou8blYOeF/NnWIWYPwUSvcsaVUg56JkPV0JwmisC4PxLBJzQ836jUoXgRK4BS8YkqTTACQ3r0TilZfs30QLgTIqWkdG/cUKi65dkYMUZdVsygt7JgXpH1h3uc/OTQNqO1L9JIYCBFAQMpCRhIGUqbv+GwYe9Av0bBgb2ifRvUuGwaoC2NvtI/ZtUqbT6N6lx9pG9PSq1QKKXRiHRS0NwdPsD7uAPkpKbAyIOPi3QwQNtbQ4IJAZpCXxJR0oO06Vi3x6F7f2mDwObSS8Q2DIoBLYMBKIeDLiDOkQKbIdEAltGYGAD2tocEghsGQl8yUQKbJn4gQ163m/mcN/IZBYIbFlE9o2g5/1mDfeNTFYBcGZTyLqyEaJIdoE9g+wEvXOQomcO4p5BR1IGmlMAAzkJGLiJhIGbyPtGDD4cEciiGRg4KlJ95QJWX0Bbm6OkfaNc/H0j6HkxucMqxOQWSPRuFqlCoGc+5AnBafIIgDOvCDih5/3mC8Fp8gmA8xYRcELDev6wf2PyC4CzgEL/pgChfikoULsXJOh9K6l2v5VYu3cl9W9uE8DAbQQMFCJhoBC5f8PgwzGB/g0DA8dF+jeFgf0boK3NcVL/prBY/6ZIeHuUKSKQ6BVVSPSKEhzdiYA7+B9Jyc1JEQdfDOjggbY2JwUSg2IEvhQnJYfF+bdHQXu/JcLAZkoIBLaSCoGtJIGopwLuoH4iBbbTIoGtFDCwAW1tTgsEtlIEvpQmBbbS/MAGPe+3TLhvZMoIBLYYkX0j6Hm/Jtw3MkYAnLEKWVcsIYqUFdgzKEvQuxwpepYj7hn0IGWg5QUwUJ6AgTgSBuLI+0YMPpwVyKIZGDgnUn1VAFZfQFubc6R9owr0faPy0PNiKoZViKkokOhV0qhCykPPfKgcgtNUFgDn7SLghJ73e0cITnOHADiriIATGtarhv0bU1UAnHcq9G/uJNQv1QRq92oEvauTavfqxNr9aVL/poYABmoQMHAXCQN3kfs3DD5cEOjfMDBwUaR/czewfwO0tblI6t/cLda/qRneHmVqCiR6tRQSvVoER3c54A7+BCm5uSLi4O8BOnigrc0VgcTgHgJf7iUlh/fSb4/C9n5rh4HN1BYIbHUUAlsdAlGTZAq2gzpJCmzRmfCgdC90YLsPGNiAtjbRAceNc+L3EfhyPymw3c8PbNDzfuuG+0amrkBgqyeybwQ97/eBcN/IPCAAzgcVsq4HCVGkvsCeQX2C3g1I0bMBc8+AlIE+JICBhwgYeJiEgYfJ+0YMPiQXyKIZGEghUn01BFZfQFsb5PpFcqghf98Iel5Mo7AKMY0EEr1HRKoQ6JkPj4bgNI8KgLOxCDih5/02CcFpmgiA8zERcELD+uNh/8Y8LgDOpgr9m6aE+qWZQO3ejKB3c1Lt3pxYuz9H6t88IYCBJwgYaEHCQAty/4bBh9QC/RsGBtKI9G9aAvs3QFubNKT+TUux/k2r8PYo00og0WutkOi1Jji69AF38GdIyU0GEQffBujggbY2GQQSgzYEvrQlJYdt+bdHQXu/7cLAZtoJBLYnFQLbkwSiZg64g/qdFNiyiAS29sDABrS1ySIQ2NoT+NKBFNg68AMb9LzfjuG+kekoENg6iewbQc/77RzuG5nOAuDsopB1dSFEka4CewZdCXo/RYqeTxH3DIaQMtBuAhjoRsBAdxIGupP3jRh8yC6QRTMwkEOk+uoBrL6AtjbI9YvkUA/6vlEc9LyYnmEVYnoKJHq9NKqQOOiZD71DcJreAuB8WgSc0PN++4TgNH0EwNlXBJzQsN4v7N+YfgLgfEahf/MMoX55VqB2f5agd39S7d6fWLsPJ/VvBghgYAABA8+RMPAcuX/D4EMugf4NAwO5Rfo3A4H9G6CtTW5S/2agWP9mUHh7lBkkkOgNVkj0BhMcXd6AO/gLpOQmn4iDHwJ08EBbm3wCicEQAl+eJyWHz9Nvj8L2foeGgc0MFQhswxQC2zACUQsE3EFdJAW2giKBbTgwsAFtbQoKBLbhBL68QApsL/ADG/S83xHhvpEZIRDYRorsG0HP+30x3DcyLwqA8yWFrOslQhQZJbBnMIqg92hS9BxN3DN4kZSBjhHAwBgCBl4mYeBl8r4Rgw+FBLJoBgYKi1RfY4HVF9DWBrl+kRway983gp4XMy6sQsw4gURvvEgVAj3z4ZUQnOYVAXBOEAEn9LzfiSE4zUQBcE4SASc0rE8O+zdmsgA4pyj0b6YQ6pepArX7VILe00i1+zRi7T6G1L95VQADrxIwMJ2Egenk/g2DD8UE+jcMDBQX6d/MAPZvgLY2xUn9mxli/ZvXwtujzGsCid7rCone6wRHVyrgDv4vUnJTWsTBzwQ6eKCtTWmBxGAmgS+zSMnhLP7tUdDe7xthYDNvCAS22QqBbTaBqCbgDioqBSewxYoEtjnAwAa0tYkVCGxzCHyZSwpsc/mBDXre75vhvpF5UyCwzRPZN4Ke9zs/3Dcy8wXAuUAh61pAiCJvCewZvEXQ+21S9HybuGcwntRaWSiAgYUEDCwiYWARed+IwYfyAlk0AwNxItXXYmD1BbS1Qa5fJIcW0/eNKkDPi3knrELMOwKJ3hKNKqQC9MyHpSE4zVIBcC4TASf0vN/lITjNcgFwrhABJzSsrwz7N2alADjfVejfvEuoX94TqN3fI+i9ilS7ryLW7pNI/ZvVAhhYTcDA+yQMvE/u3zD4UEmgf8PAQGWR/s0aYP8GaGtTmdS/WSPWv1kb3h5l1gokeusUEr11BEdXJeAOPjnp9qiqIg5+PdDBA21tqgokBusJfNlASg430G+PwvZ+N4aBzWwUCGybFALbJgJRqwfcQaUgBbYaIoHtA2BgA9ra1BAIbB8Q+PIhKbB9yA9s0PN+N4f7RmazQGDbIrJvBD3v96Nw38h8JADOjxWyro8JUWSrwJ7BVoLe20jRcxtxz2Aaad/oEwEMfELAwKckDHxK3jdi8KGmQBbNwEAtkeprO7D6AtraINcvkkPb+ftG0PNidoRViNkhkOh9JlKFQM98+DwEp/lcAJw7RcAJPe93VwhOs0sAnF+IgBMa1r8M+zfmSwFw7lbo3+wm1C97BGr3PQS9vyLV7l8Ra/fXSP2brwUw8DUBA3tJGNhL7t8w+FBboH/DwEAdkf7NPmD/BmhrU4fUv9kn1r/5Jrw9ynwjkOh9q5DofUtwdHUD7uDTkm6Pqifi4PcDHTzQ1qaeQGKwn8CXA6Tk8AD/9iho7/e7MLCZ7wQC2/cKge17AlHrB9xBpSMFtgYige0gMLABbW0aCAS2gwS+HCIFtkP8wAY97/eHcN/I/CAQ2A6L7BtBz/s9Eu4bmSMC4DyqkHUdJUSRHwX2DH4k6P0TKXr+RNwzeIO0b3RMAAPHCBg4TsLAcfK+EYMPDQWyaAYGGolUXz8Dqy+grQ1y/SI59DORQ3Pd2fnJ0YnjP2M0yt6/CPjkXwh8PEHyySfIeGLE5ZMCGDhJwMCvJAz8So7LDD40FojLDAw0EYnLvwHjMtDWpgkpLv92jfs50Gt6CrimSTLiPis6I2dNTxH90slkUVHzkuP5eZrko0//F/iKub6XQeIrch2ud03PkNb0DBFfLuetQMh9mgY87rl8byBB72Yice93IIeAtjbNAo4bx5eKBNy0EODLIILeLUX4chbIF6CtTUsBvlQi4KaNAF8GE/RuK8KXc0C+AG1tVNbvD+D6JQfWUClINdQfxBz3d1INdZ6U759PhBoKia/zwBrqAmlNLxDx5bBVmeDr2wv0DkcS9O4g4qMvAjkEtLXpQOodXozoE6OxdI7kozsLcGg0gUNdRDh0CcghoK1NFxKHLhE55Gqt2wlY6iZQa40l6N1dhEN/AjkEtLXpLtCbuIOAm14CfBlP0Lu3CF8uA/kCtLVRWb8rwPXLDOxNZCH1Jq4Qa8dLpLz3L1Id/Vci9CaQ+PoL2JuISs1ZU/e5+f9f1vR6ZU+Ck91kB3I2B4mzSVLzOHuFxNloEr6iU/M5i8RX5Dpc75omJa1pUiK+XF5ahZCf9RXIS98g6N1PJK9KBuQQ0Namn0AdV5WAm/4CfJlD0HuACF+SA/kCtLUZIMCXOwm4GSTAlzcJeg8W4UsKIF+AtjYq65cSuH65gDVUblINlZKY40Yn59RQqUj5fqpEqKGQ+EoFrKFSk9Y0NRFfDlvVCL5+qMB+8hKC3sNEfHQaIIeAtjbI9YvkkNOXtZ/sOFSdgKURAhxaQdB7pAiH0gI5BLS1GUniUFoih1ytVYOApVECtdZ7BL1Hi3AoHZBDQFub0QK9ibsIuBkrwJfVBL3HifAlPZAvQFsblfXLAFy/QsDeRGFSbyIDsXZMSepNZCTV0RkToTeBxFdGYG8iE2lNMyXCPRmZgWtaDMjZ4iTOZiZyNhWJs1lI+MqSCJxF4isLkLNZSWualXxPxt2E/GyCQF66jaD3RJG8KhuQQ0Bbm4kCdVxNAm6mCPDlU4LeU0X4kh3IF6CtzVQBvtQi4Ga6AF92EPSeIcKXHEC+AG1tVNYvJ3D9SgFrqNKkGionMcdNR6qhbiLl+zclQg2FxNdNwBoqF2lNc5HvybiH4OtnCuwnf03Qe5aIj84N5BDQ1ga5fpEcyk2+J+NeApbmCHDoW4Lec0U4dDOQQ0Bbm7kkDt1MviejNgFL8wVqre8Iei8Q4VAeIIeAtjYLBHoTdQi4WSjAl4MEvReJ8CUvkC9AWxuV9csHXL9KwN5EZVJvIh+xdsxM6k3cQqqjb0mE3gQSX7cAexP5SWuaPxHuySgAXNMqQM5WJXG2AJGzWUicLUjCV8FE4CwSXwWBnL2VtKa3ku/JuI+Qny0RyEtPEfReKpJX3QbkENDWZqlAHXc/ATcrBPhyhqD3ShG+FALyBWhrs1KAL3UJuFklwJezBL1Xi/ClMJAvQFsblfUrAly/6sAaqgaphipCzHFzkGqooqR8v2gi1FBIfBUF1lDFSGtajHxPRj2Cr18rsJ/8F0HvdSI+ujiQQ0BbG+T6RXKoOPmejAcIWNoowKGkKfF6bxLhUAkgh4C2NptIHCpBvifjQQKHNgvUWikIHNoiwqGSQA4BbW22CPQm6hP4slWAL6kIfNkmwpdSQL4AbW1U1q80cP3qAnsT9Ui9idLE2vFmUm+iDKmOLpMIvQkkvsoAexMxpDWNSYR7MgxwTesDOduAxFlD5GweEmdjSfiKTQTOIvEVC+RsWdKalk0EzpYDrmlDIGcbkThbjsjZW0icLU/CV/lE4CwSX+WBnI0jrWkc+T6qPISaanvAa8nFVu9YQg29Q6QWqgDkENDWZodA7yUvgS87A673OyS+7BLhS0UgX4C2NrsE+JKPwJfdAdd7CYkve0T4UgnIF6Ctjcr6VQauX2NgDdWEVENVJua4hUg11O2kfP/2RKihkPi6HVhD3UFa0zvI91EtJeBrr8A9IIUJsX2fiI+uAuQQ0NYGuX6RHKpCvAekCMlH7xfgUDEChw6IcKgqkENAW5sDJA5VJd9HVYKApYMB59AyUq11SIRDdwI5BLS1UVm/asD1awOstdqSaq1qxFy4BCmOVyfVBdUTodZC4qs6sNaqQVrTGuT9qlhCjDsS8Bi3nBTjjor46LuAHALa2hwNOG4cX8oS+HIs4HqvIPHluAhf7gbyBWhrc1yAL+UIfDkRcL1XkvhyUoQvNYF8AdraqKxfLeD6tQfWUB1INVQtYo5bhlRD3UPK9+9JhBoKia97gDXUvaQ1vZe8X/UuAV+nBHrtdxBi+2kRH10byCGgrQ1y/SI5VJv83P97BA6dFeDQnQQOnRPhUB0gh4C2NudIHKpD3q+qTsDShYBzaBWp1roowqH7gBwC2tqorN/9wPXrBay1epNqrfuJuXBZUq1Vl1QX1E2EWguJr7rAWqseaU3rkferahNi3OWAx7jVpBh3RcRHPwDkENDW5krAcfOPc90JfEmSOdh6v0/iS3RmDb48COQL0NYmOuC4+cc51QS+JA+43mtIfEkhwpf6QL4AbW1U1q8BcP36AmuofqQaqgExx61AqqEeIuX7DyVCDYXE10PAGuph0po+TN6vWkvAV+qAxzjXa3+EENvTiPjohkAOAW1tkOsXyaGG5P2qdQQOpRfg0GMEDmUQ4VAjIIeAtjYZSBxqRN6vakbAUuaAc2g9qdbKIsKhR4AcAtraqKzfo8D1GwqstYaRaq1Hibnw7aRaqzGpLmicCLUWEl+NgbVWE9KaNiHvV7UjxLjsAY9xG0gxLoeIj34MyCGgrU0Ogf57ewJfcgVc740kvuQW4cvjQL4AbW1yC/ClI4EveQOu9yYSX/KJ8KUpkC9AWxuV9WsGXL8RwBpqJKmGakbMce8k1VDNSfl+80SooZD4ag6soZ4grekT5P2qDwj4KiDQa+9FiO0FRXx0CyCHgLY2BUm99hbk/aoPCRwqJMChvgQOFRbhUEsgh4C2NoVJHGpJ3q96loClYgHn0GZSrVVchEOtgBwC2tqorF9r4PpNANZaE0m1VmtiLnwXqdZqQ6oL2iRCrYXEVxtgrdWWtKZtyftVQwkxrlTAY9wWUowrLeKj2wE5BLS1KS3Qfx9O4IsJuN4fkfgSK8KXJ4F8AdraxArwZQSBL+UDrvfHJL7EifClPfI7RoF8UVm/DsD1mwKsoaaSaqgOxBz3HlIN1ZGU73dMhBoKia+OwBqqE2lNO5H3q7YS8FVJoNc+nhDbK4v46M5ADgFtbSqTeu2dyftV2wgcqiLAoUkEDlUV4VAXIIeAtjZVSRzqQt6vmkrAUvWAc+gTUq1VQ4RDXZHfjwPkkMr6PQVcvznAWmsuqdZ6ipgL30eqtbqR6oJuiVBrIfHVDVhrdSetaXfyftUbhBhXM+Ax7lNSjKsl4qN7ADkEtLWpJdB/n0PgS+2A672dxJc6InzpCeQL0NamjgBf3iTwpW7A9d5B4ks9Eb70Qp7ZDOSLyvr1Bq7ffGANtYBUQ/Um5rgPkGqop0n5/tOJUEMh8fU0sIbqQ1rTPuT9qs8I+Kov0GtfQojtDUR8dF8gh4C2Ng1Ivfa+5P2qzwkcaijAoRUEDjUS4VA/IIeAtjaNSBzqR96veo+ApcYB59BOUq3VRIRDzyDPGwNySGX9ngWu3wpgrbWSVGs9S8yFHyLVWv1JdUH/RKi1kPjqD6y1BpDWdAB5v2ojIcY1DXiM20WKcc1EfPRzQA4BbW2aCfTfPyDwpUXA9f6CxJeWInwZCOQL0NampQBfNhP40ibgen9J4ktbEb4MQj4DD+SLyvoNBq7fKmANtZpUQw0m5riPkGqoIaR8f0gi1FBIfA0B1lDPk9b0efJ+1W4CvtoL9No/I8T2DiI+eiiQQ0Bbmw6kXvtQ8n7VHgKHOgtw6AsCh7qIcGgYkENAW5suJA4NI+9X7SFgqVvAOfQVqdbqLsKh4cjnN4AcUlm/F4DrtxlYa20h1VovEHPhx0i11ghSXTAiEWotJL5GAGutkaQ1HUner/qOEON6BTzGfU2Kcb1FfPSLQA4BbW16C/TfDxL40jfgeu8l8aWfCF9eAvIFaGvTT4AvPxD40j/geu8j8WWACF9GIe8pAvJFZf1GA9dvK7CG2kaqoUYTc9zmpBpqDCnfH5MINRQSX2OANdTLpDV9mbxf9Q0BX4MEeu0nCLF9sIiPHgvkENDWZjCp1z6WvF/1LYFDQwU4dIrAoWEiHBoH5BDQ1mYYiUPjyPtVvxOwNCLgHNpPqrVGinBoPLIfDuSQyvq9Aly/3cBaaw+p1nqFmAu3ItVaE0h1wYREqLWQ+JoArLUmktZ0Inm/6jIhxo0KeIw7QIpxo0V89CQgh4C2NqMF+u9/EfgyNuB6f0fiyzgRvkwG8gVoazNOgC9JUhHyl4Dr/T2JLxNF+DIFmaMB+aKyflOB67cXWEPtI9VQU4k5bjtSDTWNlO9PS4QaComvacAa6lXSmr5K3q86SMDXFIFee1pCbJ8q4qOnI79jEBjjppJ67dPJ+1WHCByaLsChjAQOzRDh0Awgh4C2NjNIHJpB3q/KQsDSzIBz6AdSrTVLhEOvATkEtLVRWb/Xget3BFhrHSXVWq8Tc+GOpFprJqkumJkItRYSXzOBtdYs0prOIu9X3UyIcXMCHuMOk2LcXBEf/QbyOwaBMW6uQP89L4Ev8wOu9xESXxaI8GU28vtkgHxZIMCXWwh8WRhwvY+S+LJIhC9zgHwB2tqorN9c4PodA9ZQx0k11FxijtuVVEO9Scr330yEGgqJrzeBNdQ80prOI+9X/UjA1xKBXnsxQmxfKuKj5wM5BLS1WUrqtc8n71f9RODQCgEOlSJwaKUIhxYgvzsGyKGVJA4tIO9XxRCwtCrgHDpGqrVWi3DoLeTZ4UAOqazf28D1Owustc6Raq23iblwD1KttZBUFyxMhFoLia+FwFprEWlNF5H3qyoRYtzagMe446QYt07ERy8Gcghoa7NOoP9+O4EvGwOu988kvmwS4cs7QL4AbW02CfClCoEvmwOu9y8kvmwR4csS5JngQL6orN9S4PpdANZQF0k11FJijvs0qYZaRsr3lyVCDYXE1zJgDbWctKbLyftVJwj42irQa7+HENu3ifjoFcgzW4Exbhup176CvF91ksCh7QIcuo/AoR0iHFoJ5BDQ1mYHiUMryftV9QhY2hlwDv1KqrV2iXDoXSCHgLY2Kuv3HnD9kmfCfVaKTBwf9B4xF36GVGutItUFqxKh1kLiaxWw1lpNWtPV5P2qRwgxbnfAY9xvpBi3R8RHv488sxUY4/YI9N8bE/iyN+B6nyLxZZ8IX9Ygz+cC8mWfAF8eI/Blf8D1Pk3iywERvqwF8gVoa6OyfuuA65caWEOlIdVQ64g57nOkGmo9Kd9fnwg1FBJf64E11AbSmm4g71edIeDroECvvQ0hth8S8dEbgRwC2tocIvXaN5L3q34ncOiIAIfaEzh0VIRDm5BncQE5dJTEoU3k/apOBCwdCziHzpJqreMiHPoAeRYDkEMq6/chcP2yA2utHKRa60NiLjyEVGttJtUFmxOh1kLiazOw1tpCWtMt5P2qXoQYdyLgMe4cKcadFPHRHwE5BLS1OSnQf3+awJdTAdf7DxJfTovw5WMgX4C2NqcF+NKXwJezAdf7PIkv50T4shV5xgKQLyrrtw24frmANVRuUg21jZjjDifVUJ+Q8v1PEqGGQuLrE2AN9SlpTT8l71ddIODrgkCvfQghtl8U8dHbkc/AAmPcRVKvfTt5v+oigUOXBTg0nMChKyIc2gHkENDW5gqJQzvI+1UjCVhKkiXYHLpEqrWis2hw6DMgh4C2Nirr9zlw/QoBa63CpFrrc2Iu/CKp1tpJqgt2JkKthcTXTmCttYu0prvI+1XjCTEuecBj3J+kGJdCxEd/gXwGFhjjUgQcN44vEwh8SR1wvS+T+JJGhC9fIp93APIljQBfJhH4kj7gel8h8SWDCF92A/kCtLVRWb89wPUrBqyhipNqqD3EHHcMqYb6ipTvf5UINRQSX18Ba6ivSWv6NXm/6i8CvjIHPMa5XvtMQmzPIuKj9wI5BLS1Qa5fJIf2kverogj5UnYBDs0hcCiHCIf2IZ9tAHIoB4lD+8j7VfMIWMoVcA4lScGptXKLcOgb5L1tQA6prN+3wPUrD6y14ki11rfEXHg8qdbaT6oL9idCrYXE135grXWAtKYHyPtVSwgxLm/AY1w0KcblE/HR3wE5BLS1ySfQf19G4EuBgOudlMSXgiJ8+R7IF6CtTUEBvqwg8KVQwPVORuJLYRG+HETeswbki8r6HQKuXyVgDVWZVEMdIua4k0g11A+kfP+HRKihkPj6AVhDHSat6WHyflVygq8vJtBrX0+I7cVFfPQR5D0FwBhXnNRrP0Ler0pB4FApAQ59QOBQaREOHQVyCGhrU5rEoaPk/aotBCyZgHMoJanWihXh0I9ADgFtbVTW7yfg+tUE1lq1SLXWT8RceBqp1jpGqguOJUKthcTXMWCtdZy0psfJ+1WfEWJc+YDHuFSkGBcn4qN/Rt5TAIxxcQL9950EvlQKuN6pSXypLMKXX5D9YyBfKgvw5QsCX6oEXO80JL5UFeHLCSBfgLY2Kut3Erh+tYE1VB1SDXWSmOO+RqqhfiXl+78mQg2FxNevwBrqN9Ka/kber0pL8PXVBXrt+wmxvYaIjz4F5BDQ1qYGqdd+irxflY7AoZoCHDpI4FAtEQ6dRvaKgRyqReLQafJ+1WEClmoHnEPpSbVWHREOnUHWCkAOqazf78D1awistRqRaq3fibnwG6Ra6yypLjibCLUWEl9ngbXWOdKanvsv1vR6Zf8DuKaNgZxtQuLsH0TOziVx9jwJX+cTgbNIfJ0HcvYCaU0vxK+pO+YiOgJjkS807ipGYXVJeF1MTRT4Ymr8514CAoSl96XU/1pg0Of+W1IXDZb5TCrcmv4JdAbXss91bx7H2we9hpWAMl5OjcUNGuPOxpdT421zheSwr0Q4bPdKEfWfryA7bKacFUTkjBORM9KXxlzn61ryXfdNJPYzkkXh/V8y4GdVJtk6CqtzzNUYgoMJGQic80saYfgoIgkQmXfbf74YBjQJv0SuxV8JSVua+AVJiB5/xUe6yL+5/5T/KqHQZdWF6890Y+NZb/5CZs1psMZFezhHmr9IGTiYKBUvkDKpJGk4mVSSNNxbAxYTWit1BbY1KxAwUE9kSyEah1UDtLWpF3DcOL68Q+BLfQG+VCTwpYEIX5IC+QK0tWkgwJclBL40FOBLJQJfGonwJRmQL0Bbm0YCfFlG4EtjAb7cSeBLExG+JAfyBWhr00SAL8sJfGkqwJe7CHxpJsKXFEC+AG1tmgnwZQWBLy0E+HI3gS8tRfiSEsgXoK1NSwG+rCTwpY0AX2oS+NJWhC+pgHwB2tq0FeDLKgJf2gvw5T4CXzqI8CU1kC9AW5sOAnxZTeBLZwG+PEDgSxcRvqQB8gVoa9NFgC/vE/jSTYAvDxL40l2EL2mBfAHa2nQX4MsaAl96CfClPoEvvUX4kg7IF6CtTW8Bvqwn8KWvAF8eIfClnwhf0gP5ArS16SfAlw0EvvQX4MtjBL4MEOFLBiBfgLY2AwT4spHAl0ECfHmcwJfBInzJCOQL0NZmsABfNhH4MlSAL00JfBkmwpdMQL4AbW2GCfBlM4EvIwT40orAl5EifMkM5AvQ1makAF+2EPgySoAv7Qh8GS3ClyxAvgBtbUYL8OUjAl/GCvDlSQJfxonwJSuQL0Bbm3ECfPmYwJcJAnxpT+DLRBG+ZAPyBWhrM1GAL58Q+DJFgC9dCXyZKsKX7EC+AG1tpgrw5VMCX6YL8KUHgS8zRPiSA8gXoK3NDAG+bCfwZaYAX3oS+DJLhC85gXwB2trMEuDLDgJf5gjwpReBL3NF+HITkC9AW5u5AnzZSeDLfAG+PEPgywIRvuQC8gVoa7NAgC+7CHxZKMCX5wh8WSTCl9xAvgBtbRYJ8OULAl+WCPBlIIEvS0X4cjOQL0Bbm6UCfPmSwJcVAnwZRODLShG+5AHyBWhrs1KAL18R+LJKgC/DCXxZLcKXvEC+AG1tVgvw5WsCX9YK8OVFAl/WifAlH5AvQFubdQJ82Uvgy0YBvrxE4MsmEb7cAuQL0NZmkwBf9hH4slmAL6MIfNkiwpf8QL4AbW22CPBlP4EvWwX4Mp7Al20ifCkA5AvQ1mabAF8OEPiyXYAvkwh82SHCl4JAvgBtbXYI8OU7Al92CvBlMoEvu0T4ciuQL0Bbm10CfPmewJfdAnyZQuDLHhG+3AbkC9DWZo8AX34g8GWvAF9eI/BlnwhfCgH5ArS12SfAl8MEvuwX4MsbBL4cEOFLYSBfgLY2BwT4coTAl4MCfJlN4MshEb4UAfIFaGtzSIAvRwl8OSLAlzkEvhwV4UtRIF+AtjZHBfhyjMCXYwJ8eYvAl+MifCkG5AvQ1ua4AF+OE/hyQoAviwl8OSnCl+JAvgBtbU4K8OVnAl9OCfDlHQJfTovwpQSQL0Bbm9MCfPmFwJezAnxZQuDLORG+lATyBWhrc06AL78S+HJBgC/vEvhyUYQvpYB8AdraXBTgy28EvlwW4Mv7BL5cEeFLaSBfgLY2VwT4corAlyRZg8+XNQS+RGfV4EsZIF+AtjbRAceN48tpAl+SC/BlLYEvKUT4EgPkC9DWJoUAX84S+JJagC8fEPiSRoQvBsgXoK1NGgG+nCPwJb0AXz4i8CWDCF9igXwB2tpkEODLHwS+ZBbgy8cEvmQR4UtZIF+AtjZZBPhynsCX7AJ82UrgSw4RvpQD8gVoa5NDgC+XCHzJJcCXzwh8yS3Cl/JAvgBtbXIL8OVPAl/yCvDlCwJf8onwJQ7IF6CtTT4Bvlwm8KWAAF++JPCloAhfKgD5ArS1KSjAlysEvhQS4MtuAl8Ki/ClIpAvQFubwgJ8SZICj5tiAnz5hsCX4iJ8qQTkC9DWprgAX6IJfCklwJfvCHwpLcKXykC+AG1tSgvwJSmBL0aAL98T+BIrwpfbgXwB2trECvAlGYEv5QX4cpDAlzgRvtwB5AvQ1iZOgC8pCXypJMCXHwl8qSzClypAvgBtbSoL8CUVgS9VBPjyM4EvVUX4UhXIF6CtTVUBvqQm8KW6AF9+IfClhghf7gTyBWhrU0OAL2kIfKkpwJcTBL7UEuFLNSBfgLY2tQT4kp7Al9oCfDlD4EsdEb5UB/IFaGuDXL9k9jPS2zEw/vOirc5J7Uhmxx3W9lXsqGpHcvu+hv2Zwv5MaUcqO+6172vbUceO1PZ9Pfszjf2Z1o50djxs3ze0o5Ed6e37JvZnBvszox2Z7HjCvm9hR0s7Mtv3be3PLPZnVjuy2dHJvu9sRxc7stv33e3PHPZnTjtusqOPfd/Xjn525LLvB9if7jvg3fdau+/qfd6+H2rHMDvcd5GOtD/ddyy6741z34X1sn0/1o5xdrjv+plof7rvMHHfy+DOmn/Vvp9uxww73Fnas+xPd0awO/fUneU4z76fb8cCO9xZdYvsT3cGlztXyJ2Vsty+X2HHSjvcWRCr7U/3jLt7btc9i7jBvt9oxyY73LNWW+xP9wyJuy/e3ev7qX2/3Y4ddrh7GXfZn+4eLXffidtL/9q+32vHPjvcXuEB+9Ptgbi+rutVHbbvj9hx1NnRvj/ubGl//iNvsuM3+/6UHaftcFg/l/pfXAL7kooX7GdfZuSqOI7GJI3nwtUv1OeT1tYg14Al411oGdECVoziALQuOchf96EoVmdnHPTn1iMF+WREYF6vzncDEwYgbgzSFmQnaRI+70Z0kncH3En+TxSPBivuPrMaiIQ1gYvo1i9p/Dq6z83PMbzEutYKMy1TS8CJ3BP0TMt9HiPTqi+Qad1DyLQaiGRa9wAzrXuBmRYQN6ZBmGlJOMl7b9BMKxaZEdQmZVq19TIt6LrWCTMtU0fAidzHdiKIjOM+QsbRUCTjuA+Ycdwf0N5OwzDjkHAW99+gGUdZZGSsS8o46uplHNB1rRdmHKaegBN5IOi9nQpRnN7OIwK9nQcImdajIpnWA8BM60FgpgXEjXk0zLQknOSDN2imVQ6ZEdQnZVr19TIt6Lo2CDMt00DAiTyk0NtxQkYTFb9eGR/WATstYiqA/eEbNGKWR3r2hqSI2VAvYkLXtVEYMU0jASfySNAjpqt5K0f952MiMdf3MsmAn1UZqO+jYIMwMphHCD2TxwL+WJXT+1GC3o+L9IoeAWaYjYG9IiBuzONhr0giaDW+QTPfOGSG1oSU+TbRy3yh6/pYmPmaxwScyONB35WLi+LsyjUX2JV7nJBpPSGSaT0OzLSaAjMtIG7ME2GmJeEkm96gmVYFZEbQjJRpNdPLtKDr2jzMtExzASfyRNAzrTOpOJlWK4FM6wlCptVaJNN6AphptQBmWkDcmNZhpiXhJFsgZUweL2CK/7QV5QgWmOBEOSuIyBknIqcLmgpyPpqGI2cUVs6Y6IjPbJnmnz9bueCMXpBL7uCxqP9M7a/7YHfgZ11KjdM3smRqGVEyJbzQ92K1BGYVrdNgoysaS87mzlbwL9EiYel6P6tNwO3h8NKGkNG3JbUw2sbzMXn83yKdYMILHmABvqXtP1+triHu9X62Sfglci3axQeEJ9PEL0jCAraLN3bk3568hpND3z4Td/2kio0Hl2kHdJhPpsEaF00kR84EYwLtwbjlpYWzMcOZtCc5k/a8fug/TpOuQDhNup3AadK/p8Lr/aTIadIdgAEfaGvzZMBx4/hSkcCXjgJ8OUvgSycRvnQE8gVoa9NJgC+VCHzpKsCXcwS+PCXCl05AvgBtbZ4S4MvtBL70EODLnwS+9BThS2cgX4C2Nj0F+HIHgS9PC/DlMoEvfUT40gXIF6CtTR8BvlQh8OUZAb4kI9wK86wIX7oC+QK0tXlWgC9VCXx5ToAvyQl8GSjCl6eAfAHa2gwU4MudBL4MEeBLCgJfnhfhSzcgX4C2Ns8L8KUGgS/DBfiSjsCXF0T40h3IF6CtzQsCfLmLwJcXBfiSnsCXl0T40gPIF6CtzUsCfLmbwJcxAnzJRuDLyyJ86QnkC9DW5mUBvtQk8GW8AF+yE/jyighfegH5ArS1eUWAL7UIfJkkwJccBL5MFuFLbyBfgLY2kwX4UpvAl2kCfMlD4MurInx5GsgXoK3NqwJ8qUPgy2sCfMlL4MvrInzpA+QL0NbmdQG+3EfgyxsCfLmNwJfZInzpC+QL0NZmtgBf7ifw5U0BvhQi8GWeCF/6AfkCtLWZJ8CXugS+vCXAl8IEvrwtwpdngHwB2tq8LcCXBwl8WSzAl5IEvrwjwpdngXwB2tq8I8CX+gS+LBPgSykCX5aL8KU/kC9AWxvk+rlj/jLYUTT+89wz2O65Uves3IVUUVEX7bhkh3sWyD3fEOUOoLHD3bvt7kd199iltu/T2JHWDncPkbsvIpP9Pasdbs/X7WO53nwu+z63HTfb4XqPrp+S3/5+qx2uVnT5r4vpxez74naUsMP5LGeHGPt72dT/srXK+QsDwOemZoj6zxfq80lra5BrwJLxuaCfm+qO/mMA9N2An5vqdH6OoPd7IuemPgc8sGcgMKABcWOQtiA7Sdq5qQpOcmDAneT/RPFosOJtgCQcRDqRaRDvRCaJdR0cZlpmsIATGRL0TMt9HiPTel8g0xpC0HuNSKY1BOiMngdmWkDcmDVhpiXhJJ+/QTOtWGRGMJSUaQ3Vy7Sg6zoszLTMMAEnMjzo3zfuQDmckHGsF8k4hgNJ+UJAezvrw4xDwlm8cINmHGWRkXEEKeMYoZdxQNd1ZJhxmJECTuTFoPd23BdTMXo7GwV6Oy8S9N4kkmm9CHRGLwEzLSBuzKYw05Jwki/doJlWOWRGMIqUaY3Sy7Sg6zo6zLTMaAEnMkahtzOGsGU8Bgj2l3XATouYCmB/+QaNmOWRnn0sKWKO1YuY0HUdF0ZMM07AiYwPem/CfXkyozexWaA3MZ6g9xaR3sR4oDN6BdibAOLGbAl7ExJO8pUbNNOKQ2YEE0iZ1gS9TAu6rhPDTMtMFHAik4KeacVFcTKtrQKZ1iSC3ttEMq1JQGc0GZhpAXFjtoWZloSTnHyDZloVkBnBFFKmNUUv04Ku69Qw0zJTBZzItKBnWq1IPa3tApnWNILeO0QyrWlAZ/QqMNMC4sbsCDMtCSf56g2aaVVEZgTTSZnWdL1MC7quM8JMy8wQcCKvBT3TOpOKk2ntFMi0XiPovUsk03oN6IxeB2ZaQNyYXWGmJeEkX79BM61KyIxgJinTmqmXaUHXdVaYaZlZAk7kjaBnWi1JPa3dApnWGwS994hkWm8AndFsYKYFxI3ZE2ZaEk5ydtCd5J82I7hMODt8ThqOs4gGy3kpNe6z5qbBkgZta2eTuYTA8CYpE36Tlwmb1qTkYF4abnIQc30v4+w/j6D3fBIG5hMxwOLD3oB/XwQLA/tEvi9iAdBPA21tkOsXyaEF8RxSrYa3RgdfxreQfl/VUCWTBl/Gt0NDxZjSAoZaGBoqxsQIGGpR0Gtc9/1IjBp3sUCuv5iQ571DyvXfIeb6rtZbRFiLJQIYWELQeykJA0uJGGDxYb9AvcfAwAGRem8ZsN4D2tocINV7y8TrvQoCSc/yoCc9F0lJz8GAOzsX6JcTnN0hEWe3AujsgLY2hwSC5AoCblaSEqWVEbImvKIJa4Jah3dx61BONbC9myb4Mr4X9MB2iRTYjggEtvcIDuqoSGBbBQxsQFubowKBbRUBN6tJgW01P7DFIQPb++H9quZ9gcC2hnRHEhqcFZDgXBuC06wVAOc6EXCWR4JzPU7psqrgXC8Azg1BLwmiSDexbhTY3NlISO02kVK7TeQNvg2EtfhAAAMfEPT+kISBD8kbfAw+HBMo8RgYOC7SGtgMbA0AbW2Okzb4NkdwKOEV5BJ5S5jomS0Cid5HQU/0kpISvY8FgvzHBAe/lRTkt5ITvY8Ia7FNAAPbCHp/QsLAJ+REj8GHEwKJHgMDJ0USvU+BiR7Q1uYkKdH7lJ/otUAmetvDdrPZLpDo7RBpN7dEgvOzEJzmMwFwfi4CzlZIcO4MwWl2CoBzlwg4oWH9i7B/Y74QAOeXQe/fpCb1b3YL1O67CXXbHlLtvofcv/mSsBZfCWDgK4LeX5Mw8DW5f8PgwymB/g0DA6dF+jd7gf0boK3NaVL/Zq9Y/2Zf+JCG2SeQ6H0T9EQvDSnROyvwkMY3BAd/TsTBfwt08EBbm3MCicG3jKMJSMnhfv5DGtDe74EwsJkDAoHtu6AHtrSkwHZBILB9R3BQF0UC2/fAwAa0tbkoENi+J+DmICmwHaQHNhODDGyHwn0jc0ggsP2gsW9koGc+HA7BaQ4LgPOIyKZmWyQ4j4abmuaoADh/DHpJkIlUEvwksKH1E+NpK1Jqd4y8qfkj4wksAQwcJ+j9MwkDP5M3NRl8uCxQ4jEwcEWkNfALsDUAtLW5QtrU/IW+qYktkU+EiZ45IZDonQx6opeVlOj9KhDkfyU4+N9IQf43cqJ3knHnkgAGTjHuXCJh4DQ50WPwIUm2GxMD0dnwwSkqCp/onQEmekBbG+T6RXLoDD/RK4dM9H4P283md4FE76zIXgj0sLtzITjNOQFw/iECTugBPedDcJrzAuC8IAJOaFi/GPZvzEUBcF4Kev8mF6l/86dA7f4nY2OCVLtfJvdvLjE2KwQwcIWg918kDPxF7t8w+JBcoH/DwEAKkf5NVFrcWgJtbVKQ+jdO3/xR//4KcqKXBGcf2Yc0gGtAkzE6bcATvdykRC91wB28S26ccdB6pxFx8EmBDh5oa5NGIDFISsBNsrScwJYsLf0hDWjvN3kY2ExygcCWIuiB7WZSYEsvENhSEBxUBpHAlhIY2IC2NhkEAltKAm5SkQJbKn5gg54Xkxq4DqqBLbVAYEuTluPn0OCEnvmQNgSnSSsAznQi4KyEBGd6nNKym5rpBcCZIeglQX5SSZAxbfBTu4yE1C4TKbXLlJa7qZmBsBaZBTCQmaB3FhIGshAxwOJDZoESj4IBkdZAVmBrAGhrk4W0qZmVv6kJLZGzhYmeySaQ6GUPeqJ3KynRyyEQ5HMQHHxOUpDPSU70shPW4iYBDNxE0DsXCQO5yIkegw/ZBRI9BgZyiCR6uYGJHtDWJgcp0cvNT/TaIBO9m8N2s7lZINHLI9Juhh52lzcEp8krAM58GuCMhR7Qc0sITnOLADjzi3hOaFgvEPZvTAEBcBYMev+mGKl/c6tA7X4roW67jVS730bu3xQkrEUhAQwUIuhdmISBwuT+DYMPuQT6NwwM5Bbp3xQB9m+Atja5Sf2bImL9m6LhQxqmqECiVyzoiV5xUqKXV+AhjWIEB59PxMEXBzp4oK1NPoHEoDgBNyVIyWEJ/kMa0N5vyTCwmZICga1U0ANbCVJgKyAQ2EoRHFRBkcBWGhjYgLY2BQUCW2kCbsqQAlsZemCLhZ4XExPuG5kYgcBmRDY1oWc+xIbgNLEC4CwrAs6ySHCWCzc1TTkBcJYPekkQQyoJ4gQ2tOIIqV0FUmpXgbypWZ6wFhUFMFCRoHclEgYqkTc1GXwoJFDiMTBQWKQ1UBnYGgDa2hQmbWpWpm9qYkvk28NEz9wukOjdEfRErywp0asiEOSrEBx8VVKQr0pO9O4grMWdAhi4k6B3NRIGqpETPQYfigkkegwMFBdJ9KoDEz2grU1xUqJXPZ5D7n36qP98oW2GxuvW6ODLWAPp91UNVTJp8GW8KzRUjCktYKi7Q0PZnrSAoWoGvd5ztV5NQr5TSyDXr0XQ+x5Srn8PMde/w2KgDeH7ou4VwMC9BAzUJmGgNrneY/ChlEC9x8BAaZF6rw6w3gPa2pQm1Xt1xOu9CgJJz31BT3qqkAKeCbizc8nefQRnFyvi7O4HOjugrU2sQJC8n4CbuqREqW68rKpOfqGAk68XdCdfleTkyws4+XoEssaJOPkHgE4eaGsTJ+DkHyDg5kGSk39Q3MkvEXDy9cM+c4xZJmCoBgp95gYE7/KQQI/xIYLeD5O86sPEHmMNUkbWUAADDQkYaETCQCNyn5nBh0oC2RUDA5VFsvJHgFk50NamMqnP/Ih4n3m1QNLzaJidxpg1AoZqHBoqxqwTMFST0FAxZoOAoR5TqPceI+Q7jwvk+o8T9G5KyvWbEnP9e0n1XjMBDDQjYKA5CQPNyfUegw9VBOo9BgaqitR7TwDrPaCtTVVSvfeEeL33oUDS0yLoSU9tUsCrLrDl3ILg7GqIOLuWQGcHtLWpIRAkWxJw04qUKLUS33LeIuDkWwfdydchOfmaAk6+NeNJIREn3wbo5IG2NrUEnHwbAm7akpx8W3En/7GAk28X9pljzDYBQz2p0Gd+kuBd2gv0GNsT9O5A8qodiD3GeqSMrKMABjoSMNCJhIFO5D4zgw+1BbIrBgbqiGTlnYFZOdDWpg6pz9yZfjClgX7ndxfw8fiKiV6XtMGXsWtaDt/R4DRIcD4VgtM8JQDObiLgjEWCs3sITtNdAJw9RMAJDes9wedNK4KzpwA4eyn0b3oR6pfeArV7b4LeT5Nq96eJtfvDpP5NHwEM9CFgoC8JA33J/RsGH+oK9G8YGKgn0r/pB+zfAG1t6pH6N/3E+jfP4OxTTjXRe0Yg0Xs26IleQ1KQry9w28yzBAffQMTB9wc6eKCtTQOBxKA/ATcDSMnhgAhZE15B7v0+FwY285xAYBsY9MDWiHWqiUBgG8g41UQksA0CBjagrU0jgcA2iICbwaTANpgf2OKQgW1IuG9khggEtudF9o2g31M6NNw3MkMFwDlMYd9oGCGKDBfYMxhO0PsFUvR8gbhn0ISUeY8QwMAIAgZGkjAwkrxvxOBDY4EsmoGBJiLV14vA6gtoa9OEtG/0In/fqCIy0XsprELMSwKJ3iiRKqQSEpyjQ3Ca0QLgHCMCzhZIcL4cgtO8LADOsSLghIb1cWH/xowTAOd4hf7NeEL98opA7f4KQe8JpNp9ArF2f4LUv5kogIGJBAxMImFgErl/w+BDU4H+DQMDzUT6N5OB/RugrU0zUv9mslj/Zkp4e5SZIpDoTQ16oteCFORbCNweNZXg4FuKOPhpQAcPtLVpKZAYTCPg5lVScvgq//YoaO93ehjYzHSBwDYj6IGtJSmwtREIbDMY53mKBLbXgIENaGvTViCwvUbAzeukwPY6P7C1QQa2meG+kZkpENhmiewbtUKC841w38i8IQDO2Qr7RrMJUWSOwJ7BHILec0nRcy5xz6AtKfN+UwADbxIwMI+EgXnkfSMGH9oLZNEMDHQQqb7mA6svoK1NB9K+0Xz6vlEs9LyYBWEVYhYIJHpvaVQhsdAzH94OwWneFgDnQhFwQs/7XRSC0ywSAOdiEXBCw/o7Yf/GvCMAziUK/ZslhPplqUDtvpSg9zJS7b6MWLt3IvVvlgtgYDkBAytIGFhB7t8w+NBZoH/DwEAXkf7NSmD/Bmhr04XUv1kp1r95N7w9yrwrkOi9F/RErzMpyHcTuD3qPYKD7y7i4FcBHTzQ1qa7QGKwioCb1aTkcDX99ihs7/f9MLCZ9wUC25qgB7YupMDWSyCwrSE4qN4igW0tMLABbW16CwS2tQTcrCMFtnX8wAY973d9uG9k1gsEtg0i+0bQ8343hvtGZqMAODcp7BttIkSRDwT2DD4g6P0hKXp+SNwz6E7KvDcLYGAzAQNbSBjYQt43YvChr0AWzcBAP5Hq6yNg9QW0telH2jf6iL9vBD0v5uOwCjEfCyR6W0WqEOiZD9tCcJptAuD8RASc0PN+Pw3BaT4VAOd2EXBCw/qOsH9jdgiA8zOF/s1nhPrlc4Ha/XOC3jtJtftOYu3eh9S/2SWAgV0EDHxBwsAX5P4Ngw/9Bfo3DAwMEOnffAns3wBtbQaQ+jdfivVvdoe3R5ndAonenqAnen1JQX6QwO1RewgOfrCIg/8K6OCBtjaDBRKDrwi4+ZqUHH7Nvz0K2vvdGwY2s1cgsO0LemDrRwpsQwUC2z6CgxomEti+AQY2oK3NMIHA9g0BN9+SAtu3/MAGPe93f7hvZPYLBLYDIvtG0PN+vwv3jcx3AuD8XmHf6HtCFDkosGdwkKD3IVL0PETcMxhAyrx/EMDADwQMHCZh4DB534jBhxECWTQDAyNFqq8jwOoLaGszkrRvdIS+b1QWel7M0bAKMUcFEr0fNaqQstAzH34KwWl+EgDnMRFwQs/7PR6C0xwXAOfPIuCEhvVfwv6N+UUAnCcU+jcnCPXLSYHa/SRB719JtfuvxNr9eVL/5jcBDPxGwMApEgZOkfs3DD6MEujfMDAwWqR/cxrYvwHa2owm9W9Oi/VvzoS3R5kzAone70FP9IaSgvxYgdujfic4+HEiDv4s0MEDbW3GCSQGZwm4OUdKDs/Rb4/C9n7/CAOb+UMgsJ0PemAbRgpsEwQC23mCg5ooEtguAAMb0NZmokBgu0DAzUVSYLvID2zQ834vhftG5pJAYPtTZN8Iet7v5XDfyFwWAOcVhX2jK4Qo8pfAnsFfBL2j0nGip/vc/CSQjiRl3knSBR8DTka03tEkDEQTMcDiwxSBLJqBgaki1VdSHFYN0NZmKmnfKGk6+r4R9LyYZEBfoproJUsXfBmTp+PwHQ1O6JkPKUJwmhQC4EwpAk7oeb+pQnCaVALgTC0CTmhYT4NTWrZ/k0YAnGnRMjL6N2kJ9Us6gdo9HUHv9KTaPT2xdn+Z1L/JIICBDAQMZCRhICO5f8Pgw3SB/g0DAzNE+jeZgP0boK3NDFL/JpNY/yYzzj6yt0dlFkj0sgQ90RtLCvIzBW6PykJw8LNEHHxWoIMH2trMEkgMshJwk42UHGZLR789Ctr7zR4GNpNdILDlCHpgG0cKbHMEAlsOgoOaKxLYcgIDG9DWZq5AYMtJwM1NpMB2Ez+wQc/7zRXuG5lcAoEtt8i+EfS835vDfSNzswA48yjsG+UhRJG8AnsGeQl65yNFz3zEPYOJpMz7FgEM3ELAQH4SBvKT940YfJgvkEUzMLBApPoqAKy+gLY2C0j7RgXo+0bloOfFFAyrEFNQING7VaMKKQc98+G2EJzmNgFwFhIBJ/S838IhOE1hAXAWEQEnNKwXDfs3pqgAOIsp9G+KEeqX4gK1e3GC3iVItXsJYu3+Kql/U1IAAyUJGChFwkApcv+GwYeFAv0bBgYWifRvSgP7N0Bbm0Wk/k1psf5NmfD2KFNGINGLCXqiN50U5JcI3B4VQ3DwS0UcvAE6eKCtzVKBxMAQcBNLSg5j6bdHYXu/ZcPAZsoKBLZyQQ9sM0iBbYVAYCtHcFArRQJbeWBgA9rarBQIbOUJuIkjBbY4fmCDnvdbIdw3MhUEAltFkX0j6Hm/lcJ9I1NJAJyVFfaNKhOiyO0Cewa3E/S+gxQ97yDuGcwiZd5VBDBQhYCBqiQMVCXvGzH4sEogi2ZgYLVI9XUnsPoC2tqsJu0b3cnfN4KeF1MtrEJMNYFEr7pIFQI986FGCE5TQwCcd4mAE3re790hOM3dAuCsKQJOaFivFfZvTC0BcN6j0L+5h1C/3CtQu99L0Ls2qXavTazd55H6N3UEMFCHgIH7SBi4j9y/YfBhrUD/hoGBdSL9m/uB/Rugrc06Uv/mfrH+Td3w9ihTVyDRqxf0RG8+KchvFLg9qh7BwW8ScfAPAB080NZmk0Bi8AABNw+SksMH+bdHQXu/9cPAZuoLBLYGQQ9sC0iBbbNAYGtAcFBbRALbQ8DABrS12SIQ2B4i4OZhUmB7mB/YoOf9Ngz3jUxDgcDWSGTfCHre7yPhvpF5RACcjyrsGz1KiCKNBfYMGhP0bkKKnk2IewaLSJn3YwIYeIyAgcdJGHicvG/E4MNWgSyagYFtItVXU2D1BbS12UbaN2pK3zcqDz0vpllYhZhmAolec40qpDz0zIcnQnCaJwTA2UIEnNDzfluG4DQtBcDZSgSc0LDeOuzfmNYC4Gyj0L9pQ6hf2grU7m0Jercj1e7tiLX7clL/5kkBDDxJwEB7Egbak/s3DD5sF+jfMDCwQ6R/0wHYvwHa2uwg9W86iPVvOoa3R5mOAolep6AneitIQX6nwO1RnQgOfpeIg+8MdPBAW5tdAolBZwJuupCSwy7026Owvd+uYWAzXQUC21NBD2wrSYFtt0Bge4rgoPaIBLZuwMAGtLXZIxDYuhFw050U2LrzAxv0vN8e4b6R6SEQ2HqK7BtBz/vtFe4bmV4C4OytsG/UmxBFnhbYM3iaoHcfUvTsQ9wzWE3KvPsKYKAvAQP9SBjoR943YvBhr0AWzcDAPpHq6xlg9QW0tdlH2jd6hr9vBD0v5tmwCjHPCiR6/UWqEOiZDwNCcJoBAuB8TgSc0PN+B4bgNAMFwDlIBJzQsD447N+YwQLgHKLQvxlCqF+eF6jdnyfoPZRUuw8l1u4bSP2bYQIYGEbAwHASBoaT+zcMPuwX6N8wMHBApH/zArB/A7S1OUDq37wg1r8ZEd4eZUYIJHojg57obSQF+YMCt0eNJDj4QyIO/kWggwfa2hwSSAxeJODmJVJy+BL/9iho73dUGNjMKIHANjrogW0TKbAdEQhsowkO6qhIYBsDDGxAW5ujAoFtDAE3L5MC28v8wAY973dsuG9kxgoEtnEi+0bQ837Hh/tGZrwAOF9R2Dd6hRBFJgjsGUwg6D2RFD0nEvcMtpAy70kCGJhEwMBkEgYmk/eNGHw4JpBFMzBwXKT6mgKsvoC2NsdJ+0ZT6PtGcdDzYqaGVYiZKpDoTdOoQuKgZz68GoLTvCoAzuki4ISe9zsjBKeZIQDO10TACQ3rr4f9G/O6ADhnKvRvZhLql1kCtfssgt5vkGr3N4i1+6ek/s1sAQzMJmBgDgkDc8j9GwYfTgj0bxgYOCnSv5kL7N8AbW1Okvo3c8X6N2+Gt0eZNwUSvXlBT/S2k4L8KYHbo+YRHPxpEQc/H+jggbY2pwUSg/kE3CwgJYcL6LdHYXu/b4WBzbwlENjeDnpg20EKbGcFAtvbBAd1TiSwLQQGNqCtzTmBwLaQgJtFpMC2iB/YoOf9Lg73jcxigcD2jsi+EfS83yXhvpFZIgDOpQr7RksJUWSZwJ7BMoLey0nRczlxz2AXKfNeIYCBFQQMrCRhYCV534jBhwsCWTQDAxdFqq93gdUX0NbmImnf6F3+vhH0vJj3wirEvCeQ6K0SqUKgZz6sDsFpVguA830RcELP+10TgtOsEQDnWhFwQsP6urB/Y9YJgHO9Qv9mPaF+2SBQu28g6L2RVLtvJNbuX5P6N5sEMLCJgIEPSBj4gNy/YfDhskD/hoGBKyL9mw+B/Rugrc0VUv/mQ7H+zebw9iizWSDR2xL0RG8vKcgnyR7826O2EBx8dHYNB/8R0MEDbW2iA44b58Q/IuDmY1Jy+DH/9iho73drGNjMVoHAti3ogW0fKbAlFwhs2wgOKoVIYPsEGNiAtjYpBALbJwTcfEoKbJ/yAxv0vN/t4b6R2S4Q2HaI7BtBz/v9LNw3Mp8JgPNzhX2jzwlRZKfAnsFOgt67SNFzF3HP4AAp8/5CAANfEDDwJQkDX5L3jRh8SC2QRTMwkEak+toNrL6AtjbI9Yvk0G76vlEF6Hkxe8IqxOwRSPS+0qhCKkDPfPg6BKf5WgCce0XACT3vd18ITrNPAJzfiIATGta/Dfs35lsBcO5X6N/sJ9QvBwRq9wMEvb8j1e7fEWv3w6T+zfcCGPiegIGDJAwcJPdvGHxIL9C/YWAgg0j/5hCwfwO0tclA6t8cEuvf/BDeHmV+EEj0Dgc90TtCCvKZBW6POkxw8FlEHPwRoIMH2tpkEUgMjhBwc5SUHB6l3x6F7f3+GAY286NAYPsp6IHtKCmwZRcIbD8RHFQOkcB2DBjYgLY2OQQC2zECbo6TAttxfmCDnvf7c7hvZH4WCGy/iOwbQc/7PRHuG5kTAuA8qbBvdJIQRX4V2DP4laD3b6To+Rtxz+A46yukBDBwioCB0yQMnCbvGzH4kEsgi2ZgILdI9XUGWH0BbW1yk/aNzvD3jaDnxfweViHmd4FE76xIFQI98+FcCE5zTgCcf4iAE3re7/kQnOa8ADgviIATGtYvhv0bc1EAnJcU+jeXCPXLnwK1+5+M801JtftlYu3+G6l/c0UAA1cIGPiLhIG/yP0bBh/yCvRvGBjIJ9K/cZEftZZAW5t8pP6N0zd/1L+/gpzoJcHZR/b2KOAa0GSMTh/wRO8UKcgXELg9yhkHrXdBEQefFOjggbY2BQUSg6QE3CRLzwlsydLTb4+C9n6Th4HNJBcIbCmCHthOkwJbIYHAloLgoAqLBLaUwMAGtLUpLBDYUhJwk4oU2FLxAxv0vN/UwHVQDWypBQJbmvQcP4cGJ/S837Q4pWX3jdIKgDNd0LMul32kI0SR9OmDHz3TE/TOQIqeGdLz9gzOkTLvjAIYyEjAQCYSBjIRMcDiQzGBLJqBgeIi1VdmYPUFtLUpTto3ynyNfSP0mmYBrunerLjP2peVs6ZZiH7pTKqoqEup8fzMSvLRWf8LfMVc38sg8RW5Dte7ptlIa5qNiC+X/3Yg5D6lAh73XL73FkHv0iJxLzuQQ0Bbm9IC3eqOBNwYAb68TdA7VoQvOYB8AdraxArwpRMBN+UF+LKQoHecCF9yAvkCtLVRWb+bgOu3H1hDHSDVUDcRc9wLpBoqFynfz5UINRQSX7mANVRu0prmJuLrIglflQR6hysIMa6yiI++GcghoK1NZVLv8OaIPjH8ATMSh6oIcGgVgUNVRTiUB8ghoK1NVRKH8hA55GqtzgQsVReotdYQ9K4hwqG8QA4BbW1qCPQmuhBwU1OAL+sIetcS4Us+IF+AtjYq63cLcP2OAXsTx0m9iVuItWNUak7em59UR+dPhN4EEl/5gb2JAqQ1LZAI92QUBK7pCSBnT5I4W5DI2aQkzt5KwteticBZJL5uBXL2NtKa3ka+J6MrIT+rLZCX7iDoXUckryoE5BDQ1qaOQB33FAE3dQX48jlB73oifCkM5AvQ1qaeAF+6EXBTX4Avuwh6NxDhSxEgX4C2NirrVxS4fqeANdRpUg1VlJjjpibVUMVI+X6xRKihkPgqBqyhipPWtDgRX2lI+GoosJ/8LSHGNRLx0SWAHALa2jQi7SeXIO4npyVxqLEAh74ncKiJCIdKAjkEtLVpQuJQSfI9Gd0JWGoqUGv9QNC7mQiHSgE5BLS1aSbQm+hBwE0LAb4cIejdUoQvpYF8AdraqKxfGeD6XQb2Jq6QehNliLVjJlLeG0Oqo2MSoTeBxFcMsDdhSGtqEuGejFjgmibJhvus6GycNY0lcjYribNlSfgqmwicReKrLJCz5UhrWo58T0ZPQn7WRiAvPUvQu61IXlUeyCGgrU1bgTquFwE37QX48gdB7w4ifIkD8gVoa9NBgC+9CbjpLMCXCwS9u4jwpQKQL0BbG5X1qwhcv+TAGioFqYaqSMxxc5FqqEqkfL9SItRQSHxVAtZQlUlrWpmIr9wkfHVT+AqmtHi9u4v46NuBHALa2nQn7SffTtxPvpnEoV4K3/ZC4FBvEQ7dAeQQ0NamN4lDd5DvyXiaUHP0Fai10hA41E+EQ1WAHALa2vQT6E30IfClvwBf0hH4MkCEL1WBfAHa2qis353A9csM7E1kIfUm7iTWjvlJeW81Uh1dLRF6E0h8VQP2JqqT1rR6ItyTUQO4ptmBnM1B4mwNImdvJXH2LhK+7koEziLxdReQs3eT1vRu8j0ZfQl56SCBvDQPIS8dLJJX1QRyCGhrM1igjutH4MtQAb7kI/BlmAhfagH5ArS1GSbAl2cIfBkhwJf8BL6MFOHLPUC+AG1tVNbvXuR3SwBrqNykGupeYo5bjFRD1Sbl+7UToYZC4qs2sIaqQ1rTOkR8FSfha5TAfnJxQowbLeKj7wNyCGhrM5q0n3wfcT+5BIlDYwU4VJrAoXEiHLofyCGgrc04EofuJ9+T8Syh1pogUGsZAocminCoLpBDQFubiQK9if4EvkwR4EtZAl+mivClHpAvQFsblfV7ALh+hYC9icKk3sQDxNoxhpT3Pkiqox9MhN4EEl8PAnsT9UlrWj8R7slogDwXFcjZ4iTONiBytiyJsw+R8PVQInAWia+HgJx9mLSmD5PvyahByM+mBzwvjbZ5aRtCPj5DJK9qCOQQ0NZmhkAddxeBLzMDrndSEl9mifClEZAvQFubWQJ8uZvAlzkB1zsZiS9zRfjyCJAvQFsblfV7FLh+pYA1VGlSDfUoMce9g3UuPinfb5wINRQSX42BNVQT0po2IeKrCglf8wX2k+8nxPYFIj76MSCHgLY2C0j7yY8R95Orkji0UIBDDxA4tEiEQ48DOQS0tVlE4tDj5Hsy6hOwtCTgHEpOqrWWinCoKZBDQFsblfVrhjwzDlhrVSbVWs2IuXANUhxvTqoLmidCrYXEV3NgrfUEaU2fIO9XPUqIcSsCHuNSkGLcShEf3QLIIaCtzUqB/ntjAl9WBVzvlCS+rBbhS0sgX4C2NqsF+NKEwJe1Adc7FYkv60T40grIF6Ctjcr6tQauXxVgDVWVVEO1Jua495JqqDakfL9NItRQSHy1AdZQbUlr2paIr9okfG0U6LW3JMT2TSI+uh2QQ0Bbm02kXns7Yq+9DolDmwU41IbAoS0iHHoSyCGgrc0WEoeeJO9XtSNgaWvAOZSaVGttE+FQeyCHgLY2KuvXAXmeDrDWqkOqtToQc+F6pDjekVQXdEyEWguJr47AWqsTaU07kferuhJi3PaAx7g0pBi3Q8RHdwZyCGhrs0Og/96NwJedAdc7LYkvu0T40gXIF6CtzS4BvvQg8GV3wPVOR+LLHhG+dAXyBWhro7J+TwHXry6whqpHqqGeIua4D7O+J5aU73dLhBoKia9uwBqqO2lNuxPx1ZCEr70Cvfb+hNi+T8RH9wByCGhrs4/Ua+9B7LU3InFovwCHBhE4dECEQz2BHALa2hwgcagneb/qeQKWDgacQ+lJtdYhEQ71AnIIaGujsn69kWcNAGutJqRaqzcxF25CiuNPk+qCpxOh1kLi62lgrdWHtKZ9yPtVowgx7kjAY1wGUow7KuKj+wI5BLS1OSrQfx9D4MuxgOudkcSX4yJ86QfkC9DW5rgAX8YS+HIi4HpnIvHlpAhfngHyBWhro7J+zwLXrymwhmpGqqGeJea4T5BqqP6kfL9/ItRQSHz1B9ZQA0hrOoCIrxYkfJ0S6LVPI8T20yI++jkgh4C2NqdJvfbniL32liQOnRXg0GsEDp0T4dBAIIeAtjbnSBwaSN6vmkXA0oWAcygzqda6KMKhQUAOAW1tVNZvMHD92gNrrQ6kWmswMRduS4rjQ0h1wZBEqLWQ+BoCrLWeJ63p8+T9qrcIMe5ywGNcFlKMuyLio4cCOQS0tbki0H9fSOBLkhzB1jsriS/ROTT4MgzIF6CtTXTAceP4spjAl+QB1zsbiS8pRPgyHMgXoK2Nyvq9AFy/zsAaqguphnqBmON2ItVQI0j5/ohEqKGQ+BoBrKFGktZ0JBFfnUn4Sh3wGOd67asIsT2NiI9+EcghoK0Ncv0iOfQisdfehcSh9AIcWkvgUAYRDr0E5BDQ1iYDiUMvkferNhCwlDngHMpOqrWyiHBoFJBDQFsblfUbDVy/vsBaqx+p1hpNzIW7k+L4GFJdMCYRai0kvsYAa62XSWv6Mnm/aishxmUPeIzLQYpxOUR89Fggh4C2NjkE+u+fEPiSK+B65yTxJbcIX8YB+QK0tcktwJftBL7kDbjeN5H4kk+EL+OBfAHa2qis3yvI51+ANdQAUg31CjHH7UOqoSaQ8v0JiVBDIfE1AVhDTSSt6UQivvqS8FVAoNf+FSG2FxTx0ZOAHALa2hQk9donEXvt/UgcKiTAoW8IHCoswqHJQA4BbW0Kkzg0mbxfdYCApWIB51AuUq1VXIRDU4AcAtraqKzfVOS9W8BaaySp1ppKzIUHkOL4NFJdMC0Rai0kvqYBa61XSWv6Knm/6kdCjCsV8BiXmxTjSov46OlADgFtbUoL9N+PEfhiAq73zSS+xIrwZQaQL0Bbm1gBvvxM4Ev5gOudh8SXOBG+vAbkC9DWRmX9Xgeu3yhgDTWaVEO9TsxxnyfVUDNJ+f7MRKihkPiaCayhZpHWdBYRX0NJ+Kok0Gs/S4jtlUV89BtADgFtbSqTeu1vEHvtw0gcqiLAoQsEDlUV4dBsIIeAtjZVSRyaTd6v+pOApeoB51BeUq1VQ4RDc4AcAtraqKzfXOD6TQHWWlNJtdZcYi48khTH3yTVBW8mQq2FxNebwFprHmlN55H3q5Knw+OrZsBjXD5SjKsl4qPnAzkEtLWpJdB/T0ngS+2A630LiS91RPiyAMgXoK1NHQG+pCbwpW7A9c5P4ks9Eb68BeQL0NZGZf3eBq7fdGANNYNUQ71NzHFfJtVQC0n5/sJEqKGQ+FoIrKEWkdZ0ERFfY0n4qi/Qa89KiO0NRHz0YiCHgLY2DUi99sXEXvs4EocaCnAoJ4FDjUQ49A6QQ0Bbm0YkDr1D3q/KTcBS44BzqACp1moiwqElQA4BbW1U1m8pcP3mA2utBaRaaykxF55IiuPLSHXBskSotZD4WgastZaT1nQ5eb/qVkKMaxrwGFeQFOOaifjoFcjvcwfGuGYC/fdCBL60CLjet5L40lKELyuBfAHa2rQU4EsRAl/aBFzv20h8aSvCl3eBfAHa2qis33vI/QRgDbWIVEO9R8xxXyXVUKtI+f6qRKihkPhaBayhVpPWdDURX9NJ+Gov0Gs3hNjeQcRHv4/8nnZgjOtA6rW/T+y1zyBxqLMAh8oTONRFhENrkN/TCeRQFxKH1pD3qyoSsNQt4BwqRKq1uotwaC2QQ0BbG5X1W4fMhYG11mpSrbWOmAvPIsXx9aS6YH0i1FpIfK0H1lobSGu6gbxfVZ0Q43oFPMYVJsW43iI+eiOQQ0Bbm94C/fe7CHzpG3C9i5D40k+EL5uQ38kJ5Es/Ab7UJPClf8D1LkriywARvnyA/P4lIF9U1u9D4PqtBdZQ60g11IfEHHceqYbaTMr3NydCDYXE12ZgDbWFtKZbiPiaT8LXIIFe+wOE2D5YxEd/BOQQ0NZmMKnX/hGx176AxKGhAhx6iMChYSIc+hjIIaCtzTAShz4m71c1ImBpRMA5VIxUa40U4dBW5PcvATmksn7bgOu3FVhrbSPVWtuIufAiUhz/hFQXfJIItRYSX58Aa61PSWv6KXm/qjkhxo0KeIwrTopxo0V89Hbk92MAY9xogf57CwJfxgZc7xIkvowT4csOIF+AtjbjBPjSisCXCQHXuySJLxNF+PIZkC9AWxuV9fscuH7bgTXUDlIN9Tkxx11OqqF2kvL9nYlQQyHxtRNYQ+0irekuIr5WkPA1RaDX3pkQ26eK+OgvkN97AYxxU0m99i+IvfaVJA5NF+BQNwKHZohw6EvkucdADs0gcehL8n5VTwKWZgacQ6VItdYsEQ7tRn4XKZBDKuu3B7h+e4G11j5SrbWHmAuvJsXxr0h1wVeJUGsh8fUVsNb6mrSmX5P3q/oTYtycgMe40qQYN1fER+8FcghoazNXoP/+HIEv8wOudxkSXxaI8GUf8oxjIF8WCPBlEIEvCwOudwyJL4tE+PIN8jw7IF9U1u9b4PrtB9ZQB0g11LfEHHcDqYbaT8r39ydCDQXFF7CGOkBa0wNEfG0k4WuJQK/9RUJsXyrio78Dcghoa7OU1Gv/jthr30Ti0AoBDo0hcGilCIe+B3IIaGuzksSh78n7VeMIWFoVcA4ZUq21WoRDB5Hn2QE5pLJ+h4DrdwxYax0n1VqHiLnwFlIc/4FUF/yQCLUWEl8/AGutw6Q1PUzer5pGiHFrAx7jYkkxbp2Ijz6CPG8IGOPWCfTfpxP4sjHgepcl8WWTCF+OAvkCtLXZJMCX1wh82RxwvcuR+LJFhC8/Is8bA/JFZf1+Aq7fCWANdZJUQ/1EzHE/JdVQx0j5/rFEqKGQ+DoGrKGOk9b0OBFf20n42irQa59PiO3bRHz0z8hzhIAxbhup1/4zsde+g8Sh7QIcWkjg0A4RDv2CfI4cyKEdJA79Qt6veoeApZ0B51B5Uq21S4RDJ5DPygM5pLJ+J4HrdwFYa10k1VonibnwLlIc/5VUF/yaCLUWEl+/Amut30hr+ht5v2oVIcbtDniMiyPFuD0iPvoUkENAW5s9Av339wl82RtwvSuQ+LJPhC+nkc+MA/myT4Avawl82R9wvSuS+HJAhC9nkM9vAPmisn6/A9fvMrCGukKqoX4n5rhfk2qos6R8/2wi1FBIfJ0F1lDnSGt6joivvSR8HRTotX9EiO2HRHz0H0AOAW1tDpF67X8Qe+37SBw6IsChTwgcOirCofNADgFtbY6SOHSevF+1g4ClYwHnUCVSrXVchEMXkPceATmksn4XgeuXOjvus9Jk5/igi8Rc+AApjl8i1QWXEqHWQuLrErDW+pO0pn+S96u+IsS4EwGPcZVJMe6kiI++jLx/GxjjTgr03/cS+HIq4HrfTuLLaRG+XAHyBWhrc1qAL98Q+HI24HrfQeLLORG+/IXshwP5orJ+URlwOqcH1lAZSDWU0zd//OeiuXiYVEMlycBZiyQZ+DUUEl+R63C9axpNWtNoIr6OkPB1QaDXfoQQ2y+K+OikQA4BbW0uknrtTl9Wr/0oiUOXBTh0jMChKyIcSgbkENDW5gqJQ8mIHHK11i8ELCXJGWwOVSHVWtE5NTiUHJnL4XQ2KuuXArh+uYC1Vm5SrZWCmAsfJ8XxlKS6IGUi1FpIfKUE1lqpSGuaiogvF+POEmJc8oDHuKqkGJdCxEenBnIIaGuTIuC4cXz5g8CX1AHX+04SX9KI8CUNkC9AW5s0Any5QOBL+oDrXY3ElwwifEmL3G8B8kVl/dIB1y8vsIbKR6qh0hFz3N9INVR6Ur6fPhFqKCS+0gNrqAykNc1AxNcpEr4yBzzGuV570vR4vbOI+OiMQA4BbW2Q6xfJoYzEXvtpEoeyC3AoJYFDOUQ4lAnIIaCtTQ4ShzKR96vSELCUK+Acqk6qtXKLcCgzcr8FyCGV9csCXL9iwFqrOKnWykLMhc+R4nhWUl2QNRFqLSS+sgJrrWykNc12jTWNBuMBaZ87ojh+Cq1zEqDOVUR0jgbqXFVE56RAne8U0TkZUOdqiaRzzPW9THXg+o2K5uiMzg9qRGnIeZeInHeLyFlTRM5aInLeIyLnvSJy1haRs46InPeJyHm/iJx1ReSsJyLnAyJyPigiZ30RORuIyPmQiJwPi8jZUETORiJyPiIi56MicjYWkbOJiJyPicj5uIicTUXkbCYiZ3MROZ8QkbOFiJwtReRsJSJnaxE524jI2VZEznYicj4pImd7ETk7iMjZUUTOTiJydhaRs4uInF1F5HxKRM5uInJ2F5Gzh4icPUXk7CUiZ28ROZ8WkbOPiJx9ReTsJyLnMyJyPisiZ38ROQeIyPmciJwDReQcJCLnYBE5h4jI+byInENF5BwmIudwETlfEJFzhIicI0XkfFFEzpdE5BwlIudoETnHiMj5soicY0XkHCci53gROV8RkXOCiJwTReScJCLnZBE5p4jIOVVEzmkicr4qIud0ETlniMj5moicr4vIOVNEzlkicr4hIudsETnniMg5V0TON0XknCci53wROReIyPmWiJxvi8i5UETORSJyLhaR8x0ROZeIyLlURM5lInIuF5FzhYicK0XkfFdEzvdE5FwlIudqETnfF5FzjYica0XkXCci53oROTeIyLlRRM5NInJ+ICLnhyJybhaRc4uInB+JyPmxiJxbReTcJiLnJyJyfioi53YROXeIyPmZiJyfi8i5U0TOXSJyfiEi55cicu4WkXOPiJxficj5tYice0Xk3Cci5zcicn4rIud+ETkPiMj5nYic34vIeVBEzkMicv4gIudhETmPiMh5VETOH0Xk/ElEzmMich4XkfNnETl/EZHzhIicJ0Xk/FVEzt9E5DwlIudpETnPiMj5u4icZ0XkPCci5x8icp4XkfOCiJwXReS8JCLnnyJyXhaR84qInH+JyOk+UEHOJCJyRovImVREzmQiciYXkTOFiJwpReRMJSJnahE504jImVZEznQicqYXkTODiJwZReTMJCJnZhE5s4jImVVEzmwicmYXkTOHiJw5ReS8SUTOXCJy5haR82YROfOIyJlXRM58InLeIiJnfhE5C4jIWVBEzltF5LxNRM5CInIWBst5tXxlY+LKlWtTIbaNKWtaxMRWalmxfEy58i3jKpqKpnzF8q1jK5Yt26ZiuYoVKrWsVCGmkilXto1pW75S2bbxn3kpdVRUhzT4z82bM9h6z7U6Z0+P/9x8OTm4TArGZZEkwFwmJzDfCDhuHF86EvhSQIAvOQh8KSjCl6JAvgBtbQoK8KUTgS+FBPiSk8CXwiJ8KQbkC9DWhrV+0eD1K54Eh5nc6TV0LgHU+WYRnUsCdc6TPvixoDMhFhQTiAV5CbGguEgsKAWMBUBbm+ICuVMXAl9KCfAlH4EvpUX4UhrIF6CtTWmR3KkMMKYWEMkjYoA63yaQR3Ql+EUj4BcLEfxirIhfNEC/CLS1iRXII54i8KW8AF8KE/gSJ8KXWCBfgLY2cQJ86UbgSyUBvhQh8KWyCF/KAvkCtLWpLJJ3lwPmoMVF8u7yQJ1LiOgcB9S5pECt0Z0QC6oIxIJShFhQVSQWVADGAqCtTVWB3KkHgS/VBfhSmsCXGiJ8qQjkC9DWpoZI7lQJGFONSB5RGahzOYE8oifBL9YU8IvlCX6xlohfvB3oF4G2NrUE8oheBL7UFuBLHIEvdUT4cgeQL0BbmzoCfOlN4EtdAb5UIPClnghfqgD5ArS1qSeSd1cF5qCVRfLuO4E63y6iczWgzncI1BpPE2JBfYFYUIUQCxqIxILqwFgAtLVpIJA79SHwpaEAX6oS+NJIhC81gHwB2to0Esmd7gLG1OoiecTdQJ3vFsgj+hL8YmMBv1iT4BebiPjFmkC/CLS1aSKQR/Qj8KWpAF9qEfjSTIQvtYB8AdraNBPgyzMEvrQQ4Ms9BL60FOHLPUC+AG1tWork3fcCc9A6Inl3baDO94noXAeo8/0CtcazhFjQRiAW1CXEgrYiseA+YCwA2tq0Fcid+hP40l6AL/UIfOkgwpf7gXwB2tp0EMmd6gJjan2RPKIeUOeHBfKIaIJf7CzgFxsS/GIXEb/4ANAvAm1tugjkEUkJfOkmwJdGBL50F+HLg0C+AG1tugvwJRmBL70E+PIIgS+9RfhSH8gXoK1Nb5G8uwEwB20iknc/BNT5MRGdHwbq/LhArZGcEAv6CsSCpoRY0E8kFjQExgKgrU0/kVjQCOgjnhDwESkIPqK/gI9oQfARA0R8xCNAHwG0tRkgUF+lJPBlkABfWhL4MliEL48C+QK0tRkswJdUBL4MFeBLKwJfhonwpTGQL0Bbm2EiOWgTYA7aVqQ2fwyoczsRnR8H6vykQK2RmhALRgjEgvaEWDBSJBY0BcYCoK3NSJFY0AzoIzoJ+Ig0BB8xSsBHdCb4iNEiPqI50EcAbW1GC9RXaQl8GSvAly4EvowT4csTQL4AbW3GCfAlHYEvEwT40pXAl4kifGkB5AvQ1maiSA7aEpiDdhepzVsBde4honNroM49BWqN9IRYMEUgFvQixIKpIrGgDTAWAG1tporEgrZAH9FHwEdkIPiI6QI+oi/BR8wQ8RHtgD4CaGszQ6C+ykjgy0wBvvQj8GWWCF+eBPIFaGszS4AvmQh8mSPAl2cIfJkrwpf2QL4AbW3miuSgHYA56ACR2rwjUOfnRHTuBNR5oECtkZkQC+YLxIJBhFiwQCQWdAbGAqCtzQKRWNAF6COeF/ARWQg+YqGAjxhK8BGLRHxEV6CPANraLBKor7IS+LJEgC/DCHxZKsKXp4B8AdraLBXgSzYCX1YI8GU4gS8rRfjSDcgXoK3NSpEctDswBx0pUpv3AOr8oojOPYE6vyRQa2QnxIJVArFgFCEWrBaJBb2AsQBoa7NaJBb0BvqIlwV8RA6Cj1gr4CPGEnzEOhEf8TTQRwBtbdYJ1Fc5CXzZKMCXcQS+bBLhSx8gX4C2NpsE+HITgS+bBfgynsCXLSJ86QvkC9DWZotIDtoPmINOFKnNnwHqPElE52eBOk8WqDVyEWLBVoFYMIUQC7aJxIL+wFgAtLXZJhILBgB9xKsCPiI3wUdsF/AR0wk+YoeIj3gO6COAtjY7BOqrmwl82SnAlxkEvuwS4ctAIF+Atja7BPiSh8CX3QJ8eY3Alz0ifBkE5AvQ1maPSA46GJiDzhKpzYcAdX5DROfngTrPFqg18hJiwV6BWDCHEAv2icSCocBYALS12ScSC4YBfcQ8AR+Rj+Aj9gv4iPkEH3FAxEcMB/oIoK3NAYH66hYCXw4K8GUBgS+HRPjyApAvQFubQwJ8yU/gyxEBvrxF4MtREb6MAPIFaGtzVCQHHQnMQReJ1OYvAnVeLKLzS0Cd3xGoNQoQYsExgViwhBALjovEglHAWAC0tTkuEgtGA33EcgEfUZDgI04I+IgVBB9xUsRHjAH6CKCtzUmB+upWAl9OCfBlJYEvp0X48jKQL0Bbm9MCfLmNwJezAnx5l8CXcyJ8GQvkC9DW5pxIDjoOmIOuFqnNxwN1fl9E51eAOq8RqDUKEWLBBYFYsJYQCy6KxIIJwFgAtLW5KBILJgJ9xAYBH1GY4CMuC/iIjQQfcUXER0wC+gigrc0VgfqqCIEvSW4KPl82EfgSfZMGXyYD+QK0tYkOOG4cX4oS+JJcgC8fEPiSQoQvU4B8AdrasNYPnYNOBeagW0Rq82lAnT8S0flVoM4fC9QaxQixILVALNhKiAVpRGLBdGAsANrapBGJBTOAPuJTAR9RnOAj0gv4iO0EH5FBxEe8BvQRQFubDAL1VQkCXzIL8GUHgS9ZRPjyOpAvQFubLAJ8KUngS3YBvnxG4EsOEb7MBPIFaGuTQyQHnQXMQXeJ1OZvAHX+QkTn2UCdvxSoNUoRYkEugViwmxALcovEgjnAWAC0tcktEgvmAn3E1wI+ojTBR+QV8BF7CT4in4iPeBPoI4C2NvkE6qsyBL4UEODLPgJfCorwZR6QL0Bbm4ICfIkh8KWQAF++IfClsAhf5gP5ArS1KSySgy4A5qAHRGrzt4A6fyei89tAnb8XqDUMIRYUE4gFBwmxoLhILFgIjAVAW5viIrFgEdBHHBbwEbEEH1FKwEccIfiI0iI+YjHQRwBtbUoL1FdlCXwxAnw5SuBLrAhf3gHyBWhrEyvAl3IEvpQX4MuPBL7EifBlCZAvQFubOJEcdCkwBz0uUpsvA+r8s4jOy4E6/yJQa5QnxIJKArHgBCEWVBaJBSuAsQBoa1NZJBasBPqI3wR8RBzBR1QR8BGnCD6iqoiPeBfoI4C2NlUF6qsKBL5UF+DLaQJfaojw5T0gX4C2NjUE+FKRwJeaAnw5Q+BLLRG+rALyBWhrU0skB10NzEHPidTm7wN1/kNE5zVAnc8L1BqVCLGgtkAsuECIBXVEYsFaYCwA2trUEYkF64A+4k8BH1GZ4CPqCviIywQfUU/ER6wH+gigrU09gfrqdgJf6gvw5QqBLw1E+LIByBegrU0DAb7cQeBLQwG+/EXgSyMRvmwE8gVoa9NIJAfdBMxBozNo6PwBUOekIjp/CNQ5WYbgx4IqhFjQWCAWJM+A/9wmIrFgMzAWAG1tmojEgi1AH5FKwEdUJfiIpgI+IjXBRzQT8REfAX0E0NammUB9dSeBLy0E+JKGwJeWInz5GMgXoK1NSwG+VCPwpY0AX9IS+NJWhC9bgXwB2tq0FclBtwFz0AwitfknQJ0ziuj8KVDnTAK1RnVCLGgvEAsyE2JBB5FYsB0YC4C2Nh1EYsEOoI/IRvKLScA6f5ZEQ87PReTcKSLnLhE5vxCR80sROXeLyLlHRM6vROT8WkTOvSJy7hOR8xsROb9Nkjg54nWfKwrUeX8i6RxzfS9zAJkXp9fA43civPleRM6DInIeEpHzBxE5D4vIeUREzqMicv4oIudPInIeE5HzuIicP4vI+YuInCdE5DwpIuevInL+JiLnKRE5T4vIeUZEzt9F5DwrIuc5ETn/EJHzvIicF0TkvCgi5yUROf8UkfOyiJxXROT8S0RO1+xWkDOJiJzRInImFZEzmYicyUXkTCEiZ0oROVOJyJlaRM40InKmFZEznYic6UXkzCAiZ0YROTOJyJlZRM4sInJmFZEzm4ic2UXkzCEiZ04ROW8SkTOXiJy5ReS8WUTOPCJy5hWRM5+InLeIyJlfRM4CInIWFJHzVhE5bxORs5CInIVF5CwiImdRETmLichZXETOEiJylhSRs5SInKVF5CwjImeMiJxGRM5YETnLishZTkTO8iJyxonIWUFEzooiclYSkbMySc7oq+S83uegkwN1vl1E5xRAne8Q0TklUOcqIjqnAupcVUTn1ECd7xTROQ1Q52oiOqcF6lxdROd0QJ1riOicHqjzXSI6ZwDqfLeIzhmBOtcU0TkTUOdaIjpnBup8j4jOWYA63yuic1agzrVFdM4G1LmOiM7ZgTrfJ6JzDqDO94vonBOoc10RnW8C6lxPROdcQJ0fENE5N1DnB0V0vhmoc30RnfMAdW4gonNeoM4PieicD6jzwyI63wLUuaGIzvmBOjcS0bkAUOdHRHQuCNT5URGdbwXq3FhE59uAOjcR0bkQUOfHgDq7+wGSxX/WHRH6J4lfg6Tx/+72z91+sttfdfuNbv/N7Ue5/Rm3X+H6966f7fq7rt/p+n+uH+b6Q65f4voHrp529aWrt1z94fJxl5+6fM3lLy6eu/iW3w7n/5w/cPxweHHr586CL2JHUTuK2VHcjhJ2lLSjlB2l7Sjj1sQOY0ess5sd5ewob0ecHRXsqGhHJTsq23F7hM75o/+1DlXsqGrHnfF2q25HDTvusuNuO2raUcuOe+y4147adtSx4z477rejrh317HjAjgftqG9HAzsesuNhOxra0ciOR+x41I7GdjSx4zE7HrejqR3N7GhuxxN2tLCjpR2t7GhtRxs72trRzo4n7WhvRwc7OtrRyY7OdnSxo6sdT9nRzY7udvSwo6cdvezobcfTdvSxo68d/ex4xo5n7ehvxwA7nrNjoB2D7BhsxxA7nrdjqB3D7Bhuxwt2jLBjpB0v2vGSHaPsGG3HGDtetmOsHePsGG/HK3ZMsGOiHZPsmGzHFDum2jHNjlftmG7HDDtes+N1O2baMcuON+yYbcccO+ba8aYd8+yYb8cCO96y4207FtqxyI7FdrxjxxI7ltqxzI7ldqywY6Ud79rxnh2r7Fhtx/t2rLFjrR3r7FhvxwY7NtqxyY4P7PjQjs12bLHjIzs+tmOrHdvs+MSOT+3YbscOOz6z43M7dtqxy44v7PjSjt127LHjKzu+tmOvHfvs+MaOb+3Yb8cBO76z43s7DtpxyI4f7DhsxxE7jtrxox0/2XHMjuN2/GzHL3acsOOkHb/a8Zsdp+w4bccZO36346wd5+z4w47zdlyw46Idl+z4047Ldlyx4y87nDNIYke0HUntSGZHcjtS2JHSjlR2pLYjjR1p7UhnR3o7MtiR0Y5MdmS2I4sdWe3IZkd2O3LYkdOOm+zIZUduO262I48dee3IZ8ctduS3o4AdBe241Y7b7ChkR2E7ithR1I5idhS3o4QdJe0oZUdpO8rY4ZycsSPWjrJ2lLOjvB1xdlSwo6IdleyobMftdtxhRxU7qtpxpx3V7KhuRw077rLjbjtq2lHLjnvsuNeO2nbUseM+O+63o64d9ex4wI4H7ahvRwM7HrLjYTsa2tHIjkfseNSOxnY0seMxOx63o6kdzexobscTdrSwo6UdrexobUcbO9ra0c6OJ+1ob0cHOzra0cmOznZ0saOrHU/Z0c2O7nb0sKOnHb3s6G3H03b0saOvHf3seMaOZ+3ob8cAO56zY6Adg+wYbMcQO563Y6gdw+wYbscLdoywY6QdL9rxkh2j7Bhtxxg7XrZjrB3j7Bhvxyt2TLBjoh2T7JhsxxQ7ptoxzY5X7Zhuxww7XrPjdTtm2jHLjjfsmG3HHDvm2vGmHfPsmG/HAjvesuNtOxbasciOxXa8Y8cSO5bascyO5XassGOlHe/a8Z4dq+xYbcf7dqyxY60d6+xYb8cGOzbascmOD+z40I7Ndmyxw33fuPsOZfe9sO67Td13fbrvvnTfDei+385935v7LjX3PWXuO8Dc92u5765y3wvlvnPJfZ+R+64g9z087jtu3PfHuO9mcd9V4r4HxH0vxvd2uO9zcN+V4L6HwJ3x787Pd2fTu3Pf3Znq7rxydxa4O2fbnWHtzod2Zy+7c43dmcHuPF531q07R9ad0erOP3Vni7pzO92ZmO68SXeWozsn0Z1B6M73c2fnuXPpXCLgzlNzZ5W5c8DcGVvu/Cp3NpQ7d8mdaeTOC3Jn8bhzbtwZMu58Fnf2iTtXxJ3Z4c7DcGdNuHMc3BkJ7vwB92y/e27ePZPunvd2z1K755TdM8Du+Vr37Kp7LtTFZfc8o3tW0D2H555xc8+PuWez3HNP7pki97yOexbGPWfinuFwz0e4Zw/cff3unnl3P7q719vdR+3uUXb3/7p7a919q+6eUHe/pbuX0d3b5+51c/d+uXuh/nFvkB3u3hF3L4W7t8Dttbu9Z7cX6/Ym3V6d27tyezlub8P1+l3v2/WCXW/U9Qpd78z1klxvxfUaXO3talFXm7laxeXuLpd1ud0bCV9UGfXPXCXhlSf+Z4uePdt0fqpn/p5d87do3Tr/0+17Ppm/a+823dt26urC+T9ylr87p5bHnDoRcwr855zOvTr1bP9Up77/ObGu78T6HlI+7HuxR30nPuY7sZnvxBa+E1v5TmzjO7Fd1N83YUffiz3lO7G778TevhP7+U4c5LGgwyPmZIn/+VSvHvY/9eqZv2vb/C279urS2pUK/8jpvcSa7CHW6x5z3vSYs9hjzgqPOes85mzxmPOZx5zdHnP2Rcz5v2GzP+J//i3Y/Owh1hmPORc95rj65+/OSeUxJ5PHnJs85uT3mFPUY47xmFM+Ys7fAlBF34l3eEhZy/ditX0n1vWQspHHnOa+Arb0ndjWQ8qOvhfr4juxu4eU/X0vNtJ34hjfiVN9J77pO/Ft34nv+k780HfiVt+J230nfu478UsPmH7je7EDvhMPeUh53GPOKV8Bf/edeN5DyqTRnhfL4Dsxl+/E23wnlvGdWNl3Yk3fiQ/6TnzMd2Jb34ndfCc+6ztxuO/Ecb4Tp/tOnOc7cZnvxHW+E7f6TvzSd+J3vhOP+0486zsxKqnnxLS+E3P4TizgO7Gk78QKvhNr+E6s6Tuxtu/EuhET/9uY+oDvxer7TnzIQ8qmvhdr7juxhYeUbT3mdPEV8Cnfid09pOzpe7HevhP7eEjZ3/diQ3wnDvWdONJ34su+E8f5TpzkO3G678TXfCfO9J34hu/EOR4wXex7sSW+E5d5SPmex5y1vgKu95240UPKLb4X+8R34ue+E3f7TtznO/E734mHfSce85140nfiGd+J530nXvadGJ3Mc2JK34npfCdm9p2Yw3fizb4T8/tOLOQ7sbjvxDK+E8v5TqzkO7Gq78S7fCfe6zuxru/EBr4TH/Gd2Nh34mO+E5tGTPxvY2prjzkdIub835vlnXxV+cZDrB885hz3mHPaY855jzlJkv/9Oak95mT2mJPTY06eiDn/N2zyRfzPvwWb+zzEeshjThOPOS095jzpMecpjzl9POYM9Jjzgseclz3mvOILoEm+E6d5SDnL92JzfCfO95BysceclR5z1vsqtcl34hYPKT/xvdgO34m7PKTc73ux730nHvaQ8mePOac95lzyVeqK78ToFH9fypQpPC+WxndiBg8pc/leLI/vxPweUhbxmFPaY04FX6Uq+06s6iHlXb4Xq+U7sY6HlA19L/ao78THPaRs5TGng8ecHr5K9fad2M9Dyud8LzbYd+IwDylH+F7sJd+JL3tIOcn3YlN9J87wkHK2x5wFHnMW+yq11HfiSg8p1/pebIPvxA89pNzmMedzjzm7fZX62nfitx5S/uh7seO+E096SHnWY86fHnOSpvRUKoXvxDQp/76U2X0vdpPvxDweUt7qMae4xxzjq1Q534kVPaS8y/ditXwn1vGQsr7HnEc95jT3Vaql78S2HlJ2871YT9+JfTykfM5jzjCPOaN8lXrZd+IrHlK+5nuxWb4T53pIudBjznKPOe/7KrXOd+ImDym3+17sc9+JX3pI+Y3HnEMec475KvWL78TfPKS85HuxK74To1P9fSlTe8zJ5DEnZypPpXL7TsznIWUx34uV9J0Y4yFlBY85VT3m1PRV6l7fifd7SPmI78Wa+E5s5iFlG485nTzm9PBVqrfvxH4eUg71vdgLvhNf8pByvMecqR5zZvoqNdt34jwPKZf5Xmyl78TVHlJu9Jjzscecz3yV2uU7cY+HlAd9L3bYd+JPHlL+6jHnnMecy75K/eOMV5+JyVL/fSkz+l4si+/EHB5S5vWYc5vHnBK+SpX2nRjrIWUV34tV8514t4eU93nMaeAxp7GvUo/7TnzCQ8pWvhdr6zuxg4eUnXwv1sV34lMeUj7je7H+vhOf85ByiMec4R5zxvgqNdZ34ngPKSf4XmyS78QpHlLO9r3YXN+J8zykfNtjzjsec97zVWq178Q1HlKu873YBt+Jmzyk3O57sc98J+70kHK3x5y9HnMO+ir1g+/EIx5S/uh7sWO+E3/2kPKc78XO+0686CHlFY850Wn+/pw0aTyVSuc7MYOHlJl8L5bFd2I2Dylz+F7sJt+JuT2kLOR7sSK+E4t5SFnKY47xmBPnq1RF34mVPaSs6Xuxe3wn1vaQsq7HnPoecxr5KvWo78QmHlK28b1YO9+J7T2k7Owxp5vHnN6+SvXxndjPQ8qhvhcb7jtxhIeUozzmjPWYM9FXqcm+E6d6SDnH92Jv+k6c7yHlQo85SzzmrPRV6j3fias9pNzse7GPfCdu9ZByu8ecnR5z9vgq9bXvxH0eUh7xvdiPvhOPeUh5wmPOKY8553yVOu878aKHlMnTel4spe/E1Gn/vpTpPeZk9piTw1epm3wn5vaQspDvxYr4TizmIWUpjznGY06cr1IVfSdW9pCypu/F7vGdWNtDyroec+p7zGnkq9SjvhObeEjZxvdi7XwntveQsrPHnG4ec3r7KtXHd2I/DymH+l5suO/EER5SjvKYM9ZjzkRfpSb7TpzqIeUc34u96TtxvoeUCz3mLPGYs9JXqfd8J672kHKz78U+8p241UPK7R5zdnrM2eOr1Ne+E/d5SHnE92I/+k485iHlCY85pzzmnPNV6rzvxIseUiZP53mxlL4TU6f7+1Km95iT2WNODl+lbvKdmNtDyjy+F8vnOzG/h5RFPOaUipjzfx/pV8ZXlfMeYkWl//tzUnrMyegxJ7vHnHwecwp7zIn1mFMhYs7/DYFKEf/zb0FggIdYwzzmjPKYM8FjzjSPOW94zHnLY84yjznve8zZ7AuGj30nfuoh5Re+F9vjO3Gfh5Tfe8z50WPOb75KnfGd+IeHlH/6Xuwv34lJM/x9KTNk8LxYZt+J2T2kzOMx51aPOSV9lSrjO7Gsh5QVfS92u+/EOz2krON7sbq+E+t7SPmox5zmHnOe9FWqo+/Erh5S9vS92NO+E5/xkHKY78VG+E4c5SHlKx5zpnnMme2r1Ju+E9/ykPId34st8534roeU63wvttF34mYPKT/xmLPTY84eX6X2+k7c7yHlYd+L/eg78WcPKU95zPnDY86fvkr95Tsxaca/L2WGjJ4Xy+w7MbuHlHk85tzqMae4r1KlfCcaDynv8L3Ynb4T7/KQso7HnPoecx71Veox34nNPaTs4Huxzr4Tu3lI2cdjznMec4b5KjXCd+IoDykn+15smu/E1zyknOsxZ6HHnOW+Sr3rO/F9Dym3+F5sq+/E7R5Sfukx5xuPOYd8lTriO/GYh5S/+17sD9+JlzykjM709+ek9piTKZOnUll9J+b0kLKg78UK+U4s5iFljMecCh5zqvoqVd13Yk0PKR/0vdhDvhMf8ZCymcecNh5zOvkq1dV3Yg8PKQf4XmyQ78ShHlK+5DFnvMecqb5KTfedONNDyrd9L7bYd+IyDylXe8zZ6DHnY1+lPvGd+JmHlPt8L7bfd+JBDyl/8pjzq8ecc75KXfCdeNlDylSZPS+W1ndixsx/X8ocHnPyesy5zVepIr4TS3hIGed7sUq+E6t4SHm3x5z7POY08FWqoe/Exh5Stva9WDvfiR09pOzuMaevx5yBvkoN8Z043EPKEb4Xe9F34igPKSf7Xmyq78RXPaR83WPObI85b/sqtch34jseUi71vdhy34krPaTc6HuxD3wnbvaQcqvHnO0ec3b7KvWV78S9HlJ+43ux/b4Tv/OQ8rjvxX7xnXjSQ8rTHnPOecy54qvU/9wa/ncnRmf5+1Im871YCt+JqTykzOp7sey+E3N6SHmzx5xbPOYU8VWqmO/EEh5SlvK9WBnficZDyjt8L1bVd2I1Dynv9phzr8ecur5KPeA7sb6HlI/7XqyZ78QnPKRs7THnSY85nX2V6uo7sZuHlM/6XmyA78SBHlI+7zHnBY85o3yVGuM7cayHlK/6XmyG78TXPaSc7TFnnsechb5KLfaduMRDyjW+F1vnO3GDh5Qfesz52GPOdl+lPvOduNNDym99L3bAd+L3HlIe9pjzk8ecE75K/eo78ZSHlH/6XuyK78SorH9fymQec1J5zEmf1VOpjL4TM3tImcf3Yvl8J+b3kPI2jzlFPeaU8lWqjO9E4yHlHb4Xq+o7sZqHlHd7zLnXY05dX6Ue8J1Y30PKx30v1sx34hMeUrb2mPOkx5zOvkp19Z3YzUPKZ30vNsB34kAPKZ/3mPOCx5xRvkqN8Z041kPKV30vNsN34useUs72mDPPY85CX6UW+05c4iHlGt+LrfOduMFDyg895nzsMWe7r1Kf+U7c6SHlt74XO+A78XsPKQ97zPnJY84JX6V+9Z14ykPKP30vdsV3YlS2vy9lMo85qTzmpM/mqVRG34mZPaTM43uxfL4T83tIeZvHnKIec0r5KlXGd6L5u1Imi/9PCZRx36oWHf97Ejvcv1eLfx9zfS8T8Y1t2M+uWK5S6qh/fc01WO4497lpOJ8dk9J+xl2p/rX2URHXSmrH3fH/lvAz4fru32rF/63WNf7tnvi/3RPxb0ni/+3e+L/de9W/pY//96gImdLHf2akDO5vyeP/VjPibymi/l0e97eUUf8uh/tbwveYJ1zf/Ui408LhsHbEF527lzsSMVf87226dOvVplebB3u17NS+Va1eXVr1bN+1y10tOnWKuuqVIuL3pBG/J4v4Pfn/8v9TRvye6hr/nvBKWPD/7W8JCxv5uzsE9b74v4mSrWVINm2yJTh79+8JZEsa8bc68X+LDA4J/y864v9FYiwq/j3JdmWTXHWtSN6lifhJwqVJEnGdhOsnXCthTdJF/WttW1mf9GD39r1b9GyT4KYiXUGaq6Ze7SYiXwn/J6guLWPEZ0Uuf4qrZEx4n6BPpoj/n/Bv4Wf9f/dZqSN+R7te93kpr5Lpavq4/5P8qv+T8hr6JmAxOWEN/t8+K8nf+KykEfInu2p+0oj/F7kuSSP+79XXRMomghtzLUxcCzeprvo/ya+hb8I6pyKsAdI2kalBsoi/JfyeoEfaiLnuZ7arrlUt/n3M9b3+kUpm53x2TCT2E+TPHqFTdMS/o64ZFbG+kdiKjvhbwr+nipAlCV4WE/GR/7jm1bE/opX1P/8WKRMp3Yp1n52W89n/ZvME+dNeww7JrqF75O/RUf+ZP0X+fq2/pb/GdbJe42//D8StQp59QRYA","debug_symbols":"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m2etHqtnrayetbJ61p59I9ON7lfP2rNvZLrR/epZe/aNTDe6Xz1rZfWsldWzVlfPWl09a3X1rNXVs/bJ+6Ae3f3qWXv6vVHXu189a0+/N+p696tn7en3Rl3vfvWsXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oXb03SlfvjdLVe6N09d4oPfveqNG5dO/fdn/yWXuj+/tnrWW89uMi17uXKHs9WmK++gbyT91/7mhO1pE9YL/T93U0468d5aHyRkdyuo70dB3Z6Try53aUnXPpaI7j5lXaLleK/ioH9aX7WN19ru6+Vnffq7ufk3d/7d7K5FjdvazuXld3b6u7P/usvd792Wft9e7PPmuvd3/2WXu9+7PP2uvdr561unrW6upZq6tnra6etQ/Yl/SR3a+etbp61urqWaurZ62unrW2etba6llrq2etrZ61D9iX9JHdr561tnrW2upZa6tnra2etb561vrqWeurZ62vnrUP2Jf0kd2vnrW+etb66lnrq2etr561sXrWxupZG6tnbayetQ/Yl/SR3a+etbF61sbqWRurZ22snrW5etbm6lmbq2dtrp61D9iX9JHdr561uXrW5upZm6tnba6etbV61tbqWVurZ22tnrUP2Jf0kd2vnrW1etbW6llbq2dtrZ61vXrW9upZ26tnba+etQ/Yl/SR3a+etb161vbqWdurZ22vnrWzetbO6lk7q2ftrJ61D9iX9JHdr561s3rWzupZO6tn7WyetX5snrV+bJ61fmyetX5snrV+bJ61fvq9Ude73zxr/fR7o653v3nW+uq9Ub56b5Sv3hvlq/dG+eq9Ub56b5Sv3hvlq/dG+eq9Ub56b5Sv3hvlq/dG+eq9Ub56b5SffW/U1d3jfva9UTe6f+7OfZloee1+YvpG9/ryhFyeG3X3Xx3/+Qxy/RnU+jPo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","brillig_names":["enqueue_public_function_call_internal","call_private_function_internal","directive_invert","directive_integer_quotient"]},{"name":"compute_note_hash_and_optionally_a_nullifier","is_unconstrained":true,"custom_attributes":[],"abi":{"error_types":{"3715688037512703171":{"error_kind":"fmtstring","item_types":[],"length":16}},"parameters":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"nonce","type":{"kind":"field"},"visibility":"private"},{"name":"storage_slot","type":{"kind":"field"},"visibility":"private"},{"name":"note_type_id","type":{"kind":"field"},"visibility":"private"},{"name":"compute_nullifier","type":{"kind":"boolean"},"visibility":"private"},{"name":"serialized_note","type":{"kind":"array","length":0,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/9VYTXPaMBCVg41lUwe3gEnSQ3ttT3IwNNyY6ef/8KTX/IT89bBGOzw2xBkUaSZoxiNb0r59eitpbUdqV/T2iux9Yuuhel54zMbW5m2l9ohlQvKMzoTnxZnwHJwJz9gjz+gIT6pje0/7jvZcqnb78VknGlOgB9Cv+oCk10dbZxYInW08KZcJv96w75o2s9wD8F4Sbh4G21BAfuq99gp8UTD/2j6uI3sVtl+BfaH2Af8FbbxQfkMbn+R/oC1Vh76Ijw4Tr7uA8TIFaKjABxbcJLzecxUszl22GAn/ufDfxdQKrqEttg8jaEvEmqHHL9CvYU7c/13MDbkMBBfCTUJoYWM/DIFtTIMaxkc0TI5oODyi4WR7/RM4xDvVQXh3mUADxxh8Mc8LGKOBRwLP39S+PYOTPgZdGHdMc+d1pF+2i4VdCWOGYJcKuxR4d2O311d7P7J64hng701ltZZntj/sH4tM7feiZ973hP0hCHbTYReA7XP9EvZlGE1WhD0Og93l9jII9m2nyUfA9vjFUFMcP6nDQv4mQeJb1335k33mwClE/pwI/+wL8+dUcCqhDffVVGBNBRZpOYPxHtfcf+Q0O4ET2pWOdiNHu1N4knYVjPd49jbIqXKcy9jRLne0OyVWpN0cxntcdwfazR3n4qrdpaNd5mjnus5d5zcHvngG+/xLhJxii82+OM8kMObB1nQuXqnDQjyvgafHXHHblyuugRPfM7dccErewGmxWJt2tV6umrq9b9tFBNjMiZ/xf8eNGCNzDOn2OYxuBr9dbkAnfv9G7fibgLngt0sG9r459unIPkvBlXm8pj9pfQX3PJcC7DZe5rH7R4DvE+xrFkQ3s+zbE+wzV6He33bvTzPhfyL0J00qwamENoxlJbAqgfUe7PAfGc+V8sIT7yz2rOIYAAA=","debug_symbols":"tdnBaoNAEIDhd9mzBzW7Mzu+SilBEw0LokFNoYjvXm1DCeT8X8TR2f/2nXZ117Z53M5p6MbZVR+r68dLvaRx2Kd1y1wzpb5Pt/PrZ5cfD1/+7s/3ejjGeamnxVVl8Jlrh+vxZvv5LvWtq7zkW/a2q+VzVfV/cz/0mTl/AtsebAewLWBbwXYE28a1Qw62C7ANugygywC6DKDLALoMoMsAugygSwFdCuhSQJcCuhTQpYAuBXQpoEsBXQroUkGXCrpU0KWCLhV0qaBLBV0q6FJBlwq6jKDLCLqMoMsIuoygywi6jKDLCLqMoMsIujTQpYEuDXRpoEsDXRro0kCXBro00KWBLos8J+MFGS/J+ImMezIeyLiQcSXjkYyTQgtM6LZPX/WU6qZvnzcg3WO4vFyILN/3vz/78g8=","brillig_names":["compute_note_hash_and_optionally_a_nullifier"]}],"outputs":{"globals":{},"structs":{"functions":[{"fields":[{"name":"parameters","type":{"fields":[{"name":"app_payload","type":{"fields":[{"name":"function_calls","type":{"kind":"array","length":4,"type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"target_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_public","type":{"kind":"boolean"}},{"name":"is_static","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::entrypoint::function_call::FunctionCall"}}},{"name":"nonce","type":{"kind":"field"}}],"kind":"struct","path":"authwit::entrypoint::app::AppPayload"}}],"kind":"struct","path":"MultiCallEntrypoint::entrypoint_parameters"}}],"kind":"struct","path":"MultiCallEntrypoint::entrypoint_abi"}]}},"file_map":{"113":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr","source":"use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n messaging::process_l1_to_l2_message, hash::{hash_args_array, ArgsHasher},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n oracle::{\n key_validation_request::get_key_validation_request, arguments, returns::pack_returns,\n call_private_function::call_private_function_internal, header::get_header_at,\n logs::{emit_encrypted_note_log, emit_encrypted_event_log},\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, notify_set_min_revertible_side_effect_counter,\n set_public_teardown_function_call_internal\n}\n}\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext, function_selector::FunctionSelector, max_block_number::MaxBlockNumber,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_request::PublicCallRequest, read_request::ReadRequest, note_hash::NoteHash,\n nullifier::Nullifier, log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_ENCRYPTED_LOGS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, messaging::l2_to_l1_message::L2ToL1Message, traits::Empty\n};\n\n// When finished, one can call .finish() to convert back to the abi\npub struct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n args_hash: Field,\n return_hash: Field,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n private_call_requests : BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_requests : BoundedVec<PublicCallRequest, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n public_teardown_call_request: PublicCallRequest,\n l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n unencrypted_logs_hashes: BoundedVec<LogHash, MAX_UNENCRYPTED_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n\n fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n fn push_nullifier(&mut self, nullifier: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: 0, counter: self.next_counter() });\n }\n\n fn push_nullifier_for_note_hash(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: nullified_note_hash, counter: self.next_counter() });\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage,\n nullifier_read_requests: self.nullifier_read_requests.storage,\n key_validation_requests_and_generators: self.key_validation_requests_and_generators.storage,\n note_hashes: self.note_hashes.storage,\n nullifiers: self.nullifiers.storage,\n private_call_requests: self.private_call_requests.storage,\n public_call_requests: self.public_call_requests.storage,\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage,\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage,\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage,\n unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\"Setting {0} as fee payer\", [self.this_address().to_field()]);\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number = MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request = self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one\n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale. We fetch new values from oracle and instruct\n // protocol circuits to validate them by storing the validation request in context.\n let request = get_key_validation_request(pk_m_hash, key_index);\n let request_and_generator = KeyValidationRequestAndGenerator { request, sk_app_generator: sk_generators[key_index] };\n // We constrain that the pk_m_hash matches the one in the request (otherwise we could get an arbitrary\n // valid key request and not the one corresponding to pk_m_hash).\n assert(request.pk_m.hash() == pk_m_hash);\n self.key_validation_requests_and_generators.push(request_and_generator);\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(&mut self, content: Field, secret: Field, sender: EthAddress) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(&mut self, note_hash_counter: u32, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n let (end_side_effect_counter, returns_hash) = call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n\n let call_context = self.generate_call_context(\n contract_address,\n function_selector,\n is_static_call,\n is_delegate_call\n );\n\n self.private_call_requests.push(\n PrivateCallRequest {\n contract_address,\n call_context,\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter\n }\n );\n\n PackedReturns::new(returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n is_delegate_call\n );\n\n let call_context = self.generate_call_context(\n contract_address,\n function_selector,\n is_static_call,\n is_delegate_call\n );\n\n let call_request = PublicCallRequest { contract_address, call_context, args_hash, counter };\n self.public_call_requests.push(call_request);\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.set_public_teardown_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn set_public_teardown_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n is_delegate_call\n );\n\n let call_context = self.generate_call_context(\n contract_address,\n function_selector,\n is_static_call,\n is_delegate_call\n );\n\n self.public_teardown_call_request = PublicCallRequest {\n contract_address,\n call_context,\n args_hash,\n counter,\n };\n }\n\n fn generate_call_context(\n self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> CallContext {\n let msg_sender = if is_delegate_call {\n self.msg_sender()\n } else {\n self.this_address()\n };\n let storage_contract_address = if is_delegate_call {\n self.this_address()\n } else {\n contract_address\n };\n CallContext { msg_sender, storage_contract_address, function_selector, is_static_call, is_delegate_call }\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n}\n"},"141":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr","source":"use dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{GENERATOR_INDEX__SECRET_HASH, GENERATOR_INDEX__MESSAGE_NULLIFIER, GENERATOR_INDEX__FUNCTION_ARGS},\n point::Point, traits::Hash,\n hash::{sha256_to_field, poseidon2_hash_with_separator, poseidon2_hash_with_separator_slice}\n};\nuse crate::oracle::logs_traits::ToBytesForUnencryptedLog;\n\npub use dep::protocol_types::hash::{compute_siloed_nullifier, pedersen_hash};\n\npub fn pedersen_commitment<let N: u32>(inputs: [Field; N], hash_index: u32) -> Point {\n std::hash::pedersen_commitment_with_separator(inputs, hash_index)\n}\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<T, let N: u32, let M: u32>(\n contract_address: AztecAddress,\n log: T\n) -> Field where T: ToBytesForUnencryptedLog<N, M> {\n let message_bytes: [u8; N] = log.to_be_bytes_arr();\n // can't use N - not in scope error\n let n = message_bytes.len();\n let mut hash_bytes = [0; M];\n // Address is converted to 32 bytes in ts\n let address_bytes = contract_address.to_be_bytes_arr();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes: [u8; 4] = (n as Field).to_be_bytes();\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..n {\n hash_bytes[36 + i] = message_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field\n) -> Field {\n let mut hash_bytes = [0 as u8; 192];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret and index of the message hash\n// in the L1 to L2 message tree\npub fn compute_message_nullifier(message_hash: Field, secret: Field, leaf_index: Field) -> Field {\n poseidon2_hash_with_separator(\n [message_hash, secret, leaf_index],\n GENERATOR_INDEX__MESSAGE_NULLIFIER\n )\n}\n\npub struct ArgsHasher {\n fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<let N: u32>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator_slice(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nunconstrained fn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..100 {\n input.add(i as Field);\n }\n let hash = input.hash();\n dep::std::println(hash);\n assert(hash == 0x19b0d74feb06ebde19edd85a28986c97063e84b3b351a8b666c7cac963ce655f);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"dummy\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"Hello this is a string\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"},"161":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr","source":"use dep::protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress, utils::reader::Reader};\n\n#[oracle(callPrivateFunction)]\nunconstrained fn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; 2] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> (u32, Field) {\n let fields = call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let mut reader = Reader::new(fields);\n let end_side_effect_counter = reader.read_u32();\n let returns_hash = reader.read();\n\n (end_side_effect_counter, returns_hash)\n}\n"},"166":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr","source":"use dep::protocol_types::{abis::{function_selector::FunctionSelector}, address::AztecAddress};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) {}\n\nunconstrained pub fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n}\n\n#[oracle(notifySetMinRevertibleSideEffectCounter)]\nunconstrained fn notify_set_min_revertible_side_effect_counter_oracle(_counter: u32) {}\n\nunconstrained pub fn notify_set_min_revertible_side_effect_counter(counter: u32) {\n notify_set_min_revertible_side_effect_counter_oracle(counter);\n}\n"},"278":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr","source":"use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, log_hash::{LogHash, ScopedLogHash, ScopedEncryptedLogHash},\n note_hash::ScopedNoteHash, nullifier::ScopedNullifier\n},\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n MAX_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX\n},\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n recursion::verification_key::VerificationKey, traits::{is_empty, ToField},\n utils::field::field_from_bytes_32_trunc\n};\nuse super::utils::field::field_from_bytes;\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = std::hash::sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path)\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n poseidon2_hash_with_separator(\n [\n tx_hash,\n note_index_in_tx as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field {\n let inputs = [nonce, note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [\n app.to_field(),\n unique_note_hash\n ],\n GENERATOR_INDEX__SILOED_NOTE_HASH\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [\n app.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n // We assume contract address has already been masked\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n accumulate_sha256([log_hash.contract_address.to_field(), log_hash.log_hash.value])\n }\n}\n\npub fn mask_encrypted_log_hash(scoped_log: ScopedEncryptedLogHash) -> AztecAddress {\n if scoped_log.contract_address.is_zero() {\n AztecAddress::from_field(0)\n } else if (scoped_log.log_hash.randomness == 0) {\n scoped_log.contract_address\n } else {\n AztecAddress::from_field(\n poseidon2_hash_with_separator(\n [scoped_log.contract_address.to_field(), scoped_log.log_hash.randomness],\n 0\n )\n )\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn silo_l2_to_l1_message(msg: ScopedL2ToL1Message, rollup_version_id: Field, chain_id: Field) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes: [u8; 32] = input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\n// NB: this assumes MAX_ENCRYPTED_LOGS_PER_TX == MAX_UNENCRYPTED_LOGS_PER_TX\n// to avoid doubling code, since we can't define the byte len to be 32*N directly.\npub fn compute_tx_logs_hash(logs: [LogHash; MAX_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn compute_tx_note_logs_hash(logs: [LogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_NOTE_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_NOTE_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(\n inputs: [Field; N],\n separator: T\n) -> Field where T: ToField {\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of N + 1\n let in_len = N + 1;\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field where T: ToField {\n let in_len = inputs.len() + 1;\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of Math.ceil(N/31)\n let mut in_len = N / 31;\n let mut has_padding = false;\n if N % 31 != 0 {\n in_len += 1;\n has_padding = true;\n }\n\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n sponge.absorb(field_from_bytes(current_field, false));\n current_field = [0; 31];\n }\n }\n if has_padding {\n sponge.absorb(field_from_bytes(current_field, false));\n }\n\n sponge.squeeze()\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\n 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\n 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,\n 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,\n 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,\n 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = std::hash::sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), EthAddress::from_field(3), 5, 2, 4);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3)\n },\n version,\n chainId\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"},"301":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr","source":"pub struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<let K: u32>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n // TODO(#4394)\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"},"337":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr","source":"use crate::{\n crate::address::{partial_address::PartialAddress, public_keys_hash::PublicKeysHash},\n constants::{AZTEC_ADDRESS_LENGTH, GENERATOR_INDEX__CONTRACT_ADDRESS_V1},\n hash::poseidon2_hash_with_separator, traits::{Empty, FromField, ToField, Serialize, Deserialize},\n utils\n};\n\n// Aztec address\npub struct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn compute(pub_keys_hash: PublicKeysHash, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n poseidon2_hash_with_separator(\n [pub_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS_V1\n )\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys_hash() {\n let pub_keys_hash = PublicKeysHash::from_field(1);\n let partial_address = PartialAddress::from_field(2);\n\n let address = AztecAddress::compute(pub_keys_hash, partial_address);\n let expected_computed_address_from_partial_and_pubkey = 0x23ce9be3fa3c846b0f9245cc796902e731d04f086e8a42473bb29e405fc98075;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"},"34":{"path":"std/hash/poseidon2.nr","source":"use crate::hash::Hasher;\nuse crate::default::Default;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field;3],\n state: [Field;4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n fn new(iv: Field) -> Poseidon2 {\n let mut result = Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32, is_variable_length: bool) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub struct Poseidon2Hasher{\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv : Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"},"460":{"path":"/usr/src/noir-projects/noir-contracts/contracts/multi_call_entrypoint_contract/src/main.nr","source":"// An entrypoint contract that allows everything to go through. Only used for testing\n// Pair this with SignerlessWallet to perform multiple actions before any account contracts are deployed (and without authentication)\nuse dep::aztec::macros::aztec;\n\n#[aztec]\ncontract MultiCallEntrypoint {\n use dep::authwit::entrypoint::app::AppPayload;\n use dep::aztec::macros::functions::private;\n\n #[private]\n fn entrypoint(app_payload: AppPayload) {\n app_payload.execute_calls(&mut context);\n }\n}\n"},"59":{"path":"std/panic.nr","source":"pub fn panic<T, U, let N: u32>(message: fmtstr<N, T>) -> U {\n assert(false, message);\n crate::mem::zeroed()\n}\n"},"7":{"path":"std/collections/bounded_vec.nr","source":"use crate::{cmp::Eq, convert::From};\n\n/// A `BoundedVec<T, MaxLen>` is a growable storage similar to a `Vec<T>` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n/// \n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n/// \n/// For these reasons `BoundedVec<T, N>` should generally be preferred over `Vec<T>` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n/// \n/// Example:\n/// \n/// ```noir\n/// let mut vector: BoundedVec<Field, 10> = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec<T, let MaxLen: u32> {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec<Field, 10> = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec<Field, 10> {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec<Field, 3> = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a \n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n /// \n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n /// \n /// Example:\n /// \n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n /// \n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n /// \n /// Example:\n /// \n /// ```noir\n /// fn sum_of_first_three<let N: u32>(v: BoundedVec<u32, N>) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n /// \n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n /// \n /// Example:\n /// \n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n /// \n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n /// \n /// Example:\n /// \n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n /// \n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n /// \n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n /// \n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure. \n /// vec.set_unchecked(2, 42);\n /// println(vec);\n /// \n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n /// \n /// Panics if the new length of the vector will be greater than the max length.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n /// \n /// v.push(1);\n /// v.push(2);\n /// \n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 4> = BoundedVec::new();\n /// assert(v.len() == 0);\n /// \n /// v.push(100);\n /// assert(v.len() == 1);\n /// \n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n /// \n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n /// \n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec<T, MaxLen>) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n /// \n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n /// \n /// Note that uninitialized elements may be zeroed out!\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n /// \n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n /// \n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n /// \n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n /// \n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array<let Len: u32>(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n /// \n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n /// \n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n /// \n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n /// \n /// ```noir\n /// let mut v1: BoundedVec<Field, 5> = BoundedVec::new();\n /// let mut v2: BoundedVec<Field, 7> = BoundedVec::new();\n /// \n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n /// \n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec<let Len: u32>(&mut self, vec: BoundedVec<T, Len>) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input. \n /// The maximum length of the vector is determined based on the type signature.\n /// \n /// Example:\n /// \n /// ```noir\n /// let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array<let Len: u32>(array: [T; Len]) -> Self {\n assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec<T, MaxLen> = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n /// \n /// Panics if the vector is empty.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n /// \n /// let two = v.pop();\n /// let one = v.pop();\n /// \n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<u32, 3> = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n /// \n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector. \n /// \n /// Example:\n /// \n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n /// \n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> BoundedVec<U, MaxLen> {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n ret\n }\n}\n\nimpl<T, let MaxLen: u32> Eq for BoundedVec<T, MaxLen> where T: Eq {\n fn eq(self, other: BoundedVec<T, MaxLen>) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n\n (self.len == other.len) & (self.storage == other.storage)\n }\n}\n\nimpl<T, let MaxLen: u32, let Len: u32> From<[T; Len]> for BoundedVec<T, MaxLen> {\n fn from(array: [T; Len]) -> BoundedVec<T, MaxLen> {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec<Field, 5> = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec<Field, 5> = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.storage()[2], 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage()[0], 1);\n assert_eq(bounded_vec.storage()[1], 2);\n assert_eq(bounded_vec.storage()[2], 3);\n }\n\n #[test(should_fail_with=\"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec<Field, 2> = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.storage()[0], 1);\n assert_eq(bounded_vec.storage()[1], 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n}\n"},"76":{"path":"/usr/src/noir-projects/aztec-nr/authwit/src/entrypoint/app.nr","source":"use dep::aztec::prelude::PrivateContext;\nuse dep::aztec::protocol_types::{\n constants::GENERATOR_INDEX__SIGNATURE_PAYLOAD, hash::poseidon2_hash_with_separator,\n traits::{Hash, Serialize}\n};\n\nuse crate::entrypoint::function_call::FunctionCall;\n\n// FUNCTION_CALL_SIZE * ACCOUNT_MAX_CALLS + 1\nglobal APP_PAYLOAD_SIZE: u32 = 21;\n// FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS + 32\nglobal APP_PAYLOAD_SIZE_IN_BYTES: u32 = 424;\n\nglobal ACCOUNT_MAX_CALLS: u32 = 4;\n\n// Note: If you change the following struct you have to update default_entrypoint.ts\n// docs:start:app-payload-struct\npub struct AppPayload {\n function_calls: [FunctionCall; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n// docs:end:app-payload-struct\n\nimpl Serialize<APP_PAYLOAD_SIZE> for AppPayload {\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; APP_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, APP_PAYLOAD_SIZE> = BoundedVec::new();\n for call in self.function_calls {\n fields.extend_from_array(call.serialize());\n }\n fields.push(self.nonce);\n fields.storage\n }\n}\n\nimpl Hash for AppPayload {\n fn hash(self) -> Field {\n poseidon2_hash_with_separator(self.serialize(), GENERATOR_INDEX__SIGNATURE_PAYLOAD)\n }\n}\n\nimpl AppPayload {\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; APP_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: BoundedVec<u8, APP_PAYLOAD_SIZE_IN_BYTES> = BoundedVec::new();\n\n for i in 0..ACCOUNT_MAX_CALLS {\n bytes.extend_from_array(self.function_calls[i].to_be_bytes());\n }\n bytes.extend_from_array(self.nonce.to_be_bytes::<32>());\n\n bytes.storage\n }\n\n // Executes all private and public calls\n // docs:start:entrypoint-execute-calls\n fn execute_calls(self, context: &mut PrivateContext) {\n for call in self.function_calls {\n if !call.target_address.is_zero() {\n if call.is_public {\n context.call_public_function_with_packed_args(\n call.target_address,\n call.function_selector,\n call.args_hash,\n call.is_static,\n false\n );\n } else {\n let _result = context.call_private_function_with_packed_args(\n call.target_address,\n call.function_selector,\n call.args_hash,\n call.is_static,\n false\n );\n }\n }\n }\n }\n // docs:end:entrypoint-execute-calls\n}\n"}}}
1
+ {"transpiled":true,"noir_version":"0.35.0+df29d315d6b71131ffe0180c97130395edb2e4ba-x8664","name":"MultiCallEntrypoint","functions":[{"name":"compute_note_hash_and_optionally_a_nullifier","is_unconstrained":true,"custom_attributes":[],"abi":{"error_types":{"14336010898202591232":{"error_kind":"fmtstring","item_types":[],"length":16}},"parameters":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"nonce","type":{"kind":"field"},"visibility":"private"},{"name":"storage_slot","type":{"kind":"field"},"visibility":"private"},{"name":"note_type_id","type":{"kind":"field"},"visibility":"private"},{"name":"compute_nullifier","type":{"kind":"boolean"},"visibility":"private"},{"name":"serialized_note","type":{"kind":"array","length":0,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/9VYzXLaMBAWYDB2AiEmKemNXtuLnRCgN8/0J733CRp+Lj2knckDuDNtn7uoaO2PZctQWB3YGY9krfztt7uS11bNrKW9umqu33Rty2wLzcldmx4nmSJW6pNn7UR41k+EZ+NEeAaKPGsCT9sGrm/3nd1zoVnvxy0lPmwT3QC92QFUY0at/IR+17Wfn7/Mvg6fn56G88XiWzn9t2sj19YBTjGPWWS2Y6OFP01Hs8hsijL/u8hhhn7w7wm/7Qc/Jd7vigoffSG7Ddc+FFUsH+AZKx3XxyVHuKSrg+490zVA94HpcMl/ZDrcJsSJ4tYCXxTX1dR3Xsi3EHyr/aM1poodjlGsY+N1jWaU84jx4fyJT4fmFBWfFtMFoIuYrgk6ir9thzCP5z6EeW9gnK/Jhtlew6SnnGOsfaypwAP+SkZS3HlOgmLTNuow7gHEc+j6/dX1yc0JIGZWwsKLT2V9bTv8JvAmm8i9zubzfpONvTYV77/+wFyy04Axsnnh7lugo2d3YQUCVk+Y32JYoYCFY+S33ROvXP/MrPP3g/DN9ntC7xt4/FZ6Z+rhT8paHPnhvyD82Av+qMQ/A3zNvUL4537iMyb8jh/88luo6wX/tozPBeAbvfhnVJdoP6MNsn3pJfdZts83A9qPGVdf3wyXjA+PD9Ynq0sErj1Bx/doIthJBDuUhz57Plfxe7yUuPYP5CphdRWxIkWsQ32kfFyx53N3nx4lk5HE9UrR744iVlsR69B1Qvm4Zs/n7j49SsZiPq4V/dbMx7kiVqiIpblvNeNFeZRqnZXctemRwrni/xTapDrfZPO/u5ZqzgtTCa/XAxhXrNe3+9brAeOKfIh3LOiOOeOcjZd3j/PlaP44WUwh3gPGlY/hGaK9boT5Uu2nWL80XmKdSv/FNxBXKwHoBkzXBB1xxP/iiGFq898n/mi/J+jwn+N/cpmYzbWWMJ/x/CdX8bc6G2sDNt+XkZdYp/f77kuyHzOuynx2nr1hfPh3dCxw7Qk6XpdiwU4s2DlFLH5+jTG0+4PiFBSVXiuXk2l1lkXvITzLQglAj/N/ufvEyGJ9+ANQAijv/B0AAA==","debug_symbols":"tdnBaoNAEIDhd9lzDq7Z3ZnxVUoJmmhYEA1qCkXy7tU2lEDO/0V2dPxv32lXd2mb+/WUh26cXfWxun4810seh21aHwfXTLnv8/X0+toV+yOE3/35Vg/7OC/1tLiqjOHg2uGyn2z7v8t966qwn992pXyuivxvboufBxci2E5gW8C2gm3j2rEA2x5sl2D7CLZBlxF0GUGXEXQZQZcRdJlAlwl0mUCXCXSZQJcJdJlAlwl0mUCXCXQpoEsBXQroUkCXAroU0KWALgV0KaBLAV0q6FJBlwq6VNClgi4VdKmgSwVdKuhSQZcGujTQpYEuDXRpoEsDXRro0kCXBro00KUvCjLuyXhJxo9kPJDxSMYTGRcyrmScFOpJoZ4U6jGhj236qqdcN337vAPp7sP55Upk+b79fdmWfwA=","brillig_names":["compute_note_hash_and_optionally_a_nullifier"]},{"name":"entrypoint","is_unconstrained":false,"custom_attributes":["private"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"slot_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"app_payload","type":{"fields":[{"name":"function_calls","type":{"kind":"array","length":4,"type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"target_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_public","type":{"kind":"boolean"}},{"name":"is_static","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::entrypoint::function_call::FunctionCall"}}},{"name":"nonce","type":{"kind":"field"}}],"kind":"struct","path":"authwit::entrypoint::app::AppPayload"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::public_call_request::PublicCallRequest"}}},{"name":"public_teardown_call_request","type":{"fields":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::public_call_request::PublicCallRequest"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"slot_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"databus"}},"bytecode":"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","debug_symbols":"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z1o9+0am692ffSPTje5Xz9qzb2S60f3qWXv2jUw3ul89a2X1rJXVs1ZWz1pZPWt19azV1bNWV8/a0++Nut796ll7+r1R17tfPWtPvzfqeverZ+3qvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Urt4bpav3RunqvVG6em+Unn1v1Ojz9zaPv+z+5LP2Rvfvn7WW8dSPi1zvXiKnvx4tMTK/6P6njvx0HcWDO5qonztqf6WjPF1HdbqO+nQdzWM7yjZ96ig77eaz9LXvp7c77Ev6yO5ldfe6untb3b2fvPtr11Z2xOruc3X3tbr7Xt392Wft1e7l7LP2evdnn7XXuz/7rL3e/dln7fXuV89aWT1rZfWsldWzVlbPWlk9a3X1rNXVs1ZXz1pdPWvvsC/pI7tfPWt19azV1bNWV89aXT1rbfWstdWz1lbPWls9a++wL+kju189a231rLXVs9ZWz1pbPWt99az11bPWV89aXz1r77Av6SO7Xz1rffWs9dWz1lfPWl89a2P1rI3VszZWz9pYPWvvsC/pI7tfPWtj9ayN1bM2Vs/aWD1rc/WszdWzNlfP2lw9a++wL+kju189a3P1rM3VszZXz9pcPWtr9ayt1bO2Vs/aWj1r77Av6SO7Xz1ra/WsrdWztlbP2lo9a3v1rO3Vs7ZXz9pePWvvsC/pI7tfPWt79azt1bO2V8/aXj1rZ/WsndWzdlbP2lk9ax+9W+nO3a+etbN61s7qWTurZ+3p90Zd695PvzfqevebZ62ffm/U9e43z1o/Ns9aX703ylfvjfLVe6N89d4oX703ylfvjfLVe6N89d4oX703ylfvjfLVe6N89d4oX703ys++N+rq7nE/+96o693rY3fuy3jLU/fj0ze6V4t+2mt+eZikfnH8T2cg689A15+BrT8DX38Gsf4Mcv0Z1Poz6PVnMNvPwNbP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","brillig_names":["enqueue_public_function_call_internal","call_private_function_internal","directive_invert","directive_integer_quotient"]}],"outputs":{"globals":{},"structs":{"functions":[{"fields":[{"name":"parameters","type":{"fields":[{"name":"app_payload","type":{"fields":[{"name":"function_calls","type":{"kind":"array","length":4,"type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"target_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_public","type":{"kind":"boolean"}},{"name":"is_static","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::entrypoint::function_call::FunctionCall"}}},{"name":"nonce","type":{"kind":"field"}}],"kind":"struct","path":"authwit::entrypoint::app::AppPayload"}}],"kind":"struct","path":"MultiCallEntrypoint::entrypoint_parameters"}}],"kind":"struct","path":"MultiCallEntrypoint::entrypoint_abi"}]}},"file_map":{"103":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr","source":"use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n messaging::process_l1_to_l2_message, hash::{hash_args_array, ArgsHasher},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n oracle::{\n key_validation_request::get_key_validation_request, arguments, returns::pack_returns,\n call_private_function::call_private_function_internal, header::get_header_at,\n logs::{emit_encrypted_note_log, emit_encrypted_event_log},\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, notify_set_min_revertible_side_effect_counter,\n set_public_teardown_function_call_internal\n}\n}\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext, function_selector::FunctionSelector, max_block_number::MaxBlockNumber,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_request::PublicCallRequest, read_request::ReadRequest, note_hash::NoteHash,\n nullifier::Nullifier, log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_ENCRYPTED_LOGS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n MAX_NOTE_ENCRYPTED_LOGS_PER_CALL, PUBLIC_DISPATCH_SELECTOR\n},\n header::Header, messaging::l2_to_l1_message::L2ToL1Message, traits::Empty\n};\n\n// When finished, one can call .finish() to convert back to the abi\npub struct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n args_hash: Field,\n return_hash: Field,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n private_call_requests : BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_requests : BoundedVec<PublicCallRequest, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n public_teardown_call_request: PublicCallRequest,\n l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n unencrypted_logs_hashes: BoundedVec<LogHash, MAX_UNENCRYPTED_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n\n fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n fn push_nullifier(&mut self, nullifier: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: 0, counter: self.next_counter() });\n }\n\n fn push_nullifier_for_note_hash(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: nullified_note_hash, counter: self.next_counter() });\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage,\n nullifier_read_requests: self.nullifier_read_requests.storage,\n key_validation_requests_and_generators: self.key_validation_requests_and_generators.storage,\n note_hashes: self.note_hashes.storage,\n nullifiers: self.nullifiers.storage,\n private_call_requests: self.private_call_requests.storage,\n public_call_requests: self.public_call_requests.storage,\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage,\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage,\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage,\n unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\"Setting {0} as fee payer\", [self.this_address().to_field()]);\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number = MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request = self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one\n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale. We fetch new values from oracle and instruct\n // protocol circuits to validate them by storing the validation request in context.\n let request = get_key_validation_request(pk_m_hash, key_index);\n let request_and_generator = KeyValidationRequestAndGenerator { request, sk_app_generator: sk_generators[key_index] };\n // We constrain that the pk_m_hash matches the one in the request (otherwise we could get an arbitrary\n // valid key request and not the one corresponding to pk_m_hash).\n assert(request.pk_m.hash() == pk_m_hash);\n self.key_validation_requests_and_generators.push(request_and_generator);\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(&mut self, content: Field, secret: Field, sender: EthAddress) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(&mut self, note_hash_counter: u32, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n let (end_side_effect_counter, returns_hash) = call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n\n let call_context = self.generate_call_context(\n contract_address,\n function_selector,\n is_static_call,\n is_delegate_call\n );\n\n self.private_call_requests.push(\n PrivateCallRequest {\n contract_address,\n call_context,\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter\n }\n );\n\n PackedReturns::new(returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n is_delegate_call\n );\n\n // Public calls are rerouted through the dispatch function.\n let function_selector = comptime {\n FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR)\n };\n let call_context = self.generate_call_context(\n contract_address,\n function_selector,\n is_static_call,\n is_delegate_call\n );\n\n let call_request = PublicCallRequest { contract_address, call_context, args_hash, counter };\n self.public_call_requests.push(call_request);\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.set_public_teardown_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn set_public_teardown_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n is_delegate_call\n );\n\n let function_selector = comptime {\n FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR)\n };\n let call_context = self.generate_call_context(\n contract_address,\n function_selector,\n is_static_call,\n is_delegate_call\n );\n\n self.public_teardown_call_request = PublicCallRequest {\n contract_address,\n call_context,\n args_hash,\n counter,\n };\n }\n\n fn generate_call_context(\n self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> CallContext {\n let msg_sender = if is_delegate_call {\n self.msg_sender()\n } else {\n self.this_address()\n };\n let storage_contract_address = if is_delegate_call {\n self.this_address()\n } else {\n contract_address\n };\n CallContext { msg_sender, storage_contract_address, function_selector, is_static_call, is_delegate_call }\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n}\n"},"146":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr","source":"use dep::protocol_types::{abis::{function_selector::FunctionSelector}, address::AztecAddress};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> Field {}\n\npub unconstrained fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> Field {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> Field {}\n\npub unconstrained fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> Field {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\npub fn notify_set_min_revertible_side_effect_counter(counter: u32) {\n unsafe {\n notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter)\n };\n}\n\npub unconstrained fn notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter: u32) {\n notify_set_min_revertible_side_effect_counter_oracle(counter);\n}\n\n#[oracle(notifySetMinRevertibleSideEffectCounter)]\nunconstrained fn notify_set_min_revertible_side_effect_counter_oracle(_counter: u32) {}\n"},"155":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr","source":"use dep::protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress, utils::reader::Reader};\n\n#[oracle(callPrivateFunction)]\nunconstrained fn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; 2] {}\n\npub unconstrained fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> (u32, Field) {\n let fields = call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let mut reader = Reader::new(fields);\n let end_side_effect_counter = reader.read_u32();\n let returns_hash = reader.read();\n\n (end_side_effect_counter, returns_hash)\n}\n"},"184":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr","source":"use dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{GENERATOR_INDEX__SECRET_HASH, GENERATOR_INDEX__MESSAGE_NULLIFIER, GENERATOR_INDEX__FUNCTION_ARGS},\n point::Point, traits::Hash,\n hash::{sha256_to_field, poseidon2_hash_with_separator, poseidon2_hash_with_separator_slice}\n};\nuse crate::utils::to_bytes::{arr_to_be_bytes_arr, str_to_be_bytes_arr};\n\npub use dep::protocol_types::hash::{compute_siloed_nullifier, pedersen_hash};\n\npub fn pedersen_commitment<let N: u32>(inputs: [Field; N], hash_index: u32) -> Point {\n std::hash::pedersen_commitment_with_separator(inputs, hash_index)\n}\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<let N: u32>(contract_address: AztecAddress, log: [u8; N]) -> Field {\n let mut hash_bytes = [0; N + 36];\n // Address is converted to 32 bytes in ts\n let address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes: [u8; 4] = (N as Field).to_be_bytes();\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..N {\n hash_bytes[36 + i] = log[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field\n) -> Field {\n let mut hash_bytes = [0 as u8; 192];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret and index of the message hash\n// in the L1 to L2 message tree\npub fn compute_message_nullifier(message_hash: Field, secret: Field, leaf_index: Field) -> Field {\n poseidon2_hash_with_separator(\n [message_hash, secret, leaf_index],\n GENERATOR_INDEX__MESSAGE_NULLIFIER\n )\n}\n\npub struct ArgsHasher {\n fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<let N: u32>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator_slice(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nunconstrained fn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..100 {\n input.add(i as Field);\n }\n let hash = input.hash();\n dep::std::println(hash);\n assert(hash == 0x19b0d74feb06ebde19edd85a28986c97063e84b3b351a8b666c7cac963ce655f);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let serialized_log = arr_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let serialized_log: [u8; 32] = log.to_field().to_be_bytes();\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"dummy\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"Hello this is a string\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"},"216":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr","source":"use crate::{\n abis::function_selector::FunctionSelector,\n address::{\n partial_address::PartialAddress, public_keys_hash::PublicKeysHash,\n salted_initialization_hash::SaltedInitializationHash\n},\n constants::{AZTEC_ADDRESS_LENGTH, FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__CONTRACT_ADDRESS_V1},\n contract_class_id::ContractClassId,\n hash::{poseidon2_hash_with_separator, private_functions_root_from_siblings},\n merkle_tree::membership::MembershipWitness,\n traits::{Empty, FromField, ToField, Serialize, Deserialize}, utils\n};\n\n// Aztec address\npub struct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn compute(pub_keys_hash: PublicKeysHash, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n poseidon2_hash_with_separator(\n [pub_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS_V1\n )\n )\n }\n\n pub fn compute_from_private_function(\n function_selector: FunctionSelector,\n functino_vk_hash: Field,\n function_leaf_membership_witness: MembershipWitness<FUNCTION_TREE_HEIGHT>,\n contract_class_artifact_hash: Field,\n contract_class_public_bytecode_commitment: Field,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys_hash: PublicKeysHash\n ) -> Self {\n let private_functions_root = private_functions_root_from_siblings(\n function_selector,\n functino_vk_hash,\n function_leaf_membership_witness.leaf_index,\n function_leaf_membership_witness.sibling_path\n );\n\n let contract_class_id = ContractClassId::compute(\n contract_class_artifact_hash,\n private_functions_root,\n contract_class_public_bytecode_commitment\n );\n\n // Compute contract address using the preimage which includes the class_id.\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(contract_class_id, salted_initialization_hash);\n\n AztecAddress::compute(public_keys_hash, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys_hash() {\n let pub_keys_hash = PublicKeysHash::from_field(1);\n let partial_address = PartialAddress::from_field(2);\n\n let address = AztecAddress::compute(pub_keys_hash, partial_address);\n let expected_computed_address_from_partial_and_pubkey = 0x23ce9be3fa3c846b0f9245cc796902e731d04f086e8a42473bb29e405fc98075;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"},"246":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr","source":"pub struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<let K: u32>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n // TODO(#4394)\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"},"338":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr","source":"use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, log_hash::{LogHash, ScopedLogHash, ScopedEncryptedLogHash},\n note_hash::ScopedNoteHash, nullifier::ScopedNullifier\n},\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n MAX_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX\n},\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n recursion::verification_key::VerificationKey, traits::{is_empty, ToField},\n utils::field::field_from_bytes_32_trunc\n};\nuse super::utils::field::field_from_bytes;\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = std::hash::sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path)\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n poseidon2_hash_with_separator(\n [\n tx_hash,\n note_index_in_tx as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field {\n let inputs = [nonce, note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [\n app.to_field(),\n unique_note_hash\n ],\n GENERATOR_INDEX__SILOED_NOTE_HASH\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [\n app.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n // We assume contract address has already been masked\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n accumulate_sha256([log_hash.contract_address.to_field(), log_hash.log_hash.value])\n }\n}\n\npub fn mask_encrypted_log_hash(scoped_log: ScopedEncryptedLogHash) -> AztecAddress {\n if scoped_log.contract_address.is_zero() {\n AztecAddress::from_field(0)\n } else if (scoped_log.log_hash.randomness == 0) {\n scoped_log.contract_address\n } else {\n AztecAddress::from_field(\n poseidon2_hash_with_separator(\n [scoped_log.contract_address.to_field(), scoped_log.log_hash.randomness],\n 0\n )\n )\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk<let N: u32>(_vk: VerificationKey<N>) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn silo_l2_to_l1_message(msg: ScopedL2ToL1Message, rollup_version_id: Field, chain_id: Field) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes: [u8; 32] = input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\n// NB: this assumes MAX_ENCRYPTED_LOGS_PER_TX == MAX_UNENCRYPTED_LOGS_PER_TX\n// to avoid doubling code, since we can't define the byte len to be 32*N directly.\npub fn compute_tx_logs_hash(logs: [LogHash; MAX_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_ENCRYPTED_LOGS_PER_TX {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn compute_tx_note_logs_hash(logs: [LogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_NOTE_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_NOTE_ENCRYPTED_LOGS_PER_TX {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn verification_key_hash<let N: u32>(key: [Field; N]) -> Field {\n crate::hash::poseidon2_hash(key)\n}\n\n#[inline_always]\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(\n inputs: [Field; N],\n separator: T\n) -> Field where T: ToField {\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of N + 1\n let in_len = N + 1;\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field where T: ToField {\n let in_len = inputs.len() + 1;\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of Math.ceil(N/31)\n let mut in_len = N / 31;\n let mut has_padding = false;\n if N % 31 != 0 {\n in_len += 1;\n has_padding = true;\n }\n\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n sponge.absorb(field_from_bytes(current_field, false));\n current_field = [0; 31];\n }\n }\n if has_padding {\n sponge.absorb(field_from_bytes(current_field, false));\n }\n\n sponge.squeeze()\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\n 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\n 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,\n 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,\n 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,\n 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = std::hash::sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), EthAddress::from_field(3), 5, 2, 4);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3)\n },\n version,\n chainId\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"},"34":{"path":"std/hash/poseidon2.nr","source":"use crate::hash::Hasher;\nuse crate::default::Default;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field;3],\n state: [Field;4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result = Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32, is_variable_length: bool) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub struct Poseidon2Hasher{\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv : Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"},"459":{"path":"/usr/src/noir-projects/noir-contracts/contracts/multi_call_entrypoint_contract/src/main.nr","source":"// An entrypoint contract that allows everything to go through. Only used for testing\n// Pair this with SignerlessWallet to perform multiple actions before any account contracts are deployed (and without authentication)\nuse dep::aztec::macros::aztec;\n\n#[aztec]\ncontract MultiCallEntrypoint {\n use dep::authwit::entrypoint::app::AppPayload;\n use dep::aztec::macros::functions::private;\n\n #[private]\n fn entrypoint(app_payload: AppPayload) {\n app_payload.execute_calls(&mut context);\n }\n}\n"},"59":{"path":"std/panic.nr","source":"pub fn panic<T, U, let N: u32>(message: fmtstr<N, T>) -> U {\n assert(false, message);\n crate::mem::zeroed()\n}\n"},"7":{"path":"std/collections/bounded_vec.nr","source":"use crate::{cmp::Eq, convert::From};\n\n/// A `BoundedVec<T, MaxLen>` is a growable storage similar to a `Vec<T>` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n/// \n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n/// \n/// For these reasons `BoundedVec<T, N>` should generally be preferred over `Vec<T>` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n/// \n/// Example:\n/// \n/// ```noir\n/// let mut vector: BoundedVec<Field, 10> = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec<T, let MaxLen: u32> {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec<Field, 10> = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec<Field, 10> {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec<Field, 3> = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a \n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n /// \n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n /// \n /// Example:\n /// \n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n /// \n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n /// \n /// Example:\n /// \n /// ```noir\n /// fn sum_of_first_three<let N: u32>(v: BoundedVec<u32, N>) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n /// \n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n /// \n /// Example:\n /// \n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n /// \n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n /// \n /// Example:\n /// \n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n /// \n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n /// \n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n /// \n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure. \n /// vec.set_unchecked(2, 42);\n /// println(vec);\n /// \n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n /// \n /// Panics if the new length of the vector will be greater than the max length.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n /// \n /// v.push(1);\n /// v.push(2);\n /// \n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 4> = BoundedVec::new();\n /// assert(v.len() == 0);\n /// \n /// v.push(100);\n /// assert(v.len() == 1);\n /// \n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n /// \n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n /// \n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec<T, MaxLen>) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n /// \n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n /// \n /// Note that uninitialized elements may be zeroed out!\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n /// \n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n /// \n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n /// \n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n /// \n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array<let Len: u32>(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n /// \n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n /// \n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n /// \n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n /// \n /// ```noir\n /// let mut v1: BoundedVec<Field, 5> = BoundedVec::new();\n /// let mut v2: BoundedVec<Field, 7> = BoundedVec::new();\n /// \n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n /// \n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec<let Len: u32>(&mut self, vec: BoundedVec<T, Len>) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input. \n /// The maximum length of the vector is determined based on the type signature.\n /// \n /// Example:\n /// \n /// ```noir\n /// let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array<let Len: u32>(array: [T; Len]) -> Self {\n assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec<T, MaxLen> = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n /// \n /// Panics if the vector is empty.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n /// \n /// let two = v.pop();\n /// let one = v.pop();\n /// \n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n /// \n /// Example:\n /// \n /// ```noir\n /// let mut v: BoundedVec<u32, 3> = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n /// \n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector. \n /// \n /// Example:\n /// \n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n /// \n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> BoundedVec<U, MaxLen> {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n ret\n }\n}\n\nimpl<T, let MaxLen: u32> Eq for BoundedVec<T, MaxLen> where T: Eq {\n fn eq(self, other: BoundedVec<T, MaxLen>) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n\n (self.len == other.len) & (self.storage == other.storage)\n }\n}\n\nimpl<T, let MaxLen: u32, let Len: u32> From<[T; Len]> for BoundedVec<T, MaxLen> {\n fn from(array: [T; Len]) -> BoundedVec<T, MaxLen> {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec<Field, 5> = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec<Field, 5> = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.storage()[2], 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage()[0], 1);\n assert_eq(bounded_vec.storage()[1], 2);\n assert_eq(bounded_vec.storage()[2], 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec<Field, 2> = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.storage()[0], 1);\n assert_eq(bounded_vec.storage()[1], 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n}\n"},"77":{"path":"/usr/src/noir-projects/aztec-nr/authwit/src/entrypoint/app.nr","source":"use dep::aztec::prelude::PrivateContext;\nuse dep::aztec::protocol_types::{\n constants::GENERATOR_INDEX__SIGNATURE_PAYLOAD, hash::poseidon2_hash_with_separator,\n traits::{Hash, Serialize}\n};\n\nuse crate::entrypoint::function_call::FunctionCall;\n\n// FUNCTION_CALL_SIZE * ACCOUNT_MAX_CALLS + 1\nglobal APP_PAYLOAD_SIZE: u32 = 21;\n// FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS + 32\nglobal APP_PAYLOAD_SIZE_IN_BYTES: u32 = 424;\n\nglobal ACCOUNT_MAX_CALLS: u32 = 4;\n\n// Note: If you change the following struct you have to update default_entrypoint.ts\n// docs:start:app-payload-struct\npub struct AppPayload {\n function_calls: [FunctionCall; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n// docs:end:app-payload-struct\n\nimpl Serialize<APP_PAYLOAD_SIZE> for AppPayload {\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; APP_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, APP_PAYLOAD_SIZE> = BoundedVec::new();\n for call in self.function_calls {\n fields.extend_from_array(call.serialize());\n }\n fields.push(self.nonce);\n fields.storage\n }\n}\n\nimpl Hash for AppPayload {\n fn hash(self) -> Field {\n poseidon2_hash_with_separator(self.serialize(), GENERATOR_INDEX__SIGNATURE_PAYLOAD)\n }\n}\n\nimpl AppPayload {\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; APP_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: BoundedVec<u8, APP_PAYLOAD_SIZE_IN_BYTES> = BoundedVec::new();\n\n for i in 0..ACCOUNT_MAX_CALLS {\n bytes.extend_from_array(self.function_calls[i].to_be_bytes());\n }\n bytes.extend_from_array(self.nonce.to_be_bytes::<32>());\n\n bytes.storage\n }\n\n // Executes all private and public calls\n // docs:start:entrypoint-execute-calls\n fn execute_calls(self, context: &mut PrivateContext) {\n for call in self.function_calls {\n if !call.target_address.is_zero() {\n if call.is_public {\n context.call_public_function_with_packed_args(\n call.target_address,\n call.function_selector,\n call.args_hash,\n call.is_static,\n false\n );\n } else {\n let _result = context.call_private_function_with_packed_args(\n call.target_address,\n call.function_selector,\n call.args_hash,\n call.is_static,\n false\n );\n }\n }\n }\n }\n // docs:end:entrypoint-execute-calls\n}\n"}}}