diff --git a/kimchi/src/circuits/berkeley_columns.rs b/kimchi/src/circuits/berkeley_columns.rs index 8534221b3c..3adf2b05fc 100644 --- a/kimchi/src/circuits/berkeley_columns.rs +++ b/kimchi/src/circuits/berkeley_columns.rs @@ -138,6 +138,12 @@ impl ColumnEvaluations Index(GateType::Rot64) => self .rot_selector .ok_or(ExprError::MissingIndexEvaluation(col)), + Index(GateType::KeccakRound) => self + .keccak_round_selector + .ok_or(ExprError::MissingIndexEvaluation(col)), + Index(GateType::KeccakSponge) => self + .keccak_sponge_selector + .ok_or(ExprError::MissingIndexEvaluation(col)), Permutation(i) => Ok(self.s[i]), Coefficient(i) => Ok(self.coefficients[i]), LookupKindIndex(LookupPattern::Xor) => self diff --git a/kimchi/src/tests/keccak.rs b/kimchi/src/tests/keccak.rs index bfc5f212c0..bbc742ff2c 100644 --- a/kimchi/src/tests/keccak.rs +++ b/kimchi/src/tests/keccak.rs @@ -322,6 +322,32 @@ fn test_random_block() { assert_eq!(claim_random, hash_random); } +#[test] +// Tests real data coming from Optimism ~0.5kB (usual length) +fn test_real_data() { + stacker::grow(30 * 1024 * 1024, || { + let (_,claim_random) = test_keccak::( + BigUint::from_hex("f901fba07f306d649f139e38e36aa11151b15076c7d9be1d80d53cecb0592dcffaf9ff20a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944200000000000000000000000000000000000011a0904f7115676e6af6a8fbc1b0c67ca3a15fdbead9d99747efc59a483d4bdeba9ba058dae86929c9eec666972bcd3d9c6be1c7720d499fc96c29834a66b8500fb25ba08f468282575b3a1ccef67b268423ac1c52e9b72ca3bda3cb187069dd45a8443bb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808335a1c28401c9c38082b7298465421f3080a0400fbbb339967dca3f8172b23543a4fb8acd08880c005f3bfa7c9f529eb5312088000000000000000032"), + true); + let hash_random = + BigUint::from_hex("40ffef568cf97bd1a0e66e21ece45861bbd7ce07c121ae3786a5b2e92d02cc32"); + assert_eq!(claim_random, hash_random); + }); +} + +#[test] +// Tests real data of 23KB (max length we saw), needs 177 blocks, ~4600 rows +fn test_23kb() { + stacker::grow(30 * 1024 * 1024, || { + let (_,claim_random) = test_keccak::( + BigUint::from_hex("f95d4b20b95d47f95d4481c5841b39d680834bc1d58080b95ced61018060405262000015600160026000620001d1565b610160523480156200002657600080fd5b5060405162005c4d38038062005c4d833981016040819052620000499162000203565b848484848483838383838383838c808060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f9e5dae0addaf20578aeb5d70341d092b53b4e14480ac5726438fd436df7ba4277f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c8385604051602001620000d9959493929190620002a2565b60408051601f1981840301815282825280516020918201206080526001600160601b031960608a901b1660c052633c9506a360e21b835290516001600160a01b038916965063f2541a8c95506004808401955091935091829003018186803b1580156200014557600080fd5b505afa1580156200015a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000180919062000289565b60e0908152606094851b6001600160601b03199081166101005293851b9093166101205290911b6001600160e01b03191660a0525030901b6101405250620002e79c50505050505050505050505050565b6bffffffff0000000000000000604084901b1667ffffffff00000000602084901b161763ffffffff8216179392505050565b600080600080600060a086880312156200021b578081fd5b85516200022881620002ce565b60208701519095506200023b81620002ce565b60408701519094506200024e81620002ce565b60608701519093506200026181620002ce565b608087015190925063ffffffff811681146200027b578182fd5b809150509295509295909350565b6000602082840312156200029b578081fd5b5051919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6001600160a01b0381168114620002e457600080fd5b50565b60805160a05160e01c60c05160601c60e0516101005160601c6101205160601c6101405160601c610160516158e5620003686000398061079052508061331652508061283a52508061274b525080613ec35250806126be5280613ea2525080610ca4528061165c5280613e76525080611df552806121ce52506158e56000f3fe6080604052600436106102855760003560e01c80639baa45a811610153578063b10a33f4116100cb578063ea7faa611161007f578063f6e0f6a511610064578063f6e0f6a514610713578063fd5f995b14610733578063fe55a3ef1461075357610285565b8063ea7faa61146106e0578063f6274f661461070057610285565b8063d0a55fb0116100b0578063d0a55fb01461068b578063dab400f3146106ab578063dd11d225146106c057610285565b8063b10a33f41461064b578063b4658bfb1461066b57610285565b8063a656186b11610122578063aa77476c11610107578063aa77476c146105dc578063ad354eeb146105fc578063b09f1fb11461062b57610285565b8063a656186b1461059c578063a9ca2907146105bc57610285565b80639baa45a8146105275780639d68d975146105475780639f0434f514610567578063a0edcef51461058757610285565b8063487b5c20116102015780638fd3ab80116101b5578063935c82a41161019a578063935c82a4146104c757806395480889146104e75780639a4f809c1461050757610285565b80638fd3ab80146104925780639240529c146104b457610285565b80636b52a4a8116101e65780636b52a4a8146104255780637d49ec1a1461045257806386a0c8d71461047257610285565b8063487b5c20146103e15780636ae4b4f71461040357610285565b8063346693c5116102585780633cd2f0261161023d5780633cd2f02614610373578063414e4ccf14610393578063438cdfc5146103b457610285565b8063346693c51461032657806337f381d81461035357610285565b8063016a6d651461028a578063031b905c146102c05780630f0e8cf7146102d55780631fb09795146102f7575b600080fd5b34801561029657600080fd5b506102aa6102a5366004614b9f565b610773565b6040516102b79190615080565b60405180910390f35b3480156102cc57600080fd5b506102aa61078e565b3480156102e157600080fd5b506102f56102f0366004614691565b6107b2565b005b34801561030357600080fd5b506103176103123660046149c6565b610862565b6040516102b793929190615643565b34801561033257600080fd5b50610346610341366004614b9f565b61097a565b6040516102b79190615635565b34801561035f57600080fd5b5061031761036e366004614bbb565b610a33565b34801561037f57600080fd5b506102f561038e366004614622565b610b33565b6103a66103a1366004614a6f565b610b66565b6040516102b792919061578e565b3480156103c057600080fd5b506103d46103cf366004614bf1565b610c10565b6040516102b79190615771565b3480156103ed57600080fd5b506103f6610ca2565b6040516102b791906157bf565b34801561040f57600080fd5b50610418610cc6565b6040516102b791906152bd565b34801561043157600080fd5b50610445610440366004614427565b610cff565b6040516102b79190615075565b34801561045e57600080fd5b506102f561046d3660046149aa565b610d4d565b34801561047e57600080fd5b506102f561048d366004614691565b610dce565b34801561049e57600080fd5b506104a7610e6f565b6040516102b79190615202565b6103d46104c2366004614a24565b61138d565b3480156104d357600080fd5b506102f56104e2366004614523565b611450565b3480156104f357600080fd5b506103466105023660046149aa565b611477565b34801561051357600080fd5b506102f561052236600461496a565b611503565b34801561053357600080fd5b506102f56105423660046147a0565b61150f565b34801561055357600080fd5b50610346610562366004614ae2565b61153f565b34801561057357600080fd5b506102f561058236600461445f565b6115cc565b34801561059357600080fd5b506103f661165a565b3480156105a857600080fd5b506103a66105b7366004614c31565b61167e565b3480156105c857600080fd5b506102f56105d736600461496a565b6116c1565b3480156105e857600080fd5b506103a66105f7366004614bf1565b6117b7565b34801561060857600080fd5b5061061c61061736600461483f565b6117e6565b6040516102b793929190614fd6565b34801561063757600080fd5b506102f5610646366004614573565b611a4c565b34801561065757600080fd5b506102f5610666366004614523565b611b65565b34801561067757600080fd5b5061061c61068636600461470b565b611b8c565b34801561069757600080fd5b506102f56106a636600461496a565b611de7565b3480156106b757600080fd5b506102aa611df3565b3480156106cc57600080fd5b506102aa6106db3660046149aa565b611e17565b3480156106ec57600080fd5b506102f56106fb3660046144f6565b611e25565b6103a661070e366004614a24565b611ec1565b34801561071f57600080fd5b506102f561072e3660046148a1565b611f5f565b34801561073f57600080fd5b506102f561074e36600461445f565b611f8f565b34801561075f57600080fd5b506102f561076e366004614b9f565b612016565b600061078661078183612093565b6121ca565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b815183511480156107c4575080518351145b610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906153e8565b60405180910390fd5b60005b835181101561085c576108543385838151811061081f57fe5b602002602001015185848151811061083357fe5b602002602001015185858151811061084757fe5b602002602001015161221c565b600101610806565b50505050565b61086a614064565b60008061087685611477565b92506109076040518060a001604052808760a0015173ffffffffffffffffffffffffffffffffffffffff168152602001876000015173ffffffffffffffffffffffffffffffffffffffff16815260200187604001516fffffffffffffffffffffffffffffffff16815260200187606001516fffffffffffffffffffffffffffffffff16815260200185815250612304565b83519092506000906109279061092236889003880188614c8e565b61242d565b90508073ffffffffffffffffffffffffffffffffffffffff168660a0015173ffffffffffffffffffffffffffffffffffffffff16148061097057506109708660a0015182610cff565b9150509250925092565b610982614064565b61098b82610773565b8152600061099761257e565b608084015173ffffffffffffffffffffffffffffffffffffffff9081166000908152600392909201602090815260408084208751841685528252808420828801519093168452919052908190205490840151610100850151610120860151929350610a0692859291908561258b565b60c083015173ffffffffffffffffffffffffffffffffffffffff16610a2d57600060208301525b50919050565b610a3b614064565b600080610a478561097a565b9250610ad86040518060a00160405280876080015173ffffffffffffffffffffffffffffffffffffffff168152602001876000015173ffffffffffffffffffffffffffffffffffffffff16815260200187604001516fffffffffffffffffffffffffffffffff16815260200187606001516fffffffffffffffffffffffffffffffff16815260200185815250612304565b91506000610aea84600001518661242d565b90508073ffffffffffffffffffffffffffffffffffffffff16866080015173ffffffffffffffffffffffffffffffffffffffff1614806109705750610970866080015182610cff565b60005b81811015610b6157610b59838383818110610b4d57fe5b9050602002013561267e565b600101610b36565b505050565b600080333014610b8157610b81610b7c336128cc565b612984565b610b8961408d565b610bf66040518060a001604052808a8152602001898152602001886fffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681525061298c565b602081015160409091015190999098509650505050505050565b6000610c1a61408d565b610c2685858533612d53565b9050826fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff161015610c9657610c96610b7c610c6787610773565b83602001516fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff1661309f565b60400151949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040518060400160405280600b81526020017f4c696d69744f726465727300000000000000000000000000000000000000000081525081565b6000610d0961257e565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260059290920160209081526040808420928616845291905290205460ff1690505b92915050565b6000610d5882611e17565b90508160a0015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610da55750610da38260a0015133610cff565b155b15610dbc57610dbc610b7c82338560a0015161315d565b610dca818360a00151613195565b5050565b81518351148015610de0575080518351145b610e16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906153e8565b60005b835181101561085c57610e6733858381518110610e3257fe5b6020026020010151858481518110610e4657fe5b6020026020010151858581518110610e5a57fe5b6020026020010151613208565b600101610e19565b6000610e9a7f3cd2f026000000000000000000000000000000000000000000000000000000006132e0565b610ec37ff6274f66000000000000000000000000000000000000000000000000000000006132e0565b610eec7faa77476c000000000000000000000000000000000000000000000000000000006132e0565b610f157f9240529c000000000000000000000000000000000000000000000000000000006132e0565b610f3e7f438cdfc5000000000000000000000000000000000000000000000000000000006132e0565b610f677f414e4ccf000000000000000000000000000000000000000000000000000000006132e0565b610f907fa656186b000000000000000000000000000000000000000000000000000000006132e0565b610fb97f7d49ec1a000000000000000000000000000000000000000000000000000000006132e0565b610fe27ffe55a3ef000000000000000000000000000000000000000000000000000000006132e0565b61100b7f9baa45a8000000000000000000000000000000000000000000000000000000006132e0565b6110347ff6e0f6a5000000000000000000000000000000000000000000000000000000006132e0565b61105d7fd0a55fb0000000000000000000000000000000000000000000000000000000006132e0565b6110867fb10a33f4000000000000000000000000000000000000000000000000000000006132e0565b6110af7f86a0c8d7000000000000000000000000000000000000000000000000000000006132e0565b6110d87f9f0434f5000000000000000000000000000000000000000000000000000000006132e0565b6111017f9a4f809c000000000000000000000000000000000000000000000000000000006132e0565b61112a7f935c82a4000000000000000000000000000000000000000000000000000000006132e0565b6111537f0f0e8cf7000000000000000000000000000000000000000000000000000000006132e0565b61117c7ffd5f995b000000000000000000000000000000000000000000000000000000006132e0565b6111a57f95480889000000000000000000000000000000000000000000000000000000006132e0565b6111ce7f346693c5000000000000000000000000000000000000000000000000000000006132e0565b6111f77fdd11d225000000000000000000000000000000000000000000000000000000006132e0565b6112207f016a6d65000000000000000000000000000000000000000000000000000000006132e0565b6112497f487b5c20000000000000000000000000000000000000000000000000000000006132e0565b6112727fb09f1fb1000000000000000000000000000000000000000000000000000000006132e0565b61129b7f1fb09795000000000000000000000000000000000000000000000000000000006132e0565b6112c47f37f381d8000000000000000000000000000000000000000000000000000000006132e0565b6112ed7fb4658bfb000000000000000000000000000000000000000000000000000000006132e0565b6113167fad354eeb000000000000000000000000000000000000000000000000000000006132e0565b61133f7fea7faa61000000000000000000000000000000000000000000000000000000006132e0565b6113687f6b52a4a8000000000000000000000000000000000000000000000000000000006132e0565b507f2c64c5ef0000000000000000000000000000000000000000000000000000000090565b600061139761408d565b6114046040518060a00160405280878152602001868152602001856fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681525061298c565b9050826fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff16101561144557611445610b7c610c6787611e17565b8051610c969061336c565b61145a8433610cff565b61146b5761146b610b7c853361340f565b61085c8484848461221c565b61147f614064565b61148882611e17565b8152600061149461257e565b60a084015173ffffffffffffffffffffffffffffffffffffffff9081166000908152600292909201602090815260408084208751841685528252808420828801519093168452919052908190205490840151610140850151610160860151929350610a2d92859291908561258b565b610b613384848461221c565b60005b8151811015610dca5761153782828151811061152a57fe5b6020026020010151610d4d565b600101611512565b611547614064565b61155083611e17565b8152600061155c61257e565b60a085015173ffffffffffffffffffffffffffffffffffffffff90811660009081526002929092016020908152604080842088518416855282528084208289015190931684529190529020546101408501516101608601519192506115c591849186918561258b565b5092915050565b815183511480156115de575080518351145b611614576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906153e8565b61161e8433610cff565b61162f5761162f610b7c853361340f565b60005b83518110156116535761164b85858381518110610e3257fe5b600101611632565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008033301461169457611694610b7c336128cc565b61169c61408d565b6116a887878787612d53565b6020810151604090910151909890975095505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316301415611711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa90615445565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063a9059cbb906117659085908590600401614fb0565b602060405180830381600087803b15801561177f57600080fd5b505af1158015611793573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190614932565b6000806117c261408d565b6117ce86868633612d53565b60208101516040909101519097909650945050505050565b60608080858414611823576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa9061532e565b8567ffffffffffffffff8111801561183a57600080fd5b5060405190808252806020026020018201604052801561187457816020015b611861614064565b8152602001906001900390816118595790505b5092508567ffffffffffffffff8111801561188e57600080fd5b506040519080825280602002602001820160405280156118b8578160200160208202803683370190505b5091508567ffffffffffffffff811180156118d257600080fd5b506040519080825280602002602001820160405280156118fc578160200160208202803683370190505b50905060005b86811015611a4157306337f381d889898481811061191c57fe5b9050610140020188888581811061192f57fe5b9050608002016040518363ffffffff1660e01b8152600401611952929190615679565b60c06040518083038186803b15801561196a57600080fd5b505afa9250505080156119b8575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526119b591810190614b10565b60015b6119c157611a39565b828785815181106119ce57fe5b6020026020010181905250818685815181106119e657fe5b60200260200101906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505080858581518110611a2557fe5b911515602092830291909101909101525050505b600101611902565b509450945094915050565b333214611a85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa9061538b565b6000611a8f61257e565b905060005b8351811015611b245733600090815260048301602052604081208551859290879085908110611abf57fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101611a94565b507f02dfead5eb769b298e82dd9650b31c40559a3d42701dbf53c931bc2682847c31338484604051611b5893929190614ee0565b60405180910390a1505050565b611b6f8433610cff565b611b8057611b80610b7c853361340f565b61085c84848484613208565b60608080858414611bc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa9061532e565b8567ffffffffffffffff81118015611be057600080fd5b50604051908082528060200260200182016040528015611c1a57816020015b611c07614064565b815260200190600190039081611bff5790505b5092508567ffffffffffffffff81118015611c3457600080fd5b50604051908082528060200260200182016040528015611c5e578160200160208202803683370190505b5091508567ffffffffffffffff81118015611c7857600080fd5b50604051908082528060200260200182016040528015611ca2578160200160208202803683370190505b50905060005b86811015611a415730631fb09795898984818110611cc257fe5b90506101800201888885818110611cd557fe5b9050608002016040518363ffffffff1660e01b8152600401611cf89291906154ff565b60c06040518083038186803b158015611d1057600080fd5b505afa925050508015611d5e575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d5b91810190614b10565b60015b611d6757611ddf565b82878581518110611d7457fe5b602002602001018190525081868581518110611d8c57fe5b60200260200101906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505080858581518110611dcb57fe5b911515602092830291909101909101525050505b600101611ca8565b610b6133848484613208565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610786610781836134ca565b6000611e2f61257e565b336000818152600583016020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515179055519192507f6ea9dbe8b2cc119348716a9220a0742ad62b7884ecb0ff4b32cd508121fd937991611b58919086908690614eaf565b600080611ecc61408d565b611f396040518060a00160405280888152602001878152602001866fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681525061298c565b9050611f48816000015161336c565b602081015160409091015190969095509350505050565b60005b8151811015610dca57611f87828281518110611f7a57fe5b6020026020010151612016565b600101611f62565b81518351148015611fa1575080518351145b611fd7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906153e8565b611fe18433610cff565b611ff257611ff2610b7c853361340f565b60005b83518110156116535761200e8585838151811061081f57fe5b600101611ff5565b600061202182610773565b9050816080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561206e575061206c826080015133610cff565b155b1561208557612085610b7c8233856080015161315d565b610dca818360800151613195565b60006040517fe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da98152825173ffffffffffffffffffffffffffffffffffffffff166020820152602083015173ffffffffffffffffffffffffffffffffffffffff16604082015260408301516fffffffffffffffffffffffffffffffff16606082015260608301516fffffffffffffffffffffffffffffffff166080820152608083015173ffffffffffffffffffffffffffffffffffffffff1660a082015260a083015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c083015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e083015161010082015261010083015167ffffffffffffffff166101208201526101208301516101408201526101608120915050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016121ff929190614e24565b604051602081830303815290604052805190602001209050919050565b600061222661257e565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600383016020908152604080832089851684528252808320938816835292905220549091508281111561227d5761227d610b7c8483613641565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526003840160209081526040808320898516845282528083209388168352929052819020849055517ffe7ffb1edfe79f4df716cb2dcad21cf2f31b104d816a7976ba1e6e4653c1efb1906122f4908890889088908890614f79565b60405180910390a1505050505050565b600081604001516fffffffffffffffffffffffffffffffff166000148061233f575060608201516fffffffffffffffffffffffffffffffff16155b1561234c57506000610789565b6001826080015160200151600481111561236257fe5b1461236f57506000610789565b60006123c88360800151604001518460600151036fffffffffffffffffffffffffffffffff1684606001516fffffffffffffffffffffffffffffffff1685604001516fffffffffffffffffffffffffffffffff16613677565b90506123e5816123e085602001518660000151613695565b6137c7565b90506124266124218285604001516fffffffffffffffffffffffffffffffff1686606001516fffffffffffffffffffffffffffffffff166137dd565b613801565b9392505050565b6000612439838361382d565b60028251600381111561244857fe5b14156124b0576001838360200151846040015185606001516040516000815260200160405260405161247d94939291906151e4565b6020604051602081039080840390855afa15801561249f573d6000803e3d6000fd5b505050602060405103519050612555565b6003825160038111156124bf57fe5b14156125555760007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005283601c52603c60002090506001818460200151856040015186606001516040516000815260200160405260405161252594939291906151e4565b6020604051602081039080840390855afa158015612547573d6000803e3d6000fd5b505050602060405103519150505b73ffffffffffffffffffffffffffffffffffffffff8116610d4757610d47610b7c6005856138d9565b600080610d47600761390f565b600061259561257e565b865160009081526020829052604090819020546fffffffffffffffffffffffffffffffff808216928a01839052929350918716116125ec576020870160025b908160048111156125e157fe5b815250505050611653565b7f800000000000000000000000000000000000000000000000000000000000000081161561261f576020870160036125d4565b504267ffffffffffffffff168467ffffffffffffffff1611612659576020860160045b9081600481111561264f57fe5b8152505050611653565b8282111561266c57602086016003612642565b60016020870181905250505050505050565b6040517f319bed9a00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063319bed9a906126f3908590600401615080565b602060405180830381600087803b15801561270d57600080fd5b505af1158015612721573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612745919061494e565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016127a29190614e5d565b60206040518083038186803b1580156127ba57600080fd5b505afa1580156127ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f29190614ca9565b90506001811115610b61576040517fa3b4a32700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3b4a3279061289590859081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff870190600401614e7e565b600060405180830381600087803b1580156128af57600080fd5b505af11580156128c3573d6000803e3d6000fd5b50505050505050565b60607ff0ec779b0bcda6d84abf99ee2c67647d1100ebbb553a9c2d1c2ba1579592832c826040516024016129009190614e5d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b61299461408d565b61299c614064565b82516129a790611477565b90506001816020015160048111156129bb57fe5b146129e0576129e0610b7c8260000151836020015160048111156129db57fe5b61392a565b825160c0015173ffffffffffffffffffffffffffffffffffffffff1615801590612a425750826060015173ffffffffffffffffffffffffffffffffffffffff16836000015160c0015173ffffffffffffffffffffffffffffffffffffffff1614155b15612a6557612a65610b7c82600001518560600151866000015160c00151613960565b825160e0015173ffffffffffffffffffffffffffffffffffffffff1615801590612ac75750826080015173ffffffffffffffffffffffffffffffffffffffff16836000015160e0015173ffffffffffffffffffffffffffffffffffffffff1614155b15612aea57612aea610b7c82600001518560800151866000015160e00151613998565b6000612afe8260000151856020015161242d565b9050836000015160a0015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612b515750835160a00151612b4f9082610cff565b155b15612b6d578151845160a00151612b6d91610b7c9184906139d0565b5082516101200151612b7e90613a08565b8252604080516101208101825282518152845160a09081015173ffffffffffffffffffffffffffffffffffffffff908116602080850191909152606080890151831685870152885151831681860152885190910151909116608084015286518401516fffffffffffffffffffffffffffffffff9081169284019290925286510151811660c083015285830151811660e083015291830151909116610100820152612c2790613add565b6fffffffffffffffffffffffffffffffff908116604085015290811660208401528351608001511615612cde57612ca982602001516fffffffffffffffffffffffffffffffff168460000151606001516fffffffffffffffffffffffffffffffff168560000151608001516fffffffffffffffffffffffffffffffff16613677565b6fffffffffffffffffffffffffffffffff166060808401829052845160208101519186015161010090910151612cde93613c58565b8051835160a08101516060808701516101008401518451602080870151908a01516040808c0151968c01518c51610120909a015191517fab614d2b738543c0ea21f56347cf696a3a0c42a7cbec3212a5ca22a4dcff21249b612d459b909a999390916150d9565b60405180910390a150919050565b612d5b61408d565b612d63614064565b612d6c8661097a565b9050600181602001516004811115612d8057fe5b14612da057612da0610b7c8260000151836020015160048111156129db57fe5b6000612daa61257e565b60c088015190915073ffffffffffffffffffffffffffffffffffffffff163214801590612e0e575060c087015173ffffffffffffffffffffffffffffffffffffffff166000908152600482016020908152604080832032845290915290205460ff16155b15612e2957612e29610b7c8360000151328a60c00151613d4e565b5060a086015173ffffffffffffffffffffffffffffffffffffffff1615801590612e8357508273ffffffffffffffffffffffffffffffffffffffff168660a0015173ffffffffffffffffffffffffffffffffffffffff1614155b15612e9e57612e9e610b7c8260000151858960a00151613960565b6000612eae82600001518761242d565b9050866080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612efb5750612ef9876080015182610cff565b155b15612f1657612f16610b7c8360000151838a608001516139d0565b5061301b60405180610120016040528083600001518152602001886080015173ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001886000015173ffffffffffffffffffffffffffffffffffffffff168152602001886020015173ffffffffffffffffffffffffffffffffffffffff16815260200188604001516fffffffffffffffffffffffffffffffff16815260200188606001516fffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff16815260200183604001516fffffffffffffffffffffffffffffffff16815250613add565b6fffffffffffffffffffffffffffffffff9081166040808601829052929091166020808601829052845160808b01518b51928c015160e08d015196517f829fa99d94dc4636925b38632e625736a614c154d55006b7ab6bea979c210c329761308e97949693958c95909492909190615159565b60405180910390a150949350505050565b60607f21948612b5ef214ec0508df4901600e07a810a371be76b25d59ade73826e3d978484846040516024016130d7939291906151bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b60607f88b2c08e4a5f57d416ad23dad18c20497ccfe684b1379b28fd564adaf582b80f8484846040516024016130d7939291906150ad565b600061319f61257e565b6000848152602082905260409081902080547f8000000000000000000000000000000000000000000000000000000000000000179055519091507fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba5275390611b589085908590615089565b600061321261257e565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600283016020908152604080832089851684528252808320938816835292905220549091508281111561326957613269610b7c8483613641565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526002840160209081526040808320898516845282528083209388168352929052819020849055517fa91fe7ae62fce669df2c7f880f8c14d178531aae72515558e5c948e37c32a572906122f4908890889088908890614f79565b6040517f6eb224cb0000000000000000000000000000000000000000000000000000000081523090636eb224cb9061333e9084907f00000000000000000000000000000000000000000000000000000000000000009060040161522f565b600060405180830381600087803b15801561335857600080fd5b505af1158015611653573d6000803e3d6000fd5b803411801561337b5750333014155b1561340c57600061338c3483613d86565b905060003373ffffffffffffffffffffffffffffffffffffffff16826040516133b490614e5a565b60006040518083038185875af1925050503d80600081146133f1576040519150601f19603f3d011682016040523d82523d6000602084013e6133f6565b606091505b5050905080610b6157610b61610b7c3384613da5565b50565b60607f84356db366796dc6e2aeb1ad74b631fe4e5ec6a650464da6059e9f95c8810a108383604051602401613445929190614f52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60006040517fce918627cb55462ddbb85e73de69a8b322f2bc88f4507c52fcad6d4c33c29d498152825173ffffffffffffffffffffffffffffffffffffffff166020820152602083015173ffffffffffffffffffffffffffffffffffffffff16604082015260408301516fffffffffffffffffffffffffffffffff16606082015260608301516fffffffffffffffffffffffffffffffff16608082015260808301516fffffffffffffffffffffffffffffffff1660a082015260a083015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c083015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e083015173ffffffffffffffffffffffffffffffffffffffff1661010082015261010083015173ffffffffffffffffffffffffffffffffffffffff1661012082015261012083015161014082015261014083015167ffffffffffffffff166101608201526101608301516101808201526101a08120915050919050565b60607fb12bc7e7d341f4431d6faf05f991ee3b779183e341b24243064e10c886cd187383836040516024016134459291906157b1565b600061368d836136878685613ddb565b90613e0c565b949350505050565b60006124268373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b81526004016136d5929190614f52565b60206040518083038186803b1580156136ed57600080fd5b505afa158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137259190614ca9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906370a0823190613777908790600401614e5d565b60206040518083038186803b15801561378f57600080fd5b505afa1580156137a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e09190614ca9565b60008183106137d65781612426565b5090919050565b600061368d836136876137f1826001613d86565b6137fb8887613ddb565b90613e36565b60006fffffffffffffffffffffffffffffffff82111561382957613829610b7c600384613e52565b5090565b60408101517ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141111580613884575060608101517f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a111155b1561389757613897610b7c6005846138d9565b6000815160038111156138a657fe5b14156138ba576138ba610b7c6003846138d9565b6001815160038111156138c957fe5b1415610dca57610dca610b7c6000845b60607ff18f11f3027e735c758137924b262d4d3aff0037dcd785aca3c699fa05d960bd83836040516024016134459291906152af565b6000608082600981111561391f57fe5b600101901b92915050565b60607f47ab394e41470191eaf9fa542e84ac483a12665fbd616eb8d1c022ced6c9400083836040516024016134459291906151d3565b60607f5d3300180a4547b3e27137be832d3ebf56f1ba5ebb30dd580999c61f77fa63968484846040516024016130d7939291906150ad565b60607f15e6a383bb02d79ee933b927fbecba78cdde16cba84b94a99661f44bcce3b7368484846040516024016130d7939291906150ad565b60607ff13e65d925201525f3d71a731833b19bb26e44cfbd97caf72a366b73866f71248484846040516024016130d7939291906150ad565b600080613a13613e6f565b905080613a24576000915050610789565b6000613a2f84613e9b565b905060008173ffffffffffffffffffffffffffffffffffffffff1683604051613a5790614e5a565b60006040518083038185875af1925050503d8060008114613a94576040519150601f19603f3d011682016040523d82523d6000602084013e613a99565b606091505b5050905080613ad4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906154a2565b50909392505050565b600080613b1b8360e00151613b168561010001518660c001516fffffffffffffffffffffffffffffffff16613ee890919063ffffffff16565b613f49565b9150613b66826fffffffffffffffffffffffffffffffff168460c001516fffffffffffffffffffffffffffffffff168560a001516fffffffffffffffffffffffffffffffff16613677565b90506fffffffffffffffffffffffffffffffff82161580613b9757506fffffffffffffffffffffffffffffffff8116155b15613ba757506000905080613c53565b610100830151613bc9906fffffffffffffffffffffffffffffffff1683613f7c565b6fffffffffffffffffffffffffffffffff16613be361257e565b60000160008560000151815260200190815260200160002081905550613c29836080015184604001518560200151856fffffffffffffffffffffffffffffffff16613c58565b613c53836060015184602001518560400151846fffffffffffffffffffffffffffffffff16613c58565b915091565b73ffffffffffffffffffffffffffffffffffffffff8416301415613ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa90615445565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152816044820152602081606483600073ffffffffffffffffffffffffffffffffffffffff8a165af13d600183511460208210151681151782169150816128c357806000843e8083fd5b60607fc0972f3cc4234ca2091de7e7bc7081494bd29ac280167d66f0d44168973b16348484846040516024016130d7939291906150ad565b600082821115613d9f57613d9f610b7c60028585613fcd565b50900390565b60607fbde95cc2119e0200d80642397198abfcf98e6e4dddd0de9c6320d86252ad40ab8383604051602401613445929190614fb0565b600082613dea57506000610d47565b82820282848281613df757fe5b041461242657612426610b7c60018686613fcd565b600081613e2257613e22610b7c60038585613fcd565b6000828481613e2d57fe5b04949350505050565b60008282018381101561242657612426610b7c60008686613fcd565b606063c996af7b60e01b8383604051602401613445929190615298565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000163a0290565b60006107867f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000084613fec565b6000826fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161115613d9f57613d9f610b7c6002856fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff16613fcd565b6000816fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff16106137d65781612426565b60008282016fffffffffffffffffffffffffffffffff808516908216101561242657612426610b7c6000866fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff165b606063e946c1bb60e01b8484846040516024016130d793929190615277565b604051600090614026907fff0000000000000000000000000000000000000000000000000000000000000090869085908790602001614dc0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b604080516080810190915260008082526020820190815260006020820181905260409091015290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b8035610d4781615854565b600082601f8301126140cf578081fd5b81356140e26140dd826157f7565b6157d0565b81815291506020808301908481018184028601820187101561410357600080fd5b60005b8481101561412b57813561411981615854565b84529282019290820190600101614106565b505050505092915050565b60008083601f840112614147578182fd5b50813567ffffffffffffffff81111561415e578182fd5b60208301915083602060808302850101111561417957600080fd5b9250929050565b600082601f830112614190578081fd5b813561419e6140dd826157f7565b8181529150602080830190848101818402860182018710156141bf57600080fd5b60005b8481101561412b578135845292820192908201906001016141c2565b8035610d4781615876565b60006101808083850312156141fc578182fd5b614205816157d0565b91505061421283836140b4565b815261422183602084016140b4565b602082015261423383604084016143f3565b604082015261424583606084016143f3565b606082015261425783608084016143f3565b60808201526142698360a084016140b4565b60a082015261427b8360c084016140b4565b60c082015261428d8360e084016140b4565b60e08201526101006142a1848285016140b4565b9082015261012082810135908201526101406142bf848285016143fe565b818301525061016080830135818301525092915050565b60006101408083850312156142e9578182fd5b6142f2816157d0565b9150506142ff83836140b4565b815261430e83602084016140b4565b602082015261432083604084016143f3565b604082015261433283606084016143f3565b606082015261434483608084016140b4565b60808201526143568360a084016140b4565b60a08201526143688360c084016140b4565b60c082015260e082013560e0820152610100614386848285016143fe565b818301525061012080830135818301525092915050565b6000608082840312156143ae578081fd5b6143b860806157d0565b905081356143c581615884565b81526143d48360208401614416565b6020820152604082013560408201526060820135606082015292915050565b8035610d4781615891565b803567ffffffffffffffff81168114610d4757600080fd5b803560ff81168114610d4757600080fd5b60008060408385031215614439578182fd5b823561444481615854565b9150602083013561445481615854565b809150509250929050565b60008060008060808587031215614474578182fd5b843561447f81615854565b9350602085013567ffffffffffffffff8082111561449b578384fd5b6144a7888389016140bf565b945060408701359150808211156144bc578384fd5b6144c8888389016140bf565b935060608701359150808211156144dd578283fd5b506144ea87828801614180565b91505092959194509250565b60008060408385031215614508578182fd5b823561451381615854565b9150602083013561445481615876565b60008060008060808587031215614538578182fd5b843561454381615854565b9350602085013561455381615854565b9250604085013561456381615854565b9396929550929360600135925050565b60008060408385031215614585578182fd5b823567ffffffffffffffff81111561459b578283fd5b8301601f810185136145ab578283fd5b80356145b96140dd826157f7565b8082825260208083019250808501898283870288010111156145d9578788fd5b8795505b848610156146045780356145f081615854565b8452600195909501949281019281016145dd565b5081965061461489828a016141de565b955050505050509250929050565b60008060208385031215614634578182fd5b823567ffffffffffffffff8082111561464b578384fd5b818501915085601f83011261465e578384fd5b81358181111561466c578485fd5b866020808302850101111561467f578485fd5b60209290920196919550909350505050565b6000806000606084860312156146a5578081fd5b833567ffffffffffffffff808211156146bc578283fd5b6146c8878388016140bf565b945060208601359150808211156146dd578283fd5b6146e9878388016140bf565b935060408601359150808211156146fe578283fd5b5061097086828701614180565b60008060008060408587031215614720578182fd5b843567ffffffffffffffff80821115614737578384fd5b818701915087601f83011261474a578384fd5b813581811115614758578485fd5b8860206101808302850101111561476d578485fd5b602092830196509450908601359080821115614787578384fd5b5061479487828801614136565b95989497509550505050565b600060208083850312156147b2578182fd5b823567ffffffffffffffff8111156147c8578283fd5b8301601f810185136147d8578283fd5b80356147e66140dd826157f7565b81815283810190838501610180808502860187018a1015614805578788fd5b8795505b848610156148315761481b8a836141e9565b8452600195909501949286019290810190614809565b509098975050505050505050565b60008060008060408587031215614854578182fd5b843567ffffffffffffffff8082111561486b578384fd5b818701915087601f83011261487e578384fd5b81358181111561488c578485fd5b8860206101408302850101111561476d578485fd5b600060208083850312156148b3578182fd5b823567ffffffffffffffff8111156148c9578283fd5b8301601f810185136148d9578283fd5b80356148e76140dd826157f7565b81815283810190838501610140808502860187018a1015614906578788fd5b8795505b848610156148315761491c8a836142d6565b845260019590950194928601929081019061490a565b600060208284031215614943578081fd5b815161242681615876565b60006020828403121561495f578081fd5b815161242681615854565b60008060006060848603121561497e578081fd5b833561498981615854565b9250602084013561499981615854565b929592945050506040919091013590565b600061018082840312156149bc578081fd5b61242683836141e9565b6000808284036102008112156149da578283fd5b6149e485856141e9565b925060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8082011215614a15578182fd5b50610180830190509250929050565b60008060006102208486031215614a39578081fd5b614a4385856141e9565b9250614a5385610180860161439d565b9150610200840135614a6481615891565b809150509250925092565b60008060008060006102608688031215614a87578283fd5b614a9187876141e9565b9450614aa187610180880161439d565b9350610200860135614ab281615891565b9250610220860135614ac381615854565b9150610240860135614ad481615854565b809150509295509295909350565b6000806101a08385031215614af5578182fd5b614aff84846141e9565b915061018083013561445481615891565b600080600083850360c0811215614b25578182fd5b6080811215614b32578182fd5b50614b3d60806157d0565b84518152602085015160058110614b52578283fd5b60208201526040850151614b6581615891565b60408201526060850151614b7881615891565b60608201526080850151909350614b8e81615891565b60a0850151909250614a6481615876565b60006101408284031215614bb1578081fd5b61242683836142d6565b6000806101c08385031215614bce578182fd5b614bd884846142d6565b9150614be884610140850161439d565b90509250929050565b60008060006101e08486031215614c06578081fd5b614c1085856142d6565b9250614c2085610140860161439d565b91506101c0840135614a6481615891565b6000806000806102008587031215614c47578182fd5b614c5186866142d6565b9350614c6186610140870161439d565b92506101c0850135614c7281615891565b91506101e0850135614c8381615854565b939692955090935050565b600060808284031215614c9f578081fd5b612426838361439d565b600060208284031215614cba578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015614d0c578151151587529582019590820190600101614cee565b509495945050505050565b80518252602081015160058110614d2a57fe5b60208301526040818101516fffffffffffffffffffffffffffffffff9081169184019190915260609182015116910152565b8035614d6781615884565b614d708161584a565b82526040810160ff614d858260208501614416565b166020840152356040830152606090810135910152565b6fffffffffffffffffffffffffffffffff169052565b67ffffffffffffffff169052565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152901515604082015260600190565b60006060820173ffffffffffffffffffffffffffffffffffffffff808716845260206060818601528287518085526080870191508289019450855b81811015614f39578551851683529483019491830191600101614f1b565b5050809450505050508215156040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60608082528451908201819052600090608090818401906020808901855b8381101561501757615007858351614d17565b9385019390820190600101614ff4565b50508583038187015287518084529281019350878101929150845b8281101561505557615045858551614d9c565b9381019392810192600101615032565b50505050828103604084015261506b8185614cdb565b9695505050505050565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b9a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015297891660408b015295881660608a015293871660808901529190951660a08701526fffffffffffffffffffffffffffffffff94851660c0870152841660e08601529092166101008401526101208301919091526101408201526101600190565b97885273ffffffffffffffffffffffffffffffffffffffff968716602089015294861660408801529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a085015290911660c083015260e08201526101000190565b9283526020830191909152604082015260600190565b91825260ff16602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b606081016152848561584a565b938152602081019290925260409091015290565b604081016152a58461584a565b9281526020015290565b60408101600684106152a557fe5b6000602080835283518082850152825b818110156152e9578581018301518582016040015282016152cd565b818111156152fa5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6020808252602c908201527f4e61746976654f7264657273466561747572652f4d49534d4154434845445f4160408201527f525241595f4c454e475448530000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f4e61746976654f7264657273466561747572652f4e4f5f434f4e54524143545f60408201527f4f524947494e5300000000000000000000000000000000000000000000000000606082015260800190565b60208082526038908201527f4e61746976654f7264657273466561747572652f4d49534d4154434845445f5060408201527f4149525f4f52444552535f41525241595f4c454e475448530000000000000000606082015260800190565b60208082526024908201527f466978696e546f6b656e5370656e6465722f43414e4e4f545f494e564f4b455f60408201527f53454c4600000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f466978696e50726f746f636f6c466565732f45544845525f5452414e5346455260408201527f5f46414c49454400000000000000000000000000000000000000000000000000606082015260800190565b61020081016020840161551b8361551683886140b4565b614cc1565b6155258186615817565b90506155346020840182614cc1565b506155426040850185615824565b61554f6040840182614d9c565b5061555d6060850185615824565b61556a6060840182614d9c565b506155786080850185615824565b6155856080840182614d9c565b5061559360a0850185615817565b6155a060a0840182614cc1565b506155ae60c0850185615817565b6155bb60c0840182614cc1565b506155c960e0850185615817565b6155d660e0840182614cc1565b506101006155e681860186615817565b6155f282850182614cc1565b5050610120848101359083015261014061560e81860186615831565b61561a82850182614db2565b50506101608481013590830152612426610180830184614d5c565b60808101610d478284614d17565b60c081016156518286614d17565b6fffffffffffffffffffffffffffffffff8416608083015282151560a0830152949350505050565b6101c08101602084016156908361551683886140b4565b61569a8186615817565b90506156a96020840182614cc1565b506156b76040850185615824565b6156c46040840182614d9c565b506156d26060850185615824565b6156df6060840182614d9c565b506156ed6080850185615817565b6156fa6080840182614cc1565b5061570860a0850185615817565b61571560a0840182614cc1565b5061572360c0850185615817565b61573060c0840182614cc1565b5060e084013560e083015261010061574a81860186615831565b61575682850182614db2565b50506101208481013590830152612426610140830184614d5c565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156157ef57600080fd5b604052919050565b600067ffffffffffffffff82111561580d578081fd5b5060209081020190565b6000823561242681615854565b6000823561242681615891565b6000823567ffffffffffffffff81168114612426578182fd5b6004811061340c57fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461340c57600080fd5b801515811461340c57600080fd5b6004811061340c57600080fd5b6fffffffffffffffffffffffffffffffff8116811461340c57600080fdfea2646970667358221220c1309e763ac6ee22e1adc45a58047b9e39256df4e7db06c957ec2dd05ca1735664736f6c634300060c0033000000000000000000000000460b27a8946a0a38cc2243159a82b09670f8fd3a0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b39e2f2309e9a4f318543ef3f2a95262b605dce00000000000000000000000000000000000000000000000000000000000000008401546d72a091134d5c7b4107cdd6d7e144b7be02c3f894d4bd642d66f87bab239376dca569a05b719dcd57148d639d80f28b1f5858578b049516f73f4e298f23c2c277d14c68"), + true); + let hash_random = + BigUint::from_hex("9bd73d7047eef2ab99127d1ce1b52a7fa4af3f596e23cf510ce8957c60e3deea"); + assert_eq!(claim_random, hash_random); + }); +} + #[test] // Test hash of message zero with 1 byte fn test_blocks() { diff --git a/kimchi/src/verifier.rs b/kimchi/src/verifier.rs index 345f51d8f9..36b03eb3cd 100644 --- a/kimchi/src/verifier.rs +++ b/kimchi/src/verifier.rs @@ -1042,6 +1042,18 @@ where .as_ref() .map(|_| Column::Index(GateType::Rot64)), ) + .chain( + verifier_index + .keccak_round_comm + .as_ref() + .map(|_| Column::Index(GateType::KeccakRound)), + ) + .chain( + verifier_index + .keccak_sponge_comm + .as_ref() + .map(|_| Column::Index(GateType::KeccakSponge)), + ) //~~ * lookup commitments //~ .chain(