@aztec/end-to-end 0.0.1-commit.d6f2b3f94 → 0.0.1-commit.dbf9cec

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 (138) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +3 -3
  4. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
  5. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  6. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +10 -0
  7. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  8. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  9. package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
  10. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  11. package/dest/e2e_epochs/epochs_test.d.ts +9 -7
  12. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  13. package/dest/e2e_epochs/epochs_test.js +53 -34
  14. package/dest/e2e_fees/fees_test.d.ts +2 -2
  15. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  16. package/dest/e2e_fees/fees_test.js +6 -6
  17. package/dest/e2e_p2p/p2p_network.d.ts +2 -2
  18. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  19. package/dest/e2e_p2p/p2p_network.js +16 -2
  20. package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
  21. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  22. package/dest/e2e_p2p/reqresp/utils.js +32 -8
  23. package/dest/e2e_p2p/shared.d.ts +2 -2
  24. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  25. package/dest/e2e_p2p/shared.js +2 -1
  26. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  27. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  28. package/dest/e2e_token_contract/token_contract_test.js +10 -0
  29. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  30. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  31. package/dest/fixtures/authwit_proxy.js +30 -0
  32. package/dest/fixtures/e2e_prover_test.d.ts +4 -4
  33. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  34. package/dest/fixtures/e2e_prover_test.js +27 -34
  35. package/dest/fixtures/elu_monitor.d.ts +21 -0
  36. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  37. package/dest/fixtures/elu_monitor.js +102 -0
  38. package/dest/fixtures/fixtures.d.ts +5 -1
  39. package/dest/fixtures/fixtures.d.ts.map +1 -1
  40. package/dest/fixtures/fixtures.js +6 -0
  41. package/dest/fixtures/ha_setup.d.ts +1 -1
  42. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  43. package/dest/fixtures/ha_setup.js +3 -1
  44. package/dest/fixtures/setup.d.ts +26 -10
  45. package/dest/fixtures/setup.d.ts.map +1 -1
  46. package/dest/fixtures/setup.js +56 -81
  47. package/dest/fixtures/setup_p2p_test.d.ts +6 -3
  48. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  49. package/dest/fixtures/setup_p2p_test.js +12 -9
  50. package/dest/fixtures/token_utils.d.ts +2 -2
  51. package/dest/fixtures/token_utils.d.ts.map +1 -1
  52. package/dest/fixtures/token_utils.js +3 -2
  53. package/dest/shared/index.d.ts +2 -1
  54. package/dest/shared/index.d.ts.map +1 -1
  55. package/dest/shared/index.js +1 -0
  56. package/dest/shared/jest_setup.js +10 -1
  57. package/dest/shared/mock_state_view.d.ts +86 -0
  58. package/dest/shared/mock_state_view.d.ts.map +1 -0
  59. package/dest/shared/mock_state_view.js +186 -0
  60. package/dest/shared/submit-transactions.d.ts +2 -2
  61. package/dest/shared/submit-transactions.d.ts.map +1 -1
  62. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  63. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  64. package/dest/simulators/token_simulator.d.ts +1 -1
  65. package/dest/simulators/token_simulator.d.ts.map +1 -1
  66. package/dest/simulators/token_simulator.js +2 -23
  67. package/dest/spartan/setup_test_wallets.d.ts +9 -2
  68. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  69. package/dest/spartan/setup_test_wallets.js +31 -1
  70. package/dest/spartan/utils/bot.d.ts +3 -2
  71. package/dest/spartan/utils/bot.d.ts.map +1 -1
  72. package/dest/spartan/utils/bot.js +2 -1
  73. package/dest/spartan/utils/config.d.ts +4 -1
  74. package/dest/spartan/utils/config.d.ts.map +1 -1
  75. package/dest/spartan/utils/config.js +2 -1
  76. package/dest/spartan/utils/index.d.ts +3 -2
  77. package/dest/spartan/utils/index.d.ts.map +1 -1
  78. package/dest/spartan/utils/index.js +3 -1
  79. package/dest/spartan/utils/k8s.d.ts +3 -1
  80. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  81. package/dest/spartan/utils/k8s.js +6 -0
  82. package/dest/spartan/utils/nodes.d.ts +4 -5
  83. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  84. package/dest/spartan/utils/nodes.js +9 -9
  85. package/dest/test-wallet/test_wallet.d.ts +83 -0
  86. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  87. package/dest/test-wallet/test_wallet.js +214 -0
  88. package/dest/test-wallet/utils.d.ts +41 -0
  89. package/dest/test-wallet/utils.d.ts.map +1 -0
  90. package/dest/test-wallet/utils.js +71 -0
  91. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  92. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  93. package/dest/test-wallet/wallet_worker_script.js +48 -0
  94. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  95. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  96. package/dest/test-wallet/worker_wallet.js +151 -0
  97. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  98. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  99. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  100. package/package.json +40 -39
  101. package/src/bench/client_flows/client_flows_benchmark.ts +3 -7
  102. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +10 -1
  103. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +1 -1
  104. package/src/e2e_deploy_contract/deploy_test.ts +1 -1
  105. package/src/e2e_epochs/epochs_test.ts +66 -66
  106. package/src/e2e_fees/bridging_race.notest.ts +1 -1
  107. package/src/e2e_fees/fees_test.ts +6 -21
  108. package/src/e2e_p2p/p2p_network.ts +25 -3
  109. package/src/e2e_p2p/reqresp/utils.ts +36 -8
  110. package/src/e2e_p2p/shared.ts +2 -1
  111. package/src/e2e_token_contract/token_contract_test.ts +10 -1
  112. package/src/fixtures/authwit_proxy.ts +50 -0
  113. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  114. package/src/fixtures/e2e_prover_test.ts +26 -36
  115. package/src/fixtures/elu_monitor.ts +126 -0
  116. package/src/fixtures/fixtures.ts +10 -0
  117. package/src/fixtures/ha_setup.ts +3 -1
  118. package/src/fixtures/setup.ts +74 -111
  119. package/src/fixtures/setup_p2p_test.ts +9 -17
  120. package/src/fixtures/token_utils.ts +2 -1
  121. package/src/guides/up_quick_start.sh +3 -3
  122. package/src/shared/index.ts +1 -0
  123. package/src/shared/jest_setup.ts +16 -1
  124. package/src/shared/mock_state_view.ts +188 -0
  125. package/src/shared/submit-transactions.ts +6 -2
  126. package/src/shared/uniswap_l1_l2.ts +1 -1
  127. package/src/simulators/token_simulator.ts +1 -29
  128. package/src/spartan/setup_test_wallets.ts +58 -4
  129. package/src/spartan/utils/bot.ts +4 -1
  130. package/src/spartan/utils/config.ts +1 -0
  131. package/src/spartan/utils/index.ts +4 -0
  132. package/src/spartan/utils/k8s.ts +8 -0
  133. package/src/spartan/utils/nodes.ts +15 -10
  134. package/src/test-wallet/test_wallet.ts +306 -0
  135. package/src/test-wallet/utils.ts +112 -0
  136. package/src/test-wallet/wallet_worker_script.ts +60 -0
  137. package/src/test-wallet/worker_wallet.ts +213 -0
  138. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -1 +1 @@
1
- {"proof":"0x00003d400e9377f31c9fae99dde2e4871dcb0cce39b05422ab9787bbfd4cba8a933dae4708e7c96b4698e59641872c2fd712cd256c21879bf01a30cf7c9d47fd9a442ff700f10d3a401a22634ebb4b0b17410cd138fd388872486b6280d552d6317c255d0091fc2154c269945e9eecd8b7c3fda287b1ef154566ab838724c08bbf33ee18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bd79b7d8802c5315bbb1a505e518bbcaf90b55712598012ee082d7bc35eb1914211f9f02fc6efdb6bc76de80a2aab9a29f329d43a3122216e950bbb1fb61ff0000000000000000000000000000000000000000000000000000000000000000003579b12574fbd88785a68732b8a32ee511f990b5c1c9c3fd7d04ee396a49201c7047c96fd8059cb38b8b9ec2c489ab0b43a5f6d87e98b2aeccfcb934e04218000000000000000000000000000000000048541ec67b8bf434f83294c24840210000000000000000000000000000000000d69c5331f509ffffd6c8dda6db188a00000000000000000000000000000000000000000000000000000000000015f700b744e31ec5e4fc15972b9742216130d34aa7561a3786919f9a51392cd3bee50000000000000000000000000000002c1ecbf77c26d216c112fba848bcb2c4f800000000000000000000000000000020c760bd04161502098f63698d9ba7b431000000000000000000000000000000000007a878a5a74bbfbc8aa5421449ac49000000000000000000000000000000508927ca412e0cafcc3c89a51c63dc24f000000000000000000000000000000000001b67963f214889736da01cd0ca7556000000000000000000000000000000103d28cbc4586970511fcc4b3cf298a8fd000000000000000000000000000000000000adbbd2d009e8870e2d94112c6872000000000000000000000000000000b45608814b5a0241a025e28c147045383b000000000000000000000000000000000011685f37114cfd736e0fc3e34674be0699ec8e9a73b778bbdd5de6fa1ca511e8b99b9ae2b6e9c6524bf0c1713f43182b7218f998805a5a4d8bd657879fa4b4f21a52d49401db1e5bf5674f589530ff26257c11d8a49533f257b2c9ee759f1a6e7c8fb2d5d08b6662f4e1ed093dd12714cdeb4eabfe4b2ac26a8a28deb3d785ec24e5cdca9cedda6f3bc143632cff830a445136602c7b4e7f7a78c241e39bf3d7d90d6d8ad9ada81b99196bcfd05539184eb0345769dc700af0ca18f10040c60ac0554403e16f1cf9f5a5f896f14b25193782db7b347fe2cd790ec1909d637cd360611d4ac4098134b48c576ba9d68115282242fa373432e29e5434049fcf9a19e6f6d19713297e90ac2ea20c3248852274438d5e01f4cc60bfcfd214d48dc18f59bdb6a7ed3f5f4ad6ef326dfd1db51e997e94591c00c715af82249a35d5420f1aaa2bb1372e6eba18c7a6224d8b5b09f0f84a9b289d7d234c5488180abda3a1483c5634e54ead3929851eb79065910dc0833e225df0123ad879b253cef6202dcdb20d422fc37b461d374045f1f7990b4db61e77f87b0d9d1f367ee39667bd1e877dee16c53432433b4d7d18146ddf2c25666f1e280676972766b8636f95a3ef986f58c971ea2f744afcd9988da3cc2be98d51cd7d8aa0d0b3a023ee206ed6627896daf1d183d01d587ecda86656642b839935cd650e0f5f8df25039ee7f29319e9191b6a0e70446e5c3cf53e144c82588c7d9bd6203aec02f4e5711341fbaa939046e2d44d3948452cbf89c4b1b7e0adb869923cf9c7af820f75f704d38a27efae3da4c749cfcbf8f299b53b4e4831f1d91a33855f41f0e5e114620ee6ad6955da95ed9e4eef79daf413874e18186014d91a87323b06bce37bdfd44ffc79a539ce07f902694c425644f9a37fa35590faa12c254a54b646509470021d3b92530e11001cf8aecc30e436f1a63e6ee85058d0a960a924aace891becc2e52718adf236e0be5ef68ba0695e11d3f186cc41274763f77059b68da443f40996e1d91b95e95202745b83d6ac5d0fcd9ae2f5c19250db6f54a75e47d77ec740bc951bc271af12edcfadd33a757b0fcea78869f2e122f454bd36a5c56a3ef73ec4f4c9998bd4bfd8184491395fc2c5346d544bc25c3905bca666d4a2c1d0d379b6d7f4d9aa395a1f1407e5a5217eedd1eef82d52e32e534e4a0f21b887f46fcfa6a4bbe3c2987303a94a9980225401bd23cc80413410882205388c2d79684fe5693eeebf3bc04a89d295c3b1b7f4abb6b5bdf8d22d74d75e6f69b6ed60e47321ac97f859491f87aeeac49cddb3ca2d3aec764d40e598ac4cac95a719f4c7873c4217cafe2e876176d649f7319ff42ab88760dba083271bddf8b640fca6e6857e47ec200a49f6205fe75fc6d06fa74e0a51287360023dc676c2eed3382629813b3c51b85df18e1845cd0432bdf66b87d0ac27106116240cab809eebe7175f817bc0b79fd76257e291479c11451d84850635e2a092c27bd286fc0bae4781f4530502915e570e57ac51ee7df8bbcd21bba6147842a0ce99562ab83174d4e07e54a92591f9bbaf06422d78e1ec75f7e45ebbf1fb42618ab6085eaf16f536819f68c65b14bf20472fe27d16024c6149bf2da1855d9fc10940cc96cd664ce67651869b84cd2d371c9ab52150b7ed59a834657e899e4491486ec771e817f587a36075c64a0c9371f882e3f49a669647edd3ba7cbdaec81040ea16925367e964a6b75eb74dc5576906fe92b1728a3f0fcbdddce19cb9edc230108abefeef4f6d499dddc59a3984abcbde6d5709f1a1746c48fdf01672ac40924da1b8be3c47de980fb1c5683bb728d3d6ee723c925f9724068d4bfa92d820ebea9e02cbfc9473a6c4516178868d9378cc3fcfff516f7b5629ec611110edd1bd1d79ad9d9f3824be59057b3aaae9a674cccdf3109ccc0c34f83d5b4e4cdc02cfb206b8170940c464d1f3b4b98d18af1f720b8fafed28c380f33cf038af3d905a407e07add2fc266600b074fbff0090e8a2d592b2f0f388340c90bd3c0e39b16c57ee4cda0cb074e00d5817ee90a826d7cd414d3f070c3536b83fc303478ac04dd659cdcb733fcd9e64e637b180b1567b9e7cb876a2f523ace11053ff358e124a61a2885e122f8ce8154d4d3bff621c36846aff5fc5aec1432f46add3265762b4592ed0ddb9512bf84161b6bf7db330a082c7b4aa67d9e3732d61ecfd6fd0003dbe75863bf09956720deccb3e80beae4f72474ce31092bfaea71fb1236726b2cb49ae432272a726ba173c729bdaee9675e806ab2c71c825f0864301d94edc21ad4c3f588bba6d8163199e1ba07ca8d1b1906d58c2be4502a87600e33686a29292f1c96b5627def75b112043a5bb8686fa16d8bbb84109f45ed75aac4486d7903c4de51999f3ce858f608c35731292679714096e8bdcd83c1f2df7b712a2a131b1c89bc39bebbf5bd80e97f2a9b18420ce8efd74548b21dbed1444f33279284007b5e9a73c13e93e362c59933d8264afc7248cffaba04604c8c7a2415bb41a607b48fab2c54ba06523614518b3151e858c0b2ae4e5f37b8ee1269601cd91d2c2e8809894f4f82f7b62b4faa9eea6b1889fa489c6bad784301cf1a8c853719a7245f8bbb35b22d52dae58e1823dd84fade2f80fcc85a1074927000220f2dceba2e3f7783fb3c345bbce22fd91e184800b6ccf17be5d3a6351d8424c85c74ab0d27e3552b0b581156e7873c8414559eb91efcbf9d2f7474db63b46d463211deec07df4f35527fb747b5869afeec7d447a94202d89d4780cb5c50a87888a4b2788221a8276c9ab85d916570caaadd6fbf7557ab7d4add7804aa9fb4d99b4d11325046533a911065cd8388072d92c89c41da66f01ea9e34f963dfd7c3fa6f84f4af2a2877d84da25600e927e2af354e4cfb591ba344b2bc46aa24f7594df324583f043b3d29ee24b50bb8c36fa60d97ba1141ed41180da2569066d042ea48d2874206ae06b77ccbecef094ac9a0c9be376d84368b6f523d77b189681a440c4aedb82b9823c8c547de3ecd467131cba71aa3d9872dd7a9a77a1ab100f90f05be53292d522ef53e3c632ff6b810991c613956c5bfeb50d69018051b527a160f0a3d27263e6495672c492478ab016ef4cd1682eb4adbaba99ef704b673aa6c5dfe3f4b18425a24d9792f2305cd15c266b04083811d573867e4461a7d14b94b0cf704330d09f9942e7186ab27042c8151df8f37ba9a3bed280b6b76ebd72c5e16e98f042d7bc0d57c500c3db09f3ccff4dac7356cbfee06e8869bce52c9fdb3723e4bc1277453b84f1217b983c72154bbc3455a9854672a2738b58fd3a46464e571e2b7262af046b7c3261e3e8a8831eb52cfa6a99e0c17f575761142477fac1656a0f223dadbae44e0e801d95577c03cba5acdc5fd6e59af810591182245bbdc32440e18f7c8dc36cb1be72b2b741b41f05325c559b70ae4b9ace3e7f0a4330d59287514d1456c6e778b766789feabf0a183eca32111ab6a2dce2e83b93874920207ca0b06c64f3bf75ef56ebf01835b9ef00139941579c16e578dbe268a63d3bcf0812387721eda56090a977d9e4707d84bf66073b6a8fc915dfd01c12ca5e0c56edd0327ffccfa44949ae0ae4b6853c67c769451c96b94ad3ffa178efcecfafe670307b021b05c5e6bfacf5df9c2ce6635e8db5befd55eed838d2e7d05765bfd1141169f05924dc6c41de61d14f90905eddc6a54e90679abb1f42c767e43bac3b9b8065b1b56c304828fc10a977c90df75ca587973e919305c887614499d109825851538b947b43af0ed72baf393f3ce5031e5de6af73981c00afd1512a11aaa6f7c0e07f20dbcdd2e268c6ff8c4d6f2a4eec1eea1c9b7fc5dff3e75e5b4d3258acf297b054921b294603110563121c0d50af0d085de1c78df84dbd5f01303ea62fc22af8747483294d8115fd09f002fcc72cb58499c8f1b194717652a9dfd6c71341868734c348bdf0a0ab08e5e866c3bcc9e278c95f9d00a458e65ff55e07dddaa019e744da835b6127f7054d382230be8fc7f89a053c884bb3b6143203592a17f21909ff4fe6617b9beba1fba5cc2f8ff6b0bce5a070a51ac28a4156c635b8c1b271d4be75ec8cd02039ce597999b96ec8b8e36f9ff1e18f83ec7505331b5776c0e4b4b2a029f6bb84fc1277c36c146918dec888855b43e061910e42d730086cf0e5af2cb6918c2b4471485a0de4d53731e06f8d81e685c85419de7afb45522821907bfb687d1da33e1704b51d6bc67d077b3a25f3edde5943820f3efabfae44612ef247b70fea286bced9c477e592069be2ba7a49368ede906c0367ff6b5214a0f0d66049786e2ee4c5b51fde39f77b35a2f8581cc7b4d96ff4562c40a56c0c8000c1eb2fc0e5da2f67ca87293ef6ffa3c0080ef8158b520f89e4e2f507554801208783cfff00c7cab07501e979c6a3e0a3553bdef7a3b463eec5cf8026a426f15871a5f7599b5eaa9e84ef5a5284df3eda1e0dfbb777ab201fd6a5295d98da3111703498f07fec739b78acc1e1b0a6e0eb76d5f31f1fd14a4fb027e55cf278111cd3f7dd91c00356a8f98c541c9cea6c3467106c88f218a7a6376bbbca224ce16b2845047463ef36b98da107ac94aa9b8eb5c3732597e5ecbaca5e05cd9e18e0b5812f1071645a557029d041f93cb9d057480219d0e82a6245a4bf4ce8593111f3659ff037004cfbe87a9754649cb4cc0f3cf9f05881fcd69f3c75e8c0acbe42f373904ef71ecb2b7c02dbb386f7923e2ddf754d1ee3d27ef1c8500e25c961c0ff87517c4c05de2c196e8b24a434a6c8286e63effc325f8bd963f93d88359d50c204691898ab0f00fb626f0f71d1d898267955db03f87ccca49e1337843415a1969f5adad63d6a8d2f4e1fe8843e556d37ff43d382d5e267c8db28ca5a595cb09121c2dae0bd9ea815c69e39faae7569d6ae03ec58f3e8aece4d49206e68ef909fb0b50e936a8c88638a75ace4433133cbce54f5056b2ab23d808db5854a9cf202ded53ee1687ab24edc213b288ed884d89cfee04be3efc6b26b3d06eaafc0d0adba000eccd425588a3632dc1c97e26ca7def9dce81c9dcfdeb4b65620c960d0f83bfd097ea530aac89211ad72e39ba34329f8f217b802a8e6a8f64d6d27c7b1a039f774702805d5aa3c2d84b19b93dc4e8d469f2e6a3eecc79b621d1edb68f17dbb0e45b1ffdbf9df4ccc8259b21ab9c760efc7ef1ab616d8da0d989aa3fc72a16be9ffacb859daa38488634fa9d4b0604b01d03dfbf30a5cb72af04100c38069a8cfeaad5bc140d6c803726bb17edbca02af27549c44dfa8871c74ca961ff21fd2bcf8e825cc442d9765aae9e0b79e081fc93063f57432c802488e092e7c82b9df4f327eaae53b3d0231514e53bd7c52f49022da263e2016b81e011b156561aa2d83cda53b8a5f87d508528eea834a9daf0eac85bc0a84e08c14810a1678c0a93c5995307d1a3f462fdaf4f2e5475d87ead64cd91c82a9ae977d0897dfd662c2dfb2e706a028eb84191b726be1c766a7a671e9343446053d0c86f898e3cae185ef31c01be2fb557520b4289fc78ebbf12548a7471bedbfb5c9944047852ef2d4c5daef476acfb5c1af30a8a3abd9eeb0664a434e8d65a5273329b345552eb205a4d448a2689ef502183c621d98b0fb8428adcb4982d5c75d22e30b05d98bd2f38e46d86dd2c7f62d80fbe86e3149d194f4eee81a20b59e6f11760d498896a14329fa617e03c199f7e471ea94145506e1db70f1fb2a85cb0b4ce8a1ad38e0c10c02abd4c6353a7e3ea2b6f3fed1c12623ad65dc7dd7d730781f41eb5d11edf1d2fa63ee46519dd66b2e96f9c88cb9084aa8c3dd7ece065152d351a54a2c2912e8de903a041f43d23be3f2c2b4502e3e660611c8f9b857ab858c7270049654f0d67ff1c085217610bcb763d7bf73bf1baf4a617673478026fd065918a89d4e70c45fc0218284bff53dddea0799529a94926f7834c75f436f00fd94b62ba70372758a41f284de03e3296dffd413a97000b6a5a008fd3b6e7d96ae92f6b72271205c0e8fe7206c91169d01c835ce1806e93e1d50c557e79611515bb4764b048ac0cbed627f7477c9714ffddf10e111bd84a575e84947795749768e5c1409c797b1d14d02c5505e6ee018d5356138d038892df51e322f21030c23044bcee42fa481eadd4ccf1b366f2bf2fe28ed599c1390ee8d70a9ac01f4427facaf20263cb3b14bd8e9e952b63150cedb8055e125f4c1fb9c8bd94b872ba03f3c1fbd8b0098c266ee4639bd77440695c683801bb8c31f138743c013b9af62ddc0f5dfbd44cc4249baaf31439a9266acc8b58dc5e71df82e5a2f6342aca826c3d1149126dd17f2c80ad4a9044c53368f8be739b4720e57a20d916beca4fc108fc8bcaa7ea44f203bd375fa9fbabf0151abc9618b483612510be21bd9c21c6fc12d96ba8a8c1ce1fbb8c17b4a1ac58ff6658de732f1758dc15b2b7a31b00bb62c3611fe4e9339913bf3d24585152182362543e8c6c43ea612bef561f74712916058bdd04d2b00c2e9f83496c1b8f619ba45b815d125e4c7a0aa511773c4dc160f1e5c8a3374d431726350549ebf5ec689c067e22d0dd1fae036366adefd8a4b6a2c7716e22349222c053b604079ca5ef8c508e4d721d10efe91550cc4445843eb4a5dcb90016211d47afc8e67f836d94e5937a0849ffdb2cbdba195ee9364874069f4b5daf5897161238f003e4491e230a1f0129954d289581406844c07414a93edf8a315bde81229e125532ecad256c0a4442eebeeac9d9df974c1b3390bd962a2f45ffeff20b1a12dc312045a0c88b753e7ab83a69717c784d106ebbf11a69b28350529f2fcb1e2bd41936ee62a3818aa6132a46e9fd77205bec42ff67837613c7a0a9bea32a1b77f3daed6667a3ed301c23c51daba6d46a7e3751edc0d7a382df14a7df32f204eb5e93f6be2d72dfe37b14c53f8f8042f3a30b860beeeced2a170f53669cdd1a2b1ec92f11e8d1cd748b519c1b1b2cef3a9c91e317b1c38aaac13d34d9d05205bbb2208ffe72123d8320eab02240796ab7e2d06412b4e5af931034bc8bb01c1a71b26b8bda5b87bd7aa013446c1c23f7451452a8016c2b8e4bfb0f9faa6eec290c62fe4d90c40f02f01d6bf539625d82190e6776ae06e2c872e2b242aabf0226ec72c1c7d76e703a32f615c4e973348ae33e63894f083727afa5455a7d502d10518f3d7a43666b7546e8176bfc1db5efe3c0a496491d40b8b744a3a8725b802938d0367dc732ead28bba9dab15c54c888ac40aee292666ffdf96569103eab2137bf6ebbe8355d8f1c029985ff2203d0ff38e26798566f99d0523910d98d5b12c15c3e959e17a00f31e7d548064c6cdca173e9c5f67eadf88d016df117cc042025789706988de620c4cea99a876eb973072f6f7bb9c30526086a195095cce2f2c8b813e8a9a7ed46cda28e042371299168ddb20501dc0d2f21cbe220acd7e740c259a0988693f4bc3f5d61695af031ac2d7aeea44f0d745421f690fc16462ad01550fcb32fe66b322bd05057a341606fafdff8724be8bc3c695194eb0a297462c90d7da9787d90e65789a55dd787b13de116954687e2393ea9525d83ef6f683207e734d1bac28191f1686be43e5b61fc7d54cc0d8b8c45d1ebeb55dc16bfa7d2cbf70607c72923536d96c00c98af67758dfc9a2982e15ef3802bc15f1ffe4522a0cab43855afd582636b1a5aea834b4278bfbef5e8395e4be46b5662ab68c961364f0b64dc3dd230961e54b88e5389be1f311e5aca1aab86d8a87b32fc1d21c2dc97fcbf3de1d88bebae6a85d78f99c9d53cdb5a613c8e0cfefc7cb80df81c71daf67d8d9e4a53af35e9f9904f16a48cbaf7ebf69612f7efc8f41c6a504f36328c6341d4b5203059e587fbf82b9746492c43bbdbab09aca2ce8a5e241279f382d1cc04fd9d02b377970b337e2fc3f1b8c6cebfe8de29ef0ece75aecf13ca49e2d3584d9c52ff5aee44c660a59b2398ddf7a675a9b00861787b8feeb65bc78a7040b3115d22690bced8b90dc39c97cbbbfb8b5dd8add816837f4a5083cfaaeae1adc76a812c17097fc41b4a549d01c506f9490b0282f40ac00b363b35ffd332b207096db9f96557b5197f53bbc5d5040fc16a4320f33c1e34135cd9a7d8bdbc5093d26d0785ba088ad45a15c116aefb0f688c556c0092d72740ca86821f4431c1ee6c14f2e68083e6b5bf82de1eb4864ad85f766bebf44445f2204e55149827a1b098d208de54b8ec69c274c1b69cff0f677546bb79080210d117a7e05ae90c81a7d3287e8148cc12e8ed65c3f7d3bb3b8d8e932c25785cb5bec5376092420e11450f06f141830d99612cc6ae4d7b96050e1934edf04925f41df0f76b4cd47c508f8b6dcde10a89e1a557eb5374c7b6e3b6451e1404a2560128bc53257db6eec298f94836d89bf40949a69bdbc11554404bdfdef27deaa3d3714cd9798b29ccc01ca2bed61e9fe56547bfd8c87f37db742a07aabac019858c8a06ea11e12c9131d90b726515d46394a1b4c015793da8d9344f11de96b3fd35b34941e4a9d40c718d928f13f77ef3d22d9f3e6afb8b41a9734f3ebe8cf66f8d797d864145c3b880477c6a2c7ab46f51b3246bebb784504df7ff1eb6ec42a5b156aa8e65268f9f103d46339e5177f62e05c78dd3f7286d6863b1fc919e4e144355d58cb01fecc1d038c56a2e7615f2b1a5feb5d405138db8a12be915fd6065b9d602f17f7858d1e258da568871c2a8c14a163ff17b1143c8a22110513d4876e5e6c25979daa932301d94c4432ad23baa49d82b073aad73e48dcbf03755aa9f3e3b811667cd671cb01a3f2ad1b18dbc050b0b105fdb6faca96bc6e511cdd8dbfc1b09c2a483c33d60afce13fa5aaa8987dabfb8795ba80356c5fc51f058e4a0a0028c924f33b0a962a06f4001c441752b5fa6590d6a7760d22422e4e9fb32a02eb3c11af4eeb03532cd40487a916688df596547536bd08dbe365c1d2d86aebf35376bffa695309b52ed644166a82655e3f41966705d2351e32cfbdd3f75890d61934425b082cf8d7259bb608460bafeb9a295ebad2a85a1d28ddddb253fd4b23d02cbb912e38f426160a6a6dc88e9b4dc69e2a293264839f052d963b90a601fa7249248b61daca8000455a332bd9e5107f19e6ceb1006724902023a2966a3aaf64d432a5a20bce7f18c5579b21b6a64aac66aea0a500a2bd207b6c798183ff26b1ff384aadedca442a5f1004f4f69a17aa1f9c9ac6e34f0295e85089b314bf653c536b7174edb85d2c5d91528db6fe1b43d9a737ac321eef999614822ef38ae50c217d1a9185e45f1670be84527ba3c29a608bdfc9e5b279fabe640535ae25629a2db4a9a915d4f40b6039d17c824eb45edd38a90b570300423616763c0645ff5f99db0e6ee3e2b511bdf39e9c98e8a28a64591c0d6250a2566e78458d58cf79469b0d352afa528e1a3a1392cce8b9d63a013e1dfb815c270c79c9b90bb5fd42ca5093f52a34d2312296a41cc8d3310c3a69318f3a411603e82e7c406edda9dbc34d8b75e2993d932f1eb6d9f99a257a5ddf7186dd583c666d77b777a83f93791eb2433ceba693ec1dfb1f3e3cdd8bb07406e3b73034e62131cda6b867d2156da7c6ac0800a706fc0f231614d6aadd0706f8626ec6ae55a2199e2054d5f0b60ba9f0d3d8d1f4321c01d230315dc3d1df854b48aee2d32e5ddb67fc802e3be04e7f7469a56a5eee9b1087156c9e9a3e6fb53b796e1cda852484a9be2feb6683574fa78df46ef8776f0e6e99717c65d20d5404787c2ec9bfc52a4d03fdba960c48692d958a418f41d8141aca0aec1192be1385c0c30fdf5a6dff09bd250c52c4c13c6ea90e71b12fbb2a6e95b2f7b93fc95bc36734ffb360c103f8c5ac3e8adb2ab30ad570f91f6f9402771216c2d337d43b8c2652e45a67a51f4c9f606a2c8dfe45f916a0580cbff82896e5984c60f1f80e1ced60caabc8643132ee0a5ac4ba542d4ee19eff209e982d2486eabe185740d268717367e53e98a8c7f0e0526d306b0e821768b2e5d178179780d04a0215bd26f15e633cdf4b86d2fb1df61e0ffde65ab11e4619572e9d2a2543b32483929802d79a058573eccd79410252a96f313a7ae3b2c6dda40c2c1c2fbfcc4a38ed43a4108cf249034b762005185af1d120ed77cf3f94758ef5a11a2dd0de58a406e8836278a2053c4c837c4857e541eadec36cf79f6e38aa0d07082f119ce1eea9ca2e7022b0b8323426537bd73da0fb83b609d982b9f20a4fc722c2c0c6c83e72cb831eaafc280fe68c51075f203abf7ab8433d0b52018706dc091c9b5f22d646c49a72b4b1e769dff2f3d522b52eecd504e31942983edb95f515b781b238005301429ffaa0a0d52a5d438636e9ae83a245a7901c7c24e93d02075b789b30c74d6d540262b575236ab870ee46da4f11cb8a20c018f073ee984f1b8738e6dc8d536273babb636d16bb5b9fe8dc6640b266f6c8e984e55375c50e24817a202855c381f84c7064027635ae6086429d770416ba44c16c88fcb19e771a32a97750d211903db3d6802176a779a857db4b456dc7331446514d0d6425d224be843527ce474adcc4e889a8962e8d05985fc6bbf3f1b19c22321a9e90b26620a774b51b01d13e10a5eb96b2558a26d5bc5cada7fa2bdfefddd9489fa0af0709c778beb3d6d301bd50589682d9178f67d2632fe890671621d89322cee1924e1fdfc71784da8c6c4f724f09256806569432e480d37c99e9d1ed25ab52502fcc0e35f6a9dbb605f88e6192f5d96b9dee102e53b7ed82a7202d6c463e6ced7ba92de20e08c12f50d74165648476a77e13280d136480403e52fea651c06ad038f801124779a8d300e84ba8df96b919663570b829201811fdc1aabf113ba4625be11a10d4f50b58db3372a9e363ac2f01470f4e0b28a7f095f754fe7b3bac8d9a6b120ecbfd8a73d545ec7b14d02957141abe566e8c85ac5a4d8ba9212f56fd03252a735dd56ad8c9162b0836c622ac24fc43b6f3170ccd7c7f1b4a0c8f69cd4c290c6d8023a593353ee9fac160c67b97bd8bb55de03e6a6b112adcdda9776802c01bd551704c39fbcb3e656c2b3a3e860ae5d37b270d14a2cdc43b645edf79cfe61ec266d9362a2352a80f107a9059317776373cdf881e37c3497c58872bbe287129d9c748be5f12ded57c182bbe59c21e308fdbd98fad0e60a77028c368f99b7b271589f3440e847c26f1ad1f31fa4a88c8e017ec0f109d28f4a66d4b0b70b2120f5353885e305b9f5fdea03bda07cb41af86278088ad8580324c42161f9bbb8b2be8349dbd3ff84589cc40d845b8b70a59e8d5589169fbd70fc86c94beadab350916204dc21311fca71ba54ccd07af6261c37c6c7a93852c6eca8cf07db5e47d1d6d6248a673502d81a9a96eadf16d44628b6ae546cdfc9886860c6a2f235b80069caf741ee0662e34df18e1811fa69ddc2f34e35c475caf70afc5d5c46ad85a1c5f9701b834b718d1fcdf0bb944cf0a1f8c87a907ce8db93225d927d954d8fc02766f32559fbb9edb5886a5b93fdbdacefc4ca26c39c705018b40714de49c7e200f7f58af357a32b611ae5d86d6e9836d91c1dc720bf387ca7445220808b76022f97b2fc1f6e737e2e8e4c3f2770df76e03d904d39a682ad90bfe98f0c7409b16a18ecfd33b01dcaaf628754d474e889c2f28de3e70b30ae54fcd13ed5282101c6fd4831bff73d6df4c87d13a2b07336aa35c9283bc75ca26b020abe04ddea110c40cca49acb11e7a50175e575a5ef267cf61e80a02151a06a3e46ddb13d1c10c1ce60f867dc5480e5e49367ee40e69c3eab581b9070ed2e1e40e80b484b61b0ef9f202f25fb72960a27b3414d6fe18cf6d31012bd2f633fb717004d7b79a6514293a58847738207ded44e769618b7371a7b50907a09dac283678a2673e7bcd135a8646330253b9fd8703f8e2f1e4d64a3ba66a7a6385cda1814ea9705d5dff22c13d9f55a21c856241815a018e5e706104d6e9530553e5a65d05ed16b680ce044760906a7cc4604be48e5447abaf5764ac714d43034629ff58a5e4292e4bbd23a49980187443234436d952d1054b264cf9586a277355c23d7c71068cd4bb631faeade616bf02726022d579156a6481d3b286c562e847211cc63117c08a340f0fde81cd08437b9ba305d7f7488238809307dee66fb9132863ac3e370d7ea72d0d371a1b88045e329e4ee8323a5b85c354f00bcb13662bb9ebfac84e8dca49b42bdadfec551a36fcdbb9b11dd029aea9e7fe1ee187b9b9e89208d761102f112d19b6730c95993c90f652cfc1d8bb7a816c7985753d5058ff63d3b9aa9a65efa01fc8939306f65301e8ad16722d958805d143abdaf90c8e10e24647fede5634b125212e0c484fa9674d763a2dd84e671353fe66f87c503d4308e8273af0b10f43180f0c9f4edcea7d2857ff2c15c5f0a5d278fd807ef5600ea0a1b69e522ecc2f2c1d11766bb2286cefdd04cf441af312757115225506bdc6316ab0547b141fb10db30f6e095d563fbc409f66b76d0f26b451b23e2e3bf2bdb998ede5e0aa30350c50edac6b7529e79ef1a3a4e784dfddc5333b083d290c1919a2f0f2e664c3e511afa0aa0b8b3f3bb30f66d03d1c272f664a6134c79ea0b9acf75b33ddd038a10cf843591e37f14c8c04255979c4e08a1406c01df66d1575e363ad5492456d3b2922bd40315e5a8b7edccd8803c7d2d31145d7f2d8bab6cf5d8fe1f38644b369278a848560375950e1d0bd5cfba937f03671d9eed4d99c2a5b613501fbb04a530607827691bc91580acf1228907a855f1aa244a738c5633bccfbcc410623dafc069198b44606d2a8dc69830ceed167632e8f136799e79aecad35e5b0c805ea83282b3652d61785200b9c169545687c9ca301780e513d7afe169215c41e045918296be71b8e2271d3e54c1c4b3db2a0447ebe6d0e37d7d3776af27c35118932d007db2b45b3c560f0dcff6d5e1569310e54b2dcfbdd7117f09cfa35e9439d68ad277ea8b4cb1f1eb5271c664f7f7d27bbc15ffc5a9194ad55cdc30ae419e315b01e37667834fa0baf3d033cbeb7d7204a0f04c03b0f351dd1feaf6ed49df47a4903a4b9e17dd27778f0aff49086208464db6b78874b32cab136cffd60979c50502fa57797831c5136c27ae69be080da9efe9df6d0afaca48e1de834f16c7456271263b43ad6f1eeab3d75626145812253a75806332cd9b0790e99bcb5e4843302075f87195c78428d3ea392bf24e4639ba2cb1643ced5040b17c1b227bbd6b413120d0b272595116f38587e9df49f1d342b788757082a9485a97cbef9ca26ab580983c253e0d52de1f00ccf63046e8d3b1e3ed40a70140dfa299676a5a6d2cf950fda0f1e8bc7449b43964330a12c91e99b72ce209c9ca528b81c42a778600f10005efe1f326e58dafc772444d3962c053b5e4f3c8a289b63be2283d6cc93bf35102330b5a7fc8d59451827083e69fd364af6d8ee50cbbf31f24a8756405bcd662bdc1ac271185b2bc86631d87b3aab001ef194e5a878632da81e34260f3dad980a49dc8b0d96ea1b4ba9cb8f573d0a5b9563e89c182c3b0599d9cde17b1467812dba30e53d9447966b0ed052e41919e162a387388cbcb7f3d42c51a0c5c1589e1074191916f74cdf7f13bb6802c9618a55e680bc95f217ada81684c80032941504a994da8fcffee759954829909f3b84d61fdedd401517dee91f44fb445999e510ee18cf73395d5a7a684f936c5df468956be601522f7df7a0e4ef191965539f18ba22384591d8aaa66137ab8ee8ce9b9ec460dcd5d60a9df35684d2754ea0af2de1d6e93d82e925e3e7eda0669733baef40a7a796b1f494d69331d50496176d22f850fd98251395ababe1b7d6042b0f5f3c475a900c4d159abea2d4bdc1c8dc2ea40b1edef39a072d0c901ce56907c6ec6ba9ed5dd8e153678877ec2b8c9d3b2d1d3861b9a2ecb0098c3b177975ed073b2789f458c65297cc72fdffd19460fb17cb67c34d9256672c1bf28cab608970dc5ca41001d6b119e2241dc4d90202622276a6b90305d06af3f29d56e411c4f7d9507832f06dd191d1e8e4963499c13e0034d3ad17be5d5f4930b569ba9875b91d343ac570a64d36fedbbfe7918a870b2b98a2c73560bfcc6913944b0701063866044df0b730eb7c52b8f4fb25a185ac1d8d48b6e33f143d63752130692119d1409db72fbe09af10251e749c84e12bca2d81e52a908d35a1b456792c45f86544ff14a606ebe06eeb5fa977e14cd6997b0ca71c84c1dcd05cee2274812f3b93e199c782c8a6157b2be948ede5344a0929021e18b887d39ff7ac266dd99111fdae54a93dc41677399ad9e25c984f9292f704793a97f93ce1003bd5449020e25538230a2c499b026c0c276b43b304064f1f1cb3011f626800e40ccee3c8749278736105a07751960194922c31dbb40efa23177c1f26d68e6709bce0ac8a66c9e51e543bc0a2b1be23d0af0d9690701ca66c07b15c4e7eb21c79e2dcea5b14ad638a5bdce05bc629ece747f691a63d32878b000000a7","publicInputs":"0x0e9377f31c9fae99dde2e4871dcb0cce39b05422ab9787bbfd4cba8a933dae4708e7c96b4698e59641872c2fd712cd256c21879bf01a30cf7c9d47fd9a442ff700f10d3a401a22634ebb4b0b17410cd138fd388872486b6280d552d6317c255d0091fc2154c269945e9eecd8b7c3fda287b1ef154566ab838724c08bbf33ee18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028bd79b7d8802c5315bbb1a505e518bbcaf90b55712598012ee082d7bc35eb1914211f9f02fc6efdb6bc76de80a2aab9a29f329d43a3122216e950bbb1fb61ff0000000000000000000000000000000000000000000000000000000000000000003579b12574fbd88785a68732b8a32ee511f990b5c1c9c3fd7d04ee396a49201c7047c96fd8059cb38b8b9ec2c489ab0b43a5f6d87e98b2aeccfcb934e0421815f7d69c5331f509ffffd6c8dda6db188a48541ec67b8bf434f83294c24840211744e31ec5e4fc15972b9742216130d34aa7561a3786919f9a51392cd3bee52c1ecbf77c26d216c112fba848bcb2c4f8120c8f940e8406acd6e22914cf6cd4f2dabd81cb628905b2a2cee3ba1343d6803ba297fa9197a8e5c682ee348599d784"}
1
+ {"proof":"0x000037401d2b0ace7ac4fbf52963e9b24dcc562a0da10fa52b4fbf5e55b2b6d587d8bae4047fbe8e6ab5633664ebd80615a60c25b32093ef31ccb533d403ce748075fe5b00c95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af0930053eeeca2750c390a6b05c04c3eaf7148eaa37fc7f4677b1ea5c58207d438d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a1eb370e7929f0aa3638be832f05670dde96c539c0f377410bba9040bd0b1f281d963227735128f9f3b7d68bdc36e40df56b99c91d4490af4ad84d3cb072ac0000000000000000000000000000000000000000000000000000000000000000009d5ebb50ae6bb050adcc9b3cf872968e1aa337634853aafcce8e9818e94c25011df24633b43c3d7346227c4b84b70d3fb6c9fa5b2cbb698f5d500d60456adb00000000000000000000000000000000000d82c97ccbb9dfb5a09d0a47efd9de0000000000000000000000000000000000bd18f88e1691544daea4ab46e1cfac0000000000000000000000000000000000000000000000000000000000004e300096c6f7ce44c2b7c5d983b6d5b05c9ef1be47c4f5e93a2f99c3a04536c503fc000000000000000000000000000000967b0d22683d31e5b17e35426a3d6734a7000000000000000000000000000000847ef028539261225473627ddd0f8d18cf000000000000000000000000000000000001216ceaa8b5174d1cf9735d7cac060000000000000000000000000000001b55a7b492f10c0956c2b057f45069ab67000000000000000000000000000000000028a596b117f20bf5fe81a3fe27928900000000000000000000000000000021f20a78cb627a4ad3791652f224adff3b0000000000000000000000000000000000166403a92b86cf8b3786c6d6689bc900000000000000000000000000000054aee4df1be0aab6836278b2e07b6253f500000000000000000000000000000000000bc879c8af743bf9fe8cdb9edf641b1230f3240709381e84dcaef98cfbf65d781b584d8ccbfe86c67ade9d01f0d1d62349c9fe3dee70a5deffc982e456f2e08452c9cb24086d2051d6d3a31dcb5feb06a80455cdc287b36e71f3e7cba51872aa6c8956c82691053f96e283cba283101e6b727abb948ffe5dd37332abf949c841a3579018009e22f6843853710e133017603933ba8842f87aed9446150dc346d51ba93b3fec225511b924cbca4122800aff736906500019bd563c31f395a941de6666bd00f954484288f6283f2f6f7f193782db7b347fe2cd790ec1909d637cd360611d4ac4098134b48c576ba9d68115282242fa373432e29e5434049fcf9a19e6f6d19713297e90ac2ea20c3248852274438d5e01f4cc60bfcfd214d48dc18f59bdb6a7ed3f5f4ad6ef326dfd1db51e997e94591c00c715af82249a35d5420f1aaa2bb1372e6eba18c7a6224d8b5b014cb5dfc1ec646156de9d04768fd6a2a5b7e1a020f879c08f173f1ee3a9d1b32fef96cdab484f2f77d87efdd805afec744e88a06892d542f25f940e2039c9a4216d888dec263852e9a12c298ef408f500f571bdd79b46e3a49a4ef7492ffa3b093d108f129bc8fabc56f1bd2f848a51a29a8499cf8151d4e214ece3c00b7a710e80b0a039c8ed59e60e692cf8947b4cb3b67dafc6c7599349e11dea41f953251e4576ab418a0762c51b94b8b726c0191b9a9fe8deaafa19a763172704b9c741197aebb65892636d263b557f12f352eec433d9e52b9f0360ad000c95507f7dd016e962bc889f3cbc9214f0376e8e056e64000e634e1a6d3096e1e8fe9f8082312e21e6d94f1d49a7228756a0b48c87fc8e0a9024a18220db9aa3bf5bcb0883192f5f8fa9c51f62b15af530f829a3ea8438eddb110db79ea7c319bab353a44f532e18769d01b08b50430744dd274abba184186d0bfd3c1b6283144bfae15c1f5330635e714739208da837a09cc6548bf49ef8c062586d248cd1463fd86b0917b00424441ccc83e278ab68e9dfbc2d3b886cfbc42faabf52a2604e9dcd8596bff41636bbec86f259b2bd67479ead9b4aba8a93357a5c8060e949190d49e27adb980b76d2117206f8a5ecd1b102c7b51d63a7b40617228d75fc4823087485568f2a2cdae7da65634e3b4b0fd5dc25bb70823f701c85d2b5e91d640b654a6b06a3ab103648e577a38aa655e57020109e7e58745728bcfccbd21bc9d92332d81af9e706725153301904f2f2f89b51d46d2c41c89d4cc7e2cf4754bdc53b48232ba09f0695bfd151f1f8a0dd25e0bc5166e0a2ea6c7aa9f46ed8fb66a4609b385cbf47189b9a278d4b181ffc40bb8dc3d04b6c27d85480ad74d4f41f3681f992d04bc504fb15ba4f248e0ac1663b5c21e90a0850ebcc6f6890c5241c91860a6d65c2ed080975eefbf10b40ee825a3b1ebea01e4fd3765c41ef376cc517daa33374c13011b483f96780d7b35f09339eea08ce1d1745d4f02c2b307d9a7dd15c22079fff05ea1b17bb0699f34ac1665e73a08fb4102d9f619e889234104501a7dc81fe10270e8eb26dcfe587d05ea86e1bd2cf7f473d16f5c86017d990fd2ea9bc26f4140bd0cfbe16eb960adbb463e4189316cd4b050dc98d8c429b27b6946c3e36b80c0750e4c6c12da827c39aa8629e9a00ebfe52fe8cff2903c900c94894d83801d821ca58e309cdda4c02298081f66f63986c907cdd945ee8e38b36657e629809331fb9b317be60419780a8863930401073817d8bea66f9965a8c1fea2aed5e3a9a2c71d074e1be8cddd55fb3e7c4542bd4cdcebb4bca1a918f08724b8a5d7837c425bda7eefdc26da5e2e276006a0e3bde51244b367b91345d07dcdf075d920eb504f9e3d87b7cf7af3a1fe71704ccd3cd1649fe0225699b5b52139ebeff6c356109f38d1d029cb870c992752805364c021ae170758e1e9095df679aebb8d900aa1e2d347f767481387a099fa34d17b826c2a811e5e8278f10bd6226d8325c04a4182fae94aae2b8a35356b9216fda7a97435704c0d75b2d8de462467e2e56be9305e40a0e57bea2ba7ce90153e456f2b973dd3570c0c3013b49473b7a4642c226273b0974f765ccafec8213c12d5d6fd61c58a3c27540bbf2b9e727ce8cfc1a3114d0561768c28b8130e5e838f1a2f010a00e2e4ffebab8764089ac794c73a0fc0138fe5273e80d6ee57fed97cfcb8b2a6c728aadd1e979a00dffde8b57f7b5fe05f87ced5cdc0e75820cb49b37e2ca1f97dba23c23237f8161234668379d2e511c6546f086f2758e0df88d03f820f1802ecb2da684859b179ecb35fc21054c9605b094220562896abe675b9ff1678e66f2213e202dbc7198471f8c17f984897e2f9c66027cd8a8bfa36246747ce6d0cd5db6a053f79f8157802823e33d4d43ca179d24555a9d788b681f091697992bbd20c1f34fa5f7fef61a5c47bf770379881ef5a4c6a1dc7c15962ffdbe9ed0eae175d472ab0b631baf01b20eb24950fa7a14c7ab41a9d06d3c867997c64a37e29365db762c2e8298cb2f3eb6695205cb512f74e148268134083e82bc60287af30a3e33935523f74c6c3ae553a9448ad66f1249977a6c25eda4a5395d1aac5c7d5d3e9adf60e7fcdfd66aa46a656fed8bc204ec6ad59f9c88f9ef6f8b44fab34cdb5f48ce14a71e355877a265c59e84f70f1577bd08165a24abc5d89ffd9b31eedd510374639003ce5d6bf0179c2a58e7a10a30764f62bc9e9106a7bd2638054e45b2b77c81c205f614ba4334c11420bcab1f96dce8aa24acbb6c5aae9ae7863a52d7e7956b4e22b7003c18fc1afbdf96c02a67f8588cbf1486118b8428310187b584295ecfb280441d7e01fa2b0326930300b4665c2194cb0103f3e46a8c1dcc0d7dd448c47dfc0f5b2e3dc88ffbfcc7ec23bf76b3f5f6bf44bbf311cc41594db63544b93d14bf7f3c65fc6b86cfd4e65013c7c987f174a180ee17209cf420e790612a74f2ac356f674ca54f4ca0b8334324f6bdaac0c9377beb80138d20e17b7a1e2222ad37a0f416cc9b8bbba4f0c9ea2573ff282b6b9b64a4f808ff6aa5317ec987ca06f5c600699bde6ede4608293322a0b8d9d72b49c53a0de6993e301310f7b7ba8b92a7e5b5c07cb00cacb1dc6f034c39b454ba40df58f09545fe26864cf6cf65f8e59ca32456f4cbe9053c950c2c83d5c830d7c636c0d3d5fd0387a6c23bc0b4f22517d1ac35a8df9794d4dd000041dee56b9e0031f77b25ca46a884ae6df09decf0aed625832f97b3ed970e06128b10229a3b7f38aa50792bc52b7fef704a8d0464ceec284d5a5a272963960326eb718dcf1f03c08f271ad563680064f975381ce54dcd60b11b4232a723c77d02c3654c4cf8eb3f5f98dabe1ce91fe51fb585f66400b76ef886ec214d3d4e1e0322681bfd626f3f994153923af9f6aa279bf8b5917ccee77a2091366b8112a20d6408ae20fb63fcb64a1b1f96e749088801384caaa3830bca35d714e917192527667c80833a84ed70b3bff2abcd9b74e1d9e2f420b30f8c400016024faa696e18e740514afb42f9e98877aacec29aadb819ecf70b5c56c8261593c66957faea05b0c746cd36940c78e330d949827586976213306e50ea6b57c7a0f34cfe02b322b5d053ccfdb77b07b61ec65a33cb204c2aa9ec425d936a4ed11f709930db681569f38f6d04e66fb12e579aeba8fa1e4c6d00ba09100818053a7021ce6f81aa11fc375d0800714e30050cbe3ee25939c3949ead3ec9d8642769e0e5811731931e8f39b443e9e34d398a0dcd7871c1b54c1065cd66635702c5c7c3dc334d5d171f84b3c5f7faf0c57b0151193638465707a88e6b54fe235297da592540913f562778c2e80a201d144b27d8da7ca08ae99114c6a342cc93c4d941998106b89d0124aa6c77734f5ff4ab381453d934e7915ad634c5dd113248db818d9506e3136113496a219b7e1b1d92c1e34fc780f4b87e3b8c5e765b6efe6f2832cd304a6757030c05cdb6bf6f0ef20373baefeb765d5778fdbb5e090cfbc48a8d80c123f09d06f9d083a8fa4a99f47c6a2c54ab9372bf9862625c1df946081f9d367f884528305b15dccd93a85fe4ca37b3ae066d21435dcb4af0cdbcc73608f0fa5ad8ab1a05bf5bbb7c9927f31f03fdf729ec3084f162065cef6b225d223dd0807ce45cca1fbd66c2fe4629404099b8d781bd30e747ff602912ac0d2def73c734657c59531e2d7c3a9f9838022a499570fbe7c86adf0dc54d3f2ef1fd2e59e1d7ff70d2d4154fb270fbb70fb71c0a7b077befde6719b3e662505bfc37b424f6e1b8f0633707445b04fca697d2b9e029c8be3e6535967cae209d1957d4f3bf93e44989d1ab04531aa2a2feaa2bc724675123d1dad0fa2411261528f9ef91782c22874359722d54b62174f2cf4fff40a0aaca3ca3ef4e44a77f66d862d739344a921c7de1fc00a2ea2597b2e29a0bee5fdc657683ca7d1b5321979ed7f39c71c9fc1d9735db10895a10746389aa7e8edd78ec20bbb119248babe90986653acfe640f8d1c4920937eb32f6292d3c0b3e7d2817718dfa934f44f7c269d9673b7254e4ce8ef6562a98ac753ae9bcde69d6713862bce21bdad75e7ed259f93872f895994dfaa79a0363c5363d78f373455a8c0f4475157bb5fa469fcaebb22139e76030f75e2487278071ee51810df76484c3e5488185a33ef4fc2bf59836e567380928c02eb32c29dac2bc2f2d13ebe865a01e8689f9da4f0a08c0ab617a1406ae0c5f04999a001390dd0a2751f743eb8bd4d33eaef53131c8fd4fee098d20cdc00695a2396b5322cb1738ae736216f1b114db99e990dd5a2bb76705c6bccd139fc870b61cd610145451f46ce92691259b6892392d3ba0aab9726d396de2c4bea7cf6b1450eda9160955b7649d7036438a4126d5833d623be71374d649edcd468d666f7bf1846b2a161e6b99ac0d07d99b036bfc8d4080c864056fb4e38495bffb08e7a8049c1d28c63ee84b975624c39955ad785b0ce816d90ed66528553652db5e2da27897d822b26bb9c76b3e415e61dd145c2affee307fb4592784e248945b5e0057252ab61b2d4a7e39e47c1816c336df6bb00bd1dbf412fda941a817ca218019c2c449110415d5fd33c28b8c7edd9bc9b2d3b743698d251c79f09c5cc33a628c8ad4d9350d4132dc90c9c9e95b4003c6692c738905383ef21317541ac6964f45dd7a53482b79be7a28ed7eb33ce70cb76810c0b763a8bfb3b8125d33722a8861e977490700dd3a818ddf8822c9531dacfebed6a473a599287a7846fe6154aad3da7592300bad6bb710bc2e6a04fcba27ca9d6a77f565b8403f117bd5a28f9e1b453cb2a51443280aae14725582505c72784ff8a9689a94098869271031b97d84d8b2f45f2e7a8ee41b264085329471deea8da611900eb1f55043c5d5d36a5a8f4e4e40541e7b59a4f5b57e0f7c96241cec698512ff5ecaad61162bec7dbbaa4a0c629745195941175be77f726454231baf6c6d7725951add6fddc080256846033c9556c91a197b65c54f04245aa9356fcec2a69787a79a435bdcc98a29cc00d20624a2d11eb235ae6fdfb2c34d9c8593b0120ff100f9743b27a109fe3bd273bc67dbb7770661ec2c1d931aa1deee676924473a9d369a705944422aeec57db6f3a1ce24e82c60152e5a3308d97151ba03175d333dfd2d9b2eab6e0fef340a07b453b185312facefb814a5e4120e89dea1986c15118389298ec9787570f515a8141635d9660dfbc4f36157c4930c2da472e0193600adfb35d52675d99e3dd3d85bc9257ed7195031479ac64a93edf1f538a263c9a77332cfcb2179740f551cadcfb6061a8d1da6fd89ee8a09c2a1bb07db0a7ed7b927f7c0dfe51af6b0c1dac1d9d3e7bb5c1f58314ff3eddea73c992d2ed7a45ef6117f08a08908b70932b05c72b211b84d19fbec2a4fc61f00a1b509f43347bab0dab36075bdbcb1d6879e5a5e44f2e36c1b6f2df69b90302334b46ee6b4e347defc48efa97e51a0173b13507513cb0d6d1f29f62ae5733e7ea55f71d3e55cf54ff5a82d36cb43d639e4b9143512f018e516b5026876b79528e8f1eb42cbc6b381b50eb74154150a055a1283969878a375173fd1b1c62731daf637535a290b1717d9f58c77b2785beb51e297b4011a5cdc12c6e4e1570f6de5e964d4bedc21bbf440d17ced5b30e4bfe30b17a4ac013a320e87c9ce9358d6846c62f84f620a033b9c5fe48322f0e3de41c6d95350a873490371320681b5d82f7394bcb22113ea3c69b7057b7821b491147f945c7301b4472af1d0661c4ad1713ceaf1543c46e66ab6fcb8a8738b9051567ceb56b2efc0471a74bd19f7c2254cec6a2f10d94853b2bb0d9328f00dca76854f5b1991b851691e50e90b380f8a8842d8939ca5cd5cbb9f1733c533184d206ca54fe766e08427197573d439b29a48e284766d99e59dedd2fd15ad933b22ac10f777d90e081ace08a1132012eff9c7a621f3a509e82c0ba3f33e906cbbc494b83125f9d06650b518ec4edb63b193031084723e98adfaa4cbbb27c93d7b35ea51405317a54b5f481eaac5d4dd11a08e296c86673346757684c5caf3f01fe726d74b7ff532fde7b402e60b0e87d4bcb00bda5813294b5fccd6583104c15b7cef983f5e50510f4ac4134934b05bd150a742244457f7f4315a86cbface176db18cf863931d993bdac31481d871b9ebc4fbf0519e13731e3752238ae7c218cd8a94fd12341609fabe5d2581866e4a7498a33b7ddb54be930050c84c65caee1d7ff803053529f4bbbe732947d73d5abf41824f7bb103d45fc32b34c8c49ccc0958b87074e6c2b7d2b7310dda03396186e4e9694b9b7eb2c07dd6d4a78cf90ec480d5451f6456c2531fb81713d7e73ce5b65e9e9832e13a9f17c9dadca98fcc91c6c98f6ef2f5e480a16d04951ca7bde9bc1aa9ffd13013c4567e2decc5fbb3781af953b4ac1e7934203604e498b26fd15fae48951496307b306fbd413e0fc0999df3c50e41e81e4d16a32fce06e6a58a9a591d7ff2d4b6c12749d61dbf251a56ca0d973d1838f6cc32de226d4b0d20f985cf8983d9360011402eaf888b6ff0ddbea2c9492928b78e35e003e3b54833b8d0d456187c89dbcace080ae7e0b43aa01166b0545d4374ad490318a5d7a39faf93b890e73f3d56f7e1a157ba5bdd1020cf842f33305f40ad3fd420f3d67e4121d7f92f00bb6a2c01087a5560ac2d79489bf1e342d401f8f34dc12f852072b635384e6ac1c76a924f72ffc74a30abb68c79a2c7cbb012d4c6438902539b67d9c93cec8e0bcdf9865d195b7eece823e918814c65213851fc7d1cb42c54f20771c6adebaebe1e10f047fbc64bf0190b5960aaa9c32c32d68221e6c001bc9298f33c51f0a4ae2e1c1ad94f03566aa814ba1d0487c0072a3037381bd907988c3cffa0b252a9e72b677a6b64956e1c3ccdfeb22201ce22f134144ec63519b89e29b8776018eb8d2b7552930505eccc7d7eefd5c015b5e2c925a2bf332c17fa59aad8bb54fb28a03af550d2226f3df5535bc4f1307184b2f3eef1cb9f0c1bcfd9fe92c11f0cead04c3082770666346c66c406f8f924509e8f588789f7e103a0042da54e90d798eee38370fe5e6f32ff8f5863fcc656cf6cbf5d211768880430d1606f1d3c959186790269c8c619cf203ee69271a570d932a75f7dd90ca51506f2dceb63751cdbd75e9b9923deed45fe705aacbc0322ad09065a332f45d5113adaacb5855e823be6851a42fc65a450e3207e7fb8933c043b7acfe8141e22294db301a0bdb309b263e452f45b76ce7e51033232626e7b9bcc781f34a1ad891a7863c5e21470084e2a46695ae3e7211b2c69b717ccebc5ae03d44f6eb48b551a06ec9aac1734b47e22b9b79a55cd50f3326094514e79204b92256e5a33ca520679613333f74b7c147b2af2ccd2093e4d58dddb06129ad1f5a02af3c44b324a1d908d0b1bcaaa5a72c0195a9ef8f98280861bcd1b58e05c3871307b77f92e151248b8ac6063e0f8839a77a7d98606106988ff12870041d5c562dd077fce999b2e764223c913522f4be6986d1853091cd61cb80baaaff0f7c649cbf4f8f079fb1e850a548c9ca1120092178bbc5390a35b6a85cb627b6ac30ca8bef76cf24b6122b85885ba19e48b21b9eb56f70734abae2c7431d995898586bfce75dda17aff250e6968b574b21610b4835b34303b3246541215c71d219fc2e36211e316fbe722e3303b22d73d33ab2f351e8fbb0c2aaf702d53df5f97873128c29cc7d275bd20898a9803b56329bee77ab0d05f9981b4e7e54177ff2999db00b8c9f201834200303ec7d0955b5f395aa53b8cbe126b9b352d50514b34688223f03c17b00b501c8762e1c44344325fc5a1ec11ba7593fd06a3db105c97608c51dd42b2a8cae2074d2c7886df4ef332c5362c07e1c6f8006bf661cca91aab99418668fc5180f91f8d38680952f286b84e1e474e1e638144f385db37c6b6516d69aa8abe09ae6e2f098127f71dc9354f80091c9686f6f03099d409954522684da024d8b14d57270ebae3aa7255a3d3e0b568e0269e41886819fc89bc5002366f36c43a2ca269202378b89d398099553c09c98195a44003919252ec98b922bbfcea7f56d5cea0c90ec41550fa9e57e2a1112480ec41d51d46d16da89809c30044e710c20335cef8304a4c50425b1ff0c04510594222e1f88009b9bd3bd29d50cbcefc76f19bb20b16981bcf821cdc4a5fa276f6735c7d7c19932a757ea7a929849a03da50d7dee81522b3c346f098d9b7a0687000a0b19c9b25215a97d8ffa26c64f9f69bf9dc422c2d13ae924c9830523f113d6f6b74cbf578ebf9387643a98a04705e2c58107913deecac5f62013746f5a7bce6c05e2ee82e2797cc09e494c1f5559c726c7eb324ef72f32baedd84d92f44424609f41a0417f3b82695f65a7f9135ec5ea377a821624a1badea514b298f4b6216cebe76e7e6976e90678041e7a15c823883e2481386a9b070b0a081e5beb3fa2a7fbcac9a0de04c1261528ad8796bdde20891ec20352ad5523b8e808220fa16254a3daf7a72b6db2ab247c8dde97ac3db8d24d71bae4ebfd0a1e3037176913c8be42a1fcb123aa50799d28c421801a14425612d2c2634dde04c6f955e793db42b36767bb438bd35e419194137b9b7c4c261aa1018397c930334511e764f80c51bc6e79f0b4462de39a23b4db71f8e1eb0904b341dbfa71e50f9adea17d8d2a331a66275123faa18af436ca773b936bbb0e63c080ad5059e6b3d284013d1e3c15af021bc94aac1a6e7697abb88edffb6113d82ae18d6ba390dbbd58531c1f099d6c2a91c2ccf4626a140121930eeae06b13a296b2e1a80702d7efd08afb2818e28e2310d2315d9bea60605735321df837577b7081764a3989cc367c1b316c76777f8714759c8d8ae497274d0781312073e600b521d718762bce44836bbea72a38054cc7e75242b6eca88091d8d46fb04e28454430c08fd25f2857a1f3bd2f5677993bbcd470d6763cba2fc6529ca40e1d96752be033796304b5b95e2a75b7080446dd476faa6b3d5dd959b2a76ea04e0eab9a4f11295ef502e9dd29830d129d31d09e6a856587d36694641f7136578192fc573de0e50ffbbc8d4f0f0bf574344165b95f4c1c6f3362e6ff3610a23ee5daf8bacb21014126ffcf166e5a1c9ad60e3a82223f2ad09794818aa7ce26cb347873fe27d0ffcf63fe400ff70dd51e7233cad2a4d41451e258f0165494fb7d61c7bd574330846048901f46b492670fd05b2ad3816ff57cb9d9e1f6ff921ec06c93763e31f2d51687fa9ded4f81462933e455ad73f7c4787847e7e77c3cb8cbe720121ad0a2240cad647b8c1b429c25b22b90d889dd76570b53562bed0f5f530f3e28d62f020515889858729c101eb18b2c3300f8b5dd3d97628b828bac9783dadf7f3657a2029ff686851d8077f3ee87258a65073c3d63120bd355885347768b371dca45618353bdad01c3bde20d5b493271d06da4ca959689c8df11ea1b1c99cf26d90b8066fd2b03540cda23167f7eea76fb631e86ff305192371a0da4fd9fd331d97e307390316a7f296f64d945c1ad30edf4317ad680f2913213707e8ac1ae138c4f91a371a5e43d5848ee4c47681fa0443b6c21b1340b8cf5da35b64c7508b61c69d06a2ad9ac09742306975eb8b7af69f957a9debaf826cd58e28fa1004d7bbd6e60d847ad494dc8e0cd3579bff0e137fb087c143b70823a5fcc7a93f766055acaf1960558271a9f215d584fcd142113cc7dff6d7008fc27ad5005ad70174789bba1674102f8dafb55e53215eb637c6f52fda2bf9079b1e16402e13ff06261f54e71131fe16f0d4cabaa3ab95dfb593c1ac46b009aa7ffeb71fb843d57ff74908db1d64cab3080aca8ac059208f489a3b9c0abc83cf22e0526df38165ac201be12d13f2b581bd680df45a4ab2b69d16b97193ded7b829232174abf2b57b0d0634f306cd52b44e0514365fe138adc09a9797b7f962b7a7d5c4ed2088d4711ab983dc0eb0f10cba67009c1487dd4a178ac2477fc8f06efac26b22486494d53174b5a507ee53b96bacde952282fc7cf40fec74f7b2c8714d003734454eae18193d5b011bfbf713887ac271705dbbf52f60b798aab781e2e0a9fc18d95090da3604142a2ebce2d5f2cd7a57b7d271d6fea3045a5134a7587e79c5533eddffd290347b8c198132af43c7255b2e3c57b50cf087c2517d33ff84e72bfc3c34c3fd0b4a0cc01b1b0ed73d26eb9eb95cf650963371db6a35efb08f1654b464cfa0b9f0cd34581a67939eaa7b9a87b5b502b3ccb836f009eb5da5ff71db980ba9a9db2852071f3031d0007a6721f14fb3c74f535510d77046fa59e8a13a9f333737cfa8cbf0b805443687a8678321e80ba8c4a77a671770af4112ba8e39fdf475ee35d44e708703dda51b5c4c74fcdf54ec9c3b49464f575875a10f36c4e6c13203efecfab1391488a4a88eca9ad20d99405eec8aecd8a0c13c2454ef58a6efd94123780545360945c2ad36da244a07d55f4879edf37a113ab04ce5497c796ce07391a6e0a8a200d866e9083b19625828fd093f17f19966608756af95f330cca23084c49eee3d1feccf20c6c8285d537fde29e6f63ddcfffe7d3771ea8e0f709bc6b5b14198811be0985d0de150b9148d71422a5fd35623ca1cd8f93a20257e9d5779a505a89e01483712fe6f4d547a8b799763f0d3bde623f7484f69d22df5ba1586b955c44328daf70c164ce963f1276c7e24a0350405a9f2d54d60494c57d6959228ca64f3232158736227bcd1d79d18da4c0cacd4bb5c53957b3f1032a56a98ba00ec555507c9438105f9d9ad8b33f42f6fbf22c9ab3a84fd2e7fafe5525fc8e50ec0498a303ef9a74e7a0eb4ae1a53e132705d4bc208be2636689c2998577ce8bb51c3441f671a537fbf9abceaee7e35ccd96ee07ced7d2bc701900638e424227181e69c2bb7dc0a249fee4c9f98f70d6596491652ccea30e160d58096b0afc3e52e3c2616c62bb1714bd91a9c6f067feda66a9b5f908937c49a431aca4c4955c3c0598f2d932c84ea2bca2fd8b61f36ead421675b5ef3a167f49b7abdff33ae0e5bad421d2892726a75557ced30eda4664c666823c80dc865b1a95f83fcaa826f70036e0f2f7d8cf457863c345b08d528e77a9257f83caa6c04149f669254d3db77c67a0720e9a75d57691708f36591d2185d1a1ca61d2c2b3f47ebc5b6cdb78d7b4eb62fedc57fd72deb59150eb40ddc4bf5d29b055f6d268d9fc9c13a65225f44c704108e1fd52cf5d81af773ae9f2a23eb6177446344032da5e60f67aadffe281bce1985a46fb23f587de1d00cc981cf892f8d32a4221a8d8c0749121bd43b6946b81b1380b588db51f32a9d09e7f2189b06ca68d0e69545aac503adfd83a29bea9505fc3afeb9e11d0b9c618151163dd979bf6a32ae403598edcf68dc49ad7061061f63e90dc541625362963b76fc4b3bf9760b5652a4e78668ff02d83fa40461b02ae7728202beafdbeb841703f467e0d83dfd909f3ecd8be5b1b07901b1a062e100a4b405d0f8b75a1dfa0ff99310d4da652cd13131013f7dc765b6a8e9d45ec816bd712d321ddf8b167bb515ae04433acfd143d993b6fdbcd5364668add4b0d51b0c9a9040babcfffdd0add341551392856f335b913218d88b0febd958ee965717fa8876913b46960863ec32ad62cfdc1eae3770c76831fbd6febb4afbbb1424006c806b45c000d89396bf2a4dbb46f22708bc4d65cdc68d28fa7589ea6463bf1c8742d186eaba1d0ce77f8fc6e56cb297bdfd14f476eebbd4d7ff496a90f66508cbcfb0d0e332c591342db760578687090867fa35e58940d02148b31c6521900b01f00dc72389a9a05893c6dc10473e244a2fcb0590fb8fa6dc65bde2bd2e1d1b8c8546c6d65aed1f2cdb0bbc20bdfe2c9f9dcbd469a1fefdf4ebc21b40e62618b8333b7988aff9ebf25802e4192a698c396c091c9dbd4e594f3e852b40230e2d12ddbbdc7bbe0dcc785f0308036aa3b6ef339d346516ca1ec3d8e155f8be6d08a1ca67b2358f2a8b758f47783f4f34f974deea124920b941068340602efed12f7cb373868484322b652a77bc82f8b2ca3ccc67610294dc83aa9a9c04eedb701d7e4a736dc29b687c119b55b14611670921a946fddac0a9ab699de77632aaae07ed5403f182e4e202051fd4ae3481a221319cdc9e6958f0ea147443de3ab25222b405289e0d05addc5ff61ae69b4cbc069b9ef27a9e3ff37db6b9a4a118c7f5109a0ec73359a8bb6deb507b98ac8da6bc7e1f12b48b4d4f5246eed25140c2dc00279899805474826336b1be018b04de37f82bd5a088dafdf7808141749ccdf002b5e4cb9a33758415cfe2d15a5660dfcc18b1aa4e54ca184557bf30aa29e9cc14946eaef239d83fb7bebc340078e94b57cc1648d78853ce51aeed5a8bbc18102fdcccee178f1c8da645b121e778e5c8f1fc8a233daabbf5bea172cbd88df97b1001dc0612a38c7159acd4c8a3b75a383461520772cc716cb4f65234be05d65c1f1becb411fe5519cb8c9b022b6158177bdf24d65aa778ad0893b1628574610301767d14bec7bf8ad62b4e3340733cc005a444a934b65954de178e59a1c1f11d1cb3f177b7611fc98a0e07dd6e121ef2079c123523b70f976ef5c695c2a798440b9d458bc50fd2745afcac4f5a6958c7ae814dbb4587494b7494b98719507cac0bfb54d3c82395746c616e7a25e63005cd5948fcfbbe3fd8aa9b21ada39223b12d40dc8bb25832445122349e3cf9ed7795f942c34c44282f81d40a9bfa1df4991fee2598345f996ef808adf1b0ec72ccbe17ce688b520fdb3e84bea8c57699482b5d90c534d4c0945fae2deb0310b36c721c490c3536ec93d79aba399967addb1bcca91827b54cf3479b14fa93d70995c94006bbe9b0af7601eab7830612c50218eedfd48b3a229ad3d345552f320120c3e24d9659f423bad70a9be3aa3ce5e00b22b2de41404d37c2ac7424f13526e37ad4042d640c31cabc57b24f72d878f800e2321600093ac31a503ca1c6090c767af78e3c26cb3651d9d49d33c7a8008f0a7ea8c1963dbbc53d145130339a98a79d839b35fdf84eca22619e9327006912196203b3e22a91c62e181baaf86a771d1c39f0c3d0a6c4d2014280971ec22845064bfe5d8d67cae71f725ea8c84f87a127d7a1178ce290e2040270bc41f9ffb71473351ea395808ac920200fd04d484b7e502b6616ee0cfd96c3ddfd6c1cfff316f4a75ea09c94a3ac11d378a7598dab2bc76e8ac09c9a82a2ec47df3b0bcb572c25b106bc37cb71ee911bc841d489f2a0b6d4a9a1fde23d8061800447c0306c18c109f10c4fb3dcd9f091426b1756a8ec97e7c1ac79dfd4fc2b3f89b47bd68a13ceabce414bc9bfc357474d300e4a28bbe77566ac14f45cf07bcfcc9c5d6cb01082800db45568f8f11a59e79eee0b6680d35854cf0cfba4a362593396adf2b008260c014f79f3204f63e0a3f479c38c014f3121056f12133c73b662602f497117fc6eebe870a9cfe3f7f2ef654a6eeb473b8cab1c9010ffc2f1b62ecdd779200bff45b80e8575f5dc4e9bd8ad5b90561fbe2613575753ba6d898612895bd5d628ebb7970d821248fe62e1150175ecd0dd008360aa2df3ecd508ce56f4d738a3206867693760649d25b5e8443dd1eb6d805ebd783fc013fe6679f7af5ed6b2f22b7e66648b897aac615564c70cc97dd10c15c5f40864272a5a9468efda9fa89215dd201087439719ca9c03d69e7c8e289e608d099bc7e1b42406a949528854a603fac705ac5ede99fa6695dc1bf6a08205d92b9a8a768dfb3dc95e2bf73bbb16266cb44d88254c241c0a335f5b0c90f49eb6103dfc6184539d67aacad913a9b12d28f5b9a39430fc5a7bf54c8b12fcadf2f639d01d3559090681727d7aaab1600e6de0adf471a573d03b40b9c1b28e3df2dace28324398453527b8ca9c79b5850037087a896d4319291b0dd22eebd0cae462d8669cb4dfaa864a35c9df0f356109645a8a5a633e0da0b88e0686ab470d03b26f95b0dc8bf6987fc721f6fd440500000077","publicInputs":"0x1d2b0ace7ac4fbf52963e9b24dcc562a0da10fa52b4fbf5e55b2b6d587d8bae4047fbe8e6ab5633664ebd80615a60c25b32093ef31ccb533d403ce748075fe5b00c95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af0930053eeeca2750c390a6b05c04c3eaf7148eaa37fc7f4677b1ea5c58207d438d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a1eb370e7929f0aa3638be832f05670dde96c539c0f377410bba9040bd0b1f281d963227735128f9f3b7d68bdc36e40df56b99c91d4490af4ad84d3cb072ac0000000000000000000000000000000000000000000000000000000000000000009d5ebb50ae6bb050adcc9b3cf872968e1aa337634853aafcce8e9818e94c25011df24633b43c3d7346227c4b84b70d3fb6c9fa5b2cbb698f5d500d60456adb4e30bd18f88e1691544daea4ab46e1cfac0d82c97ccbb9dfb5a09d0a47efd9de16c6f7ce44c2b7c5d983b6d5b05c9ef1be47c4f5e93a2f99c3a04536c503fc967b0d22683d31e5b17e35426a3d6734a706df32e687ab5239d9f94c6f781ec93788f5335299e7824d699b722d99f94c8ed3a09014fba85c2a284d5019e3bc749d"}
@@ -1,5 +1,5 @@
1
1
  import type { InitialAccountData } from '@aztec/accounts/testing';
2
- import { type Archiver, createArchiver } from '@aztec/archiver';
2
+ import { AztecNodeService } from '@aztec/aztec-node';
3
3
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
4
4
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
5
  import type { AztecNode } from '@aztec/aztec.js/node';
@@ -11,22 +11,20 @@ import {
11
11
  TestCircuitVerifier,
12
12
  } from '@aztec/bb-prover';
13
13
  import { BackendType, Barretenberg } from '@aztec/bb.js';
14
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
15
14
  import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
16
15
  import { Buffer32 } from '@aztec/foundation/buffer';
17
16
  import { SecretValue } from '@aztec/foundation/config';
18
17
  import { FeeAssetHandlerAbi } from '@aztec/l1-artifacts';
19
18
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
20
- import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node';
21
19
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
22
20
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
23
- import { TestWallet } from '@aztec/test-wallet/server';
24
21
  import { getGenesisValues } from '@aztec/world-state/testing';
25
22
 
26
23
  import { type Hex, getContract } from 'viem';
27
24
  import { privateKeyToAddress } from 'viem/accounts';
28
25
 
29
26
  import { TokenSimulator } from '../simulators/token_simulator.js';
27
+ import { TestWallet } from '../test-wallet/test_wallet.js';
30
28
  import { getACVMConfig } from './get_acvm_config.js';
31
29
  import { getBBConfig } from './get_bb_config.js';
32
30
  import {
@@ -73,8 +71,8 @@ export class FullProverTest {
73
71
  circuitProofVerifier?: ClientProtocolCircuitVerifier;
74
72
  provenAsset!: TokenContract;
75
73
  context!: EndToEndContext;
76
- private proverNode!: ProverNode;
77
- private simulatedProverNode!: ProverNode;
74
+ private proverAztecNode!: AztecNodeService;
75
+ private simulatedProverAztecNode!: AztecNodeService;
78
76
  public l1Contracts!: DeployAztecL1ContractsReturnType;
79
77
  public proverAddress!: EthAddress;
80
78
  private minNumberOfTxsPerBlock: number;
@@ -146,7 +144,7 @@ export class FullProverTest {
146
144
  // We don't wish to mark as proven automatically, so we set the flag to false
147
145
  this.context.watcher.setIsMarkingAsProven(false);
148
146
 
149
- this.simulatedProverNode = this.context.proverNode!;
147
+ this.simulatedProverAztecNode = this.context.proverNode!;
150
148
  ({
151
149
  aztecNode: this.aztecNode,
152
150
  deployL1ContractsValues: this.l1Contracts,
@@ -155,7 +153,6 @@ export class FullProverTest {
155
153
  this.aztecNodeAdmin = this.context.aztecNodeService;
156
154
 
157
155
  const config = this.context.aztecNodeConfig;
158
- const blobClient = await createBlobClientWithFileStores(config, this.logger);
159
156
 
160
157
  // Configure a full prover PXE
161
158
  let acvmConfig: Awaited<ReturnType<typeof getACVMConfig>> | undefined;
@@ -217,20 +214,13 @@ export class FullProverTest {
217
214
  this.provenWallet = provenWallet;
218
215
  this.logger.info(`Full prover PXE started`);
219
216
 
220
- // Shutdown the current, simulated prover node
217
+ // Shutdown the current, simulated prover node (by stopping its hosting aztec node)
221
218
  this.logger.verbose('Shutting down simulated prover node');
222
- await this.simulatedProverNode.stop();
223
-
224
- // Creating temp store and archiver for fully proven prover node
225
- this.logger.verbose('Starting archiver for new prover node');
226
- const archiver = await createArchiver(
227
- { ...this.context.aztecNodeConfig, dataDirectory: undefined },
228
- { blobClient, dateProvider: this.context.dateProvider },
229
- { blockUntilSync: true },
230
- );
219
+ await this.simulatedProverAztecNode.stop();
231
220
 
232
221
  // The simulated prover node (now shutdown) used private key index 2
233
222
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
223
+ const proverNodePrivateKeyHex = `0x${proverNodePrivateKey!.toString('hex')}` as const;
234
224
  const proverNodeSenderAddress = privateKeyToAddress(new Buffer32(proverNodePrivateKey!).toString());
235
225
  this.proverAddress = EthAddress.fromString(proverNodeSenderAddress);
236
226
 
@@ -238,14 +228,21 @@ export class FullProverTest {
238
228
  await this.mintFeeJuice(proverNodeSenderAddress);
239
229
 
240
230
  this.logger.verbose('Starting prover node');
241
- const proverConfig: ProverNodeConfig = {
242
- ...this.context.aztecNodeConfig,
243
- txCollectionNodeRpcUrls: [],
231
+ const sponsoredFPCAddress = await getSponsoredFPCAddress();
232
+ const { prefilledPublicData } = await getGenesisValues(
233
+ this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
234
+ );
235
+
236
+ const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
237
+ ...config,
238
+ enableProverNode: true,
239
+ disableValidator: true,
244
240
  dataDirectory: undefined,
241
+ txCollectionNodeRpcUrls: [],
245
242
  proverId: this.proverAddress,
246
243
  realProofs: this.realProofs,
247
244
  proverAgentCount: 2,
248
- publisherPrivateKeys: [new SecretValue(`0x${proverNodePrivateKey!.toString('hex')}` as const)],
245
+ proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKeyHex)],
249
246
  proverNodeMaxPendingJobs: 100,
250
247
  proverNodeMaxParallelBlocksPerEpoch: 32,
251
248
  proverNodePollingIntervalMs: 100,
@@ -255,21 +252,14 @@ export class FullProverTest {
255
252
  txGatheringTimeoutMs: 24_000,
256
253
  proverNodeFailedEpochStore: undefined,
257
254
  proverNodeEpochProvingDelayMs: undefined,
255
+ validatorPrivateKeys: new SecretValue([]),
258
256
  };
259
- const sponsoredFPCAddress = await getSponsoredFPCAddress();
260
- const { prefilledPublicData } = await getGenesisValues(
261
- this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
262
- );
263
- this.proverNode = await createProverNode(
264
- proverConfig,
265
- {
266
- aztecNodeTxProvider: this.aztecNode,
267
- archiver: archiver as Archiver,
268
- },
257
+
258
+ this.proverAztecNode = await AztecNodeService.createAndSync(
259
+ proverNodeConfig,
260
+ { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
269
261
  { prefilledPublicData },
270
262
  );
271
- await this.proverNode.start();
272
-
273
263
  this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
274
264
  return this;
275
265
  }
@@ -289,8 +279,8 @@ export class FullProverTest {
289
279
  await this.provenComponents[i].teardown();
290
280
  }
291
281
 
292
- // clean up the full prover node
293
- await this.proverNode.stop();
282
+ // clean up the full prover node (by stopping its hosting aztec node)
283
+ await this.proverAztecNode.stop();
294
284
 
295
285
  await Barretenberg.destroySingleton();
296
286
  await this.bbConfigCleanup?.();
@@ -0,0 +1,126 @@
1
+ import { appendFileSync } from 'node:fs';
2
+ import { type EventLoopUtilization, type IntervalHistogram, monitorEventLoopDelay, performance } from 'node:perf_hooks';
3
+
4
+ const NANOS_PER_MS = 1_000_000;
5
+
6
+ /** Samples event-loop utilization, delay histogram, and heap usage per test, writing columnar text to a file. */
7
+ export class EluMonitor {
8
+ private filePath: string;
9
+ private intervalMs: number;
10
+ private timer: ReturnType<typeof setInterval> | undefined;
11
+ private lastELU: EventLoopUtilization | undefined;
12
+ private histogram: IntervalHistogram;
13
+ private testName: string | undefined;
14
+ private testStart: number | undefined;
15
+ private eluSamples: number[] = [];
16
+
17
+ constructor(filePath: string, intervalMs?: number) {
18
+ this.filePath = filePath;
19
+ this.intervalMs = intervalMs ?? 2000;
20
+ this.histogram = monitorEventLoopDelay({ resolution: 20 });
21
+ }
22
+
23
+ /** Begin sampling for a test. Writes a header line and starts the periodic sampler. */
24
+ startTest(testName: string): void {
25
+ this.stopTest();
26
+
27
+ this.testName = testName;
28
+ this.testStart = performance.now();
29
+ this.eluSamples = [];
30
+
31
+ appendFileSync(this.filePath, `\n=== Test: ${testName} ===\n`);
32
+ appendFileSync(
33
+ this.filePath,
34
+ padColumns('TIME', 'ELU', 'EL_DLY_P50', 'EL_DLY_P99', 'EL_DLY_MAX', 'HEAP_MB') + '\n',
35
+ );
36
+
37
+ this.lastELU = performance.eventLoopUtilization();
38
+ this.histogram.enable();
39
+
40
+ this.timer = setInterval(() => this.sample(), this.intervalMs);
41
+ // Allow the process to exit even if the timer is still running.
42
+ this.timer.unref();
43
+ }
44
+
45
+ /** Stop sampling and write a summary line. */
46
+ stopTest(): void {
47
+ if (!this.timer) {
48
+ return;
49
+ }
50
+
51
+ // Take a final sample before stopping.
52
+ this.sample();
53
+
54
+ clearInterval(this.timer);
55
+ this.timer = undefined;
56
+ this.histogram.disable();
57
+ this.histogram.reset();
58
+
59
+ this.writeSummary();
60
+
61
+ this.lastELU = undefined;
62
+ this.testName = undefined;
63
+ this.testStart = undefined;
64
+ this.eluSamples = [];
65
+ }
66
+
67
+ /** Alias for stopTest — call on process exit to flush any remaining data. */
68
+ stop(): void {
69
+ this.stopTest();
70
+ }
71
+
72
+ private sample(): void {
73
+ const newELU = performance.eventLoopUtilization();
74
+ const delta = performance.eventLoopUtilization(newELU, this.lastELU);
75
+ this.lastELU = newELU;
76
+
77
+ const elu = delta.utilization;
78
+ this.eluSamples.push(elu);
79
+
80
+ const p50 = this.histogram.percentile(50) / NANOS_PER_MS;
81
+ const p99 = this.histogram.percentile(99) / NANOS_PER_MS;
82
+ const max = this.histogram.max / NANOS_PER_MS;
83
+ const heapMb = Math.round(process.memoryUsage().heapUsed / (1024 * 1024));
84
+
85
+ const now = new Date();
86
+ const time = [now.getHours(), now.getMinutes(), now.getSeconds()].map(n => String(n).padStart(2, '0')).join(':');
87
+
88
+ const line = padColumns(
89
+ time,
90
+ elu.toFixed(2),
91
+ `${p50.toFixed(1)}ms`,
92
+ `${p99.toFixed(1)}ms`,
93
+ `${max.toFixed(1)}ms`,
94
+ String(heapMb),
95
+ );
96
+ appendFileSync(this.filePath, line + '\n');
97
+
98
+ // Reset histogram so next sample only reflects the new interval.
99
+ this.histogram.reset();
100
+ }
101
+
102
+ private writeSummary(): void {
103
+ if (this.eluSamples.length === 0 || this.testStart === undefined) {
104
+ return;
105
+ }
106
+
107
+ const mean = this.eluSamples.reduce((a, b) => a + b, 0) / this.eluSamples.length;
108
+ const maxElu = Math.max(...this.eluSamples);
109
+ const sorted = [...this.eluSamples].sort((a, b) => a - b);
110
+ const p90Elu = sorted[Math.floor(sorted.length * 0.9)] ?? maxElu;
111
+ const durationS = ((performance.now() - this.testStart) / 1000).toFixed(1);
112
+
113
+ let summary = `--- Summary: mean_elu=${mean.toFixed(2)} max_elu=${maxElu.toFixed(2)} p90_elu=${p90Elu.toFixed(2)} duration=${durationS}s`;
114
+ if (maxElu > 0.85) {
115
+ summary += ' WARNING:ELU>0.85';
116
+ }
117
+ summary += ' ---\n';
118
+
119
+ appendFileSync(this.filePath, summary);
120
+ }
121
+ }
122
+
123
+ function padColumns(...cols: string[]): string {
124
+ const widths = [11, 7, 12, 12, 12, 8];
125
+ return cols.map((col, i) => col.padEnd(widths[i] ?? 10)).join('');
126
+ }
@@ -7,6 +7,16 @@ export const shouldCollectMetrics = () => {
7
7
  return undefined;
8
8
  };
9
9
 
10
+ /** Returns the boot node UDP port from environment variable or default value. */
11
+ export function getBootNodeUdpPort(): number {
12
+ return process.env.BOOT_NODE_UDP_PORT ? parseInt(process.env.BOOT_NODE_UDP_PORT, 10) : 4500;
13
+ }
14
+
15
+ /** Returns the anvil port from environment variable or default value. */
16
+ export function getAnvilPort(): number {
17
+ return process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT, 10) : 8545;
18
+ }
19
+
10
20
  export const TEST_PEER_CHECK_INTERVAL_MS = 1000;
11
21
  export const TEST_MAX_PENDING_TX_POOL_COUNT = 10_000; // Number of max pending TXs ~ 1.56GB
12
22
 
@@ -69,8 +69,10 @@ export async function cleanupHADatabase(pool: Pool, logger?: Logger): Promise<vo
69
69
  try {
70
70
  // Drop all HA tables
71
71
  await pool.query('DROP TABLE IF EXISTS validator_duties CASCADE');
72
- await pool.query('DROP TABLE IF EXISTS slashing_protection CASCADE');
73
72
  await pool.query('DROP TABLE IF EXISTS schema_version CASCADE');
73
+ // Drop migration tracking table (node-pg-migrate uses 'pgmigrations' by default)
74
+ // This ensures migrations will run fresh on next startup
75
+ await pool.query('DROP TABLE IF EXISTS pgmigrations CASCADE');
74
76
 
75
77
  logger?.info('HA database cleaned up successfully');
76
78
  } catch (error) {