From 06bd79b0669c0a8a4d09c0da1c967afe012aef57 Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 17:23:34 +0000 Subject: [PATCH] Withdraw context words read their own column or revert withdraw4 post tasks get the withdraw values (plus msg.sender as the withdrawer row) in a dedicated calling context column 6; every other column is empty, so withdraw words read outside withdraw tasks revert out of bounds. Signers move to column 7 and signed context to 8. Co-Authored-By: Claude Opus 5.5 --- crates/test_fixtures/abis/RaindexV6.json | 2 +- .../abis/RaindexV6SubParser.json | 2 +- meta/RaindexV6SubParser.rain.meta | Bin 1382 -> 1382 bytes .../RaindexV6SubParserAuthoringMeta.rain.meta | Bin 7584 -> 7584 bytes src/concrete/parser/RaindexV6SubParser.sol | 7 +- src/concrete/raindex/RaindexV6.sol | 28 ++-- src/generated/RaindexV6SubParserPointers.sol | 10 +- .../GenericPoolRaindexV6ArbOrderTaker.sol | 10 +- .../GenericPoolRaindexV6FlashBorrower.sol | 10 +- src/generated/candidate/RaindexV6.sol | 8 +- .../candidate/RaindexV6SubParser.sol | 8 +- .../RouteProcessorRaindexV6ArbOrderTaker.sol | 10 +- src/lib/LibRaindex.sol | 13 +- src/lib/LibRaindexSubParser.sol | 54 ++++---- ...dexV6SubParser.operandHandlersWiring.t.sol | 29 ++--- .../parser/RaindexV6SubParser.routing.t.sol | 43 +++--- ...bParser.routingTokenDecimalsAndMasks.t.sol | 18 +-- ...RaindexV6SubParser.wordParsersWiring.t.sol | 123 ++---------------- .../RaindexV6.contextWordEntrypoints.t.sol | 43 ++++-- test/util/lib/LibTestContextWords.sol | 12 ++ 20 files changed, 184 insertions(+), 246 deletions(-) diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index 8983b9be18..e361f7edcc 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2362,7 +2362,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556151c4908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117f6575080631f69cb75146115995780632cb77e9f1461156d5780632fbc4ba0146113f257806341d1514f146113bb5780635cffe9de1461125f57806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611ba7565b6024358281116101825761010c903690600401611ba7565b60c0366043190112610182576101043583811161018257610131903690600401611d4d565b90610124359384116101825761014e61015c943690600401611d4d565b9261015761272d565b612273565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a761187a565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a16565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611849565b919061027861272d565b60405192610285846119fa565b5f84523691611e21565b90612bc5565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611849565b9190604051926102d6846119fa565b5f84528284016102e582611afa565b946102f36040519687611a16565b8286526102ff83611afa565b9361031186880195601f190186612257565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611906565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612137565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a16565b30613a34565b6103ce828a61201d565b526103d9818961201d565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161217f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611849565b9061048d61272d565b6104be6104b96104b46104ad6104a3888061216a565b6040810190612137565b3691611a38565b6139ca565b613a1f565b801561075f576001101561074d57602483016104da8186611f8a565b90501561073b5760448401946104f08682611f8a565b9050156107295761055661051e9661054a61051561050e858061216a565b9585611f8a565b99909285611f8a565b91909261053b604051976105318961192a565b3389523690611a9c565b9a60209b8c8901523691611b12565b60408601523691611b12565b60608301526064850135608083015261056e8261276f565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612085565b0390a101916106158385612137565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e21565b82808080808080610584565b6106866104ad8486612137565b61068f816147bb565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b511693612137565b866040519586958652850152606060408501526060840191611d7c565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611906565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa61272d565b5f80806107bf60048035608481019101611ed3565b9050156110505760246004350135926107d7846127d4565b1561103e576060806040516107eb81611992565b6107f3611f28565b81525f60208201525f6040820152015261080b611f28565b5061086b61086661084561083b61083561082f608460043501600435600401611ed3565b90611f5a565b80611f75565b6040810190611f8a565b602061085e61082f608460043501600435600401611ed3565b013591611fc0565b611d68565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611ed3565b6060810190611f8a565b604061085e61082f608460043501600435600401611ed3565b81604051976108c88961195a565b16875216602086015260408501526108ea608460043501600435600401611ed3565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611ed3565b905081108061102b575b15610e785761093a608460043501600435600401611ed3565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f83611992565b8181013567ffffffffffffffff81116101825761099190369084840101611ba7565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d4d565b606082015280516001600160a01b036109ec604083015160208501519061201d565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b602083015160408401519083613116565b610a248161276f565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119fa565b5f845233918661314b565b925f93610ad1606082015160446004350135906127f7565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b4560408201516127d4565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501612031565b15610d785796610c2b97610c3b60408401516040880151610bdc81836134a4565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e74565b9061402f565b9d8e9260408d015161356f565b60408c0152613599565b99613599565b98610c4684846135c3565b610c508482613621565b60405192338452608060208501526060610c768451608080880152610100870190612085565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c0152613733565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d52858401516060878501526060840190612104565b920151906040818403910152611906565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e74565b60408a0151610dc581836134a4565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161356f565b610dfe90856134cb565b610de7565b905091610dcd565b50610e196060820151613481565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c606083015160408501519061201d565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501612031565b1561102557835b6004356004013590610ea382826134a4565b6110075750508490610ec3856001600160a01b03602087015116336130ad565b505060a46004350190610edb82600435600401612137565b905015159081610fff575b50610f5e575b506001600160a01b03610f02929351163361281e565b50505b8351811015610f2a5780610f24610f1e6001938761201d565b5161390c565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b0385511692600435600401612137565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d7c565b038183335af190811561022c57859115610eec579050610ff091506119ae565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b5061103960408301516127d4565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361108761187a565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf8183611a16565b810103126101825751826110af565b503d6110c5565b34610182576110f3366118ba565b929190936110ff61272d565b61110a8382336127a0565b611113826127d4565b1561122e579161064e9160ff8461112e846111e59733612de0565b61113881856134a4565b15611228575082935b61114d8582843361304f565b9390927f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117e8984336130ad565b93906001600160a01b0360405192338452169a8b60208401528760408401528a6060840152608083015260a0820152a116949594939291906040519660068852602088015260408701526060860152608085015260a084015260c083015260e08201604052565b90806112115760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112209261028f913691611e21565b80808061015c565b93611141565b604051623a3a4d60e21b81523360048201526001600160a01b03919091166024820152604481019290925250606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761128e611890565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761131b9560209216936112dd868587612f70565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d7c565b03815f855af193841561022c575f94611387575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361136e5761136393503091612fe9565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113b3575b816113a360209383611a16565b810103126101825751928461132f565b3d9150611396565b346101825760603660031901126101825760206113ea6113d961187a565b6113e1611890565b60443591612de0565b604051908152f35b3461018257611400366118ba565b9280949261140c61272d565b6114178285336127a0565b611420816127d4565b1561153d578061143461148392863361281e565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a1336128c4565b959093856114b15760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115319661028f956114f89460ff339516939594939291906040519660068852602088015260408701526060860152608085015260a084015260c083015260e08201604052565b9260405193611506856119de565b600585526115166020860161223b565b61151f85611fd0565b5261152984611fd0565b503691611e21565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115e9903690600401611849565b90936115f361272d565b5f946001600160a01b03948561160884611d68565b1633036117d45761162161161c3685611ba7565b61276f565b805f525f60205260405f20966001885414611668575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f60019855604051963388528260208901526060604089015281611694876118a6565b166060890152602484013590606219018112156101825783019060a06080890152806116c2600484016118a6565b166101008901526116d5602483016118a6565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461179d61028f9a60209f61175c906117c79f9a606061014061064e9d0152610160880191611d7c565b61178e61178361176f6044880185611d9c565b605f198a8603810160a08c01529491611dd1565b926064870190611d9c565b918784030160c0880152611dd1565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611637565b6024866117e085611d68565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611838575b5015158152f35b6301ffc9a760e01b14905083611831565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761190291600401611849565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761194657604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761194657604052565b6040810190811067ffffffffffffffff82111761194657604052565b6080810190811067ffffffffffffffff82111761194657604052565b67ffffffffffffffff811161194657604052565b60e0810190811067ffffffffffffffff82111761194657604052565b60c0810190811067ffffffffffffffff82111761194657604052565b6020810190811067ffffffffffffffff82111761194657604052565b90601f8019910116810190811067ffffffffffffffff82111761194657604052565b92919267ffffffffffffffff82116119465760405191611a62601f8201601f191660200184611a16565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a9993359101611a38565b90565b91906060838203126101825760405190611ab58261195a565b8193611ac0816118a6565b8352611ace602082016118a6565b602084015260408101359167ffffffffffffffff831161018257604092611af59201611a7e565b910152565b67ffffffffffffffff81116119465760051b60200190565b929192611b1e82611afa565b604092611b2e6040519283611a16565b819581835260208093019160061b84019381851161018257915b848310611b5757505050505050565b8583830312610182578386918251611b6e81611976565b611b77866118a6565b81528286013583820152815201920191611b48565b9080601f8301121561018257816020611a9993359101611b12565b91909160a0818403126101825760405190611bc18261192a565b8193611bcc826118a6565b835267ffffffffffffffff9160208101358381116101825782611bf0918301611a9c565b602085015260408101358381116101825782611c0d918301611b8c565b6040850152606081013592831161018257611c2e6080939284938301611b8c565b60608501520135910152565b909291611c4684611afa565b916040611c566040519485611a16565b839580855260208095019160059160051b8401948086116101825784935b868510611c85575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cb08161195a565b611cb9836118a6565b81528a83013584811161018257830185601f8201121561018257803590611cdf82611afa565b91611cec89519384611a16565b8083528d808401918b1b83010191888311610182578e809101915b838310611d3d57509150508201528583013593841161018257611d2e858c95869501611a7e565b86820152815201940193611c74565b82358152918101918f9101611d07565b9080601f8301121561018257816020611a9993359101611c3a565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dee575050505090565b909192936001906001600160a01b03611e06876118a6565b16815285830135838201526040908101950193920190611de0565b90929192611e2e81611afa565b91604091611e3f6040519485611a16565b839581855260208095019160051b8301938185116101825783925b858410611e6a5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e9481611976565b82358481116101825786611ea9918501611a9c565b81528983013593841161018257611ec4868b95869501611d4d565b83820152815201930192611e5a565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f168261195a565b60606040835f81525f60208201520152565b60405190611f358261192a565b5f608083828152611f44611f09565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805160041015610e645760a00190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061205d575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161204f565b906080806120fb6120e96120d760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611906565b6040870151868203604088015261203e565b6060860151858203606087015261203e565b93015191015290565b9081518082526020808093019301915f5b828110612123575050505090565b835185529381019392810192600101612115565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b61219661161c61218f8380611f75565b3690611ba7565b5f525f602052600160405f20540361223257806121b68161222293611f75565b61221a6121d56121da6020850135938460408701359384923690611ba7565b613116565b6121f26121e78580611f75565b946060810190611ed3565b929061221260405196612204886119fa565b5f88525f3681373690611ba7565b933691611c3a565b92339261314b565b6040810151606090910151600192565b505f905f905f90565b5f5b60a08110612249575050565b60608282015260200161223d565b5f5b82811061226557505050565b606082820152602001612259565b926001600160a01b038451166001600160a01b038351161461271b576001600160a01b036122a860608601516064359061201d565b515116906040830151916001600160a01b036122c7608435809561201d565b515116148015906126db575b610e1e576040850151906001600160a01b036122f2604435809461201d565b5151166001600160a01b0361230d60643560608a015161201d565b515116146126c95761231e8661276f565b805f525f60205260405f20541561267657506123398461276f565b805f525f60205260405f205415612622575061241c92916123f6917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123a161239361012033845280602085015283018d612085565b82810360408401528a612085565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123e9846119fa565b5f8452606435908a61314b565b936001600160a01b038651166040519261240f846119fa565b5f845260a435908661314b565b9161242a60408201516127d4565b15801561260e575b80156125fb575b80156125e8575b6125d6576040519161245183611992565b5f83525f60208401525f60408401525f606084015261247084836147df565b8452604084015261249661248483866147df565b6020860152806060860152845161356f565b946124aa602085015160408601519061356f565b936124b487613481565b80156125c7575b6125b55761257c6125ae957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461255e6125b39a60a0966124fd8a88516135c3565b61250b8c60208901516135c3565b6125198a6040890151613621565b6125278c6060890151613621565b6125308a61390c565b6125398c61390c565b6001600160a01b0361255560c43592606060643591015161201d565b515116336128c4565b50506001600160a01b0361255560e43592606060a43591015161201d565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613733565b613733565b565b604051630d86822160e01b8152600490fd5b506125d185613481565b6124bb565b6040516321badf1f60e01b8152600490fd5b506125f66060840151613481565b612440565b506126096060820151613481565b612439565b5061261c60408401516127d4565b15612432565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612671565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126f5606085015160a4359061201d565b5151166001600160a01b0361271160408801516044359061201d565b51511614156122d3565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461275d5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161279a8161278c6020820194602086526040830190612085565b03601f198101835282611a16565b51902090565b9091156127ab575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127f3905f60e01d906001600160e01b038160e01d9116601b0b614842565b1290565b906127f3916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c3565b92919261282a82613b07565b9361283481613481565b6128b25784816001600160e01b036128539360e01d9116601b0b614942565b9290809315612889575b5082908161286d575b5050509190565b612881926001600160a01b03309216612fe9565b5f8181612866565b9092505f19811461289e57600101915f61285d565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128d183613481565b61296f57846128ed576128e59394506130ad565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261292a835f20549485613599565b9561293487613481565b612957575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f830112156101825781516020926129c382611afa565b916129d16040519384611a16565b808352848084019160051b830101918683116101825785809101915b838310612a605750505050948281015191821161018257019180601f84011215610182578251612a1c81611afa565b93612a2a6040519586611a16565b818552838086019260051b820101928311610182578301905b828210612a51575050505090565b81518152908301908301612a43565b82518152918101918691016129ed565b90808251908181526020809101926020808460051b8301019501935f915b848310612a9e5750505050505090565b9091929394958480612abc600193601f198682030187528a51612104565b9801930193019194939290612a8e565b91906020928381526001600160a01b0382511684820152838201516040820152612b06604083015160e06060840152610100830190611906565b9060608301516080820152612b2d608084015192601f1993848483030160a0850152612a70565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b7057505050611a9994955060c060e09101519282850301910152612104565b825187529588019591880191600101612b4c565b90604082019082526020606081936040838201528551809452019301915f5b828110612bb1575050505090565b835185529381019392810192600101612ba3565b919091604092835192612bd7846119de565b60058452602094612be986860161223b565b5f5b8451811015612c1e5780612c016001928761201d565b51612c0c828961201d565b52612c17818861201d565b5001612beb565b50925092939093335f52308252825f2091835195612c3b87611976565b612c43611f09565b875260608281980152845190612c58826119fa565b5f8252855190612c67826119fa565b5f82525f3681375f5b8151811015612dd457898688612c86848661201d565b51888151948d80870151908151612ca8575b5050505050505050600101612c70565b905f92916001600160a01b0396612ccd8887818d51169c015116998789015190613be6565b95825199612cda8b6119c2565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612d15600498898301612acc565b03915afa938415612dca579089915f95612da4575b508451612d40575b50899250808e8c938e612c98565b5101511691823b1561018257612d6e925f92838d5180968195829463012c676d60e21b845233908401612b84565b03925af18015612d9a579060019291612d8b575b81928782612d32565b612d94906119ae565b5f612d82565b89513d5f823e3d90fd5b612dc19195503d805f833e612db98183611a16565b810190612988565b9050935f612d2a565b8c513d5f823e3d90fd5b50505050505050509050565b8215612e15576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612e2182613e18565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f37575f97612f41575b5083612e78612e7183612ea89a614af7565b5090614282565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f37575f97612f06575b50612e71612ecc91611a9998614af7565b50612ed781836134a4565b15612efe5750935b5f5260018252825f20905f528152815f20905f8052525f205490613599565b905093612edf565b96508387813d8311612f30575b612f1d8183611a16565b8101031261018257955195612e71612ebb565b503d612f13565b85513d5f823e3d90fd5b96508387813d8311612f69575b612f588183611a16565b810103126101825795519583612e5f565b503d612f4e565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fca575b8360405215612fb457505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fe057813b15153d151616612fa6565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613039575b836040525f60605215612fb457505050565b6001811516612fe057813b15153d151616613027565b9392919361305c83613481565b61296f5784613070576128e593945061281e565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f52815261292a835f2054948561356f565b909291926130ba81613b07565b936130c481613481565b6131045784816001600160e01b036130e39360e01d9116601b0b614942565b508092816130f2575050509190565b6001600160a01b036128819316612f70565b604051632d1671a360e11b8152600490fd5b91613141906060613136936001600160a01b03948591604088015161201d565b51511694015161201d565b515116146126c957565b94919361338a919360c0915f613311604092835194613169866119c2565b613171611f28565b86526020958487820152848682015260609781868a809401528260808201528660a082015201526132c18551916131a7836119de565b600583526131b688840161223b565b8d6131c08161276f565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131f686611fe0565b5261320085611fe0565b50885161320c8161195a565b6002815289368c83013761321f86611fed565b5261322985611fed565b5060ff8a61328c8b8501936132768761324f81613247858a5161201d565b515116613e18565b9751168861325e84895161201d565b5151168561326d858a5161201d565b51015191612de0565b9661328282875161201d565b515116945161201d565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132ca82611ffd565b526132d481611ffd565b506132f88a8d8d60ff8a61328c8d8501936132768761324f81613247858a5161201d565b6133018261200d565b5261330b8161200d565b50613be6565b95878a511697848b0191825191868184511693015116928a85523087528580862091510151865191613342836119fa565b868352875195613351876119c2565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612acc565b03915afa968715613477575f945f98613455575b5084516002811061343e575081838601519501516133c46133be88611fd0565b5161200d565b516133cf81836134a4565b156134365750925b6133f98685919060405192600284526020840152604083015260608201604052565b61340288611ffd565b5261340c87611ffd565b508251996134198b6119c2565b8a52890152870152850152608084015260a083015260c082015290565b9050926133d7565b602490835190630fbb8e5560e21b82526004820152fd5b90975061346d9194503d805f833e612db98183611a16565b939093965f61339e565b50513d5f823e3d90fd5b6134a0905f60e01d906001600160e01b038160e01d9116601b0b614842565b1390565b906134a0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6148c3565b6134f26001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614039565b90637ffffff58213613542575b9061350991614282565b929092158061353a575b61351c57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613513565b61354c8282614f22565b156134ff57604483856040519163d556b11160e01b835260048301526024820152fd5b611a9991610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614488565b611a9991610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61464c565b61361d9160808101826135df6135d98351611fd0565b51611fd0565b526136166136106001600160a01b038094515116936136076136018551611fd0565b51611fe0565b51169251611fd0565b51611ffd565b519161304f565b5050565b906080810191806136356135d9855161200d565b526001600160a01b03809251511691613651613601855161200d565b5116613660613610855161200d565b5190816136fb5761367083613481565b61296f579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612671955f52602090600182526136c6604094855f20835f528452855f20855f528452855f2054613599565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a70565b9161372c917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612671956128c4565b50506136e0565b60c0810151908151915f926138a7575b506137e86020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613790836119fa565b8683528c519361379f856119fa565b8785528d51966137ae886119c2565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612acc565b03915afa94851561389d57879561387f575b50845161380b575b50505050505050565b81905101510151169051813b1561387b57918491849383613840965180978195829463012c676d60e21b845260048401612b84565b03925af1908115613872575061385b575b8080808080613802565b61386582916119ae565b61386f5780613851565b80fd5b513d84823e3d90fd5b8480fd5b6138949195503d8089833e612db98183611a16565b9050935f6137fa565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138ea925f928360405180968195829463012c676d60e21b845260048401612b84565b03925af1801561022c5715613743576139049192506119ae565b5f905f613743565b6080810161391d613610825161200d565b5191821561392a57505050565b6139446136016001600160a01b038093515116935161200d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661397f575b505050505050565b6139a3955f92848452600181528284208685528152828420918452528120556130ad565b5f808080613977565b81156139b6570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110613a12576020810151908051603f19810190811161289e5760051c82116139fe5760016020920160051b010190565b5050604051613a0c816119fa565b5f815290565b50604051613a0c816119fa565b805115613a2f57602001515f1a90565b505f90565b905f8091602081519101845af48080613ab2575b15613a685750506040513d81523d5f602083013e60203d82010160405290565b15613a8f57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613aa0576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a485750813b1515613a48565b60041115613acf57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613b0383613ac5565b0152565b613b0f615010565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bdd575f925f94613ba8575b50613b6583613ac5565b600183141580613b96575b613b7a5750505090565b5163ee07877f60e01b8152918291610725919060048401613ae3565b50613ba083613ac5565b821515613b70565b90809450613bcc9293503d8511613bd6575b613bc48183611a16565b810190614918565b919091925f613b5b565b503d613bba565b513d5f823e3d90fd5b90805191613bf383611afa565b91613c0e604094613c0686519586611a16565b808552611afa565b601f199460209186013686840137835183519095908015613e0d576001613c649101965b6001978891010197613c5b613c468a611afa565b99613c5386519b8c611a16565b808b52611afa565b01848901612257565b85805f9684516002815233878201523086820152606081018652613c878b611fe0565b52613c918a611fe0565b505f925b613dc9575b5050508351613cad575b50505050505090565b85809598979692980181613cc1828961201d565b52613ccc818861201d565b505f925b613cdf575b5085969750613ca4565b8451831015613dc4576001600160a01b03613d5681613cfe868961201d565b51511686613d0c878a61201d565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d4d888b61201d565b51015191614a6e565b15613dac57868098999a928192613d6d878a61201d565b515116613d7a878761201d565b52019385613d88828961201d565b510151613d95868c61201d565b52613da0858b61201d565b50019290989796613cd0565b8951630a57f30960e31b815260048101859052602490fd5b613cd5565b9091968151881015613e04578280910197613de4818461201d565b51613def8a8d61201d565b52613dfa898c61201d565b5001919081613c95565b96829150613c9a565b50613c645f96613c32565b613e20615010565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bdd575f925f94613ba85750613b6583613ac5565b9091939284158215175f14613e8e5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613fc5575b5050613eb181614be7565b93613ebb81614be7565b94613ec68682614c07565b90918215613fb6575f9083986f0785ee10d5da46d900f436a000000000808611613fa8575b50670de0b6b3a7640000808b11613f99575b50633b9aca00808b11613f8a575b50612710808b11613f7c575b5098805b613f6b57508190611902989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614c1a565b60019290920191600a900480613f1b565b60049a04998a930192613f17565b600991939a049901915f613f0b565b601291939a049901915f613efd565b85049950602592505f613eeb565b50929050611902949550614c1a565b5f8212156140195780841361400b575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613ea657909250611902939491614b25565b909250611902939491614b8c565b80841215613fd557909250611902939491614b25565b6135098282614282565b9290918061405f576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461407457505050505f905f90565b61408d9361408191614cd4565b92919490938492614cd4565b909391928461409b88614be7565b916140a586614be7565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061424c575b030191600160ff1b98838a018112155f14614219575050035b5f955f821280614210575b6141f2575b5f8112806141e0575b6141c25786820103966001600160ff1b03881490816141b8575b50806141af575b806141a6575b61418857509061413c9291614e80565b915f811361414f575b5061190293614c1a565b9091604c821361417d5761416691600a0a906139ac565b908115614173575f614145565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261412c565b50828414614126565b905088145f61411f565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614105565b955080870186131561420a5786818703015b956140fc565b5f614204565b505f81136140f7565b89985090920390506001600160ff1b038190038701821361423d57018601946140ec565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140d3565b81156139b6570590565b8082601b82810b8314614477577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614423575b8380820b0361441257507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc840111156143c3575b838060030b03614347575b80841361432b5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156139b6576001600160e01b0391071592614322565b92915f84131561439757509061435d8383614f22565b61437957637ffffffe1901600a0a810290637fffffff9261430d565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361417d576143b691600a0a90614278565b918215614173579261430d565b5f198401808060030b146143d75750614302565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926142b5565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614464576305f5e100600894058094819201955b9150506142b5565b620186a06005940580948192019561445c565b508261430257505050505f90600190565b919291600160ff1b84016144a0576119029350614f3b565b90611902935f039161464c565b919291600160ff1b919080158061463a5750906144c991614cd4565b9490929091905f868585858282138015614631575b614614575b505050508682841860ff1c94860391039081604c0381116145f95701600a0a8082059190846145df575b505081019182821860ff1c11156145d757826001600160ff1b03146145b957905f600192135f1461458a57600a9004915b01925b8115811761454e57509190565b80614567575b50801561455f579190565b505f91508190565b919261457d9203600160ff1b01600a0a90614278565b600160ff1b91905f614554565b600a60037fe666666666666666666666666666666666666666666666666666666666666667920104019161453e565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614541565b81076145ec575b8061450d565b60ff1d600117015f6145e6565b505050919350614607579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144e3565b50835f126144de565b156146455750509190565b9350919050565b939291938415811581811761479d5750509061466791614cd4565b919490829561467882958294614cd4565b8096929491969387868482138015614794575b61477b575b5050505050508682841860ff1c94860391039081604c0381116145f95701600a0a808205919084614761575b505081019182821860ff1c111561475957826001600160ff1b03146145b957905f600192135f1461472a57600a9004915b01925b811581176146fd57509190565b8061470d5750801561455f579190565b600160ff1b936147249291038401600a0a90614278565b5f614554565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146ed565b5090926146f0565b810761476e575b806146bc565b60ff1d600117015f614768565b929b5098509196509450925090505f8080808080614690565b5085841261468b565b93959390929190156147b357505061455f579190565b945092915050565b6008815110613a2f576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614819610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e74565b945193016148288151866127f7565b614830575050565b909350611a99919250519251836134cb565b92915f9060018184145f871287151717176148bc575f928082136148ae575b03604c81135f8212176148a257600a0a90846148808382029384614278565b1461489557505015614891575f9190565b5f90565b9093509015611a99579190565b505015614891575f9190565b5f9560019450925090614861565b5050505f90565b93929190918083145f83125f87121883158715171717614912575f928082136149055703604c81135f8212176148a257600a0a90846148808382029384614278565b9194600193509190614861565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561496a576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361497c57505090505f90600190565b60ff8116820191808312614a44575f8312156149b4575050604c19811261455f575f03600a0a916149ad83826139ac565b9283021490565b909293915f81135f14614a3a57604d8113614a0f57600a0a9283156139b657835f190483116149e65750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614aa957614a809192615079565b50614a8a81613ac5565b159182614a9657505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614b1d57600a6001818404940192061590565b909190600190565b909392915f614b35918184613e74565b9490945f8483019182019412159081614b82575b8115614b78575b50614b5a57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b50565b8281129150614b49565b614ba193600160fe1b90810193920190613e74565b9081815f821215614bd8575050604b1982126128e557614bc6915f03600a0a90614278565b9081614bd0575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a9957600160ff1b90808203614c00575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614caf576001600160ff1b039283831115614c9957600160ff1b93838503614c4f57505050509190565b90919293508514614c69575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461289e575f039190565b90916001600160ff1b0380841115612866578514614c69575050600a60019104920190565b9190918015614e7657827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d84575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d75575b8313614d5f5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d53565b6f4b3b4ca85a86c47a098a22400000000080840515614e64575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e4d575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e39575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e2957820515614e1a575b5f614d08565b9290600a02905f190192614e14565b9391606402916001190193614de5565b93916402540be40002916009190193614de5565b9391678ac7230489e8000002916012190193614dc0565b6025198301955092909202915f614d9e565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614efe5714614ef6579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a9991905f811215614f36575f036150b3565b6150b3565b909291600160ff1b91828101614fcd5750808414614fc357808413918215614fbb578185035b604c811115614faa5750505f915b15614f9b57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156139b6570491614f6f565b848203614f61565b505090505f905f90565b93614fda92945f036144ad565b80939180928114614fee575b50505f039190565b915092506001600160ff1b0383146145b957600a600191059201915f80614fe6565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561504e575b6150365750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561502f565b81519190604183036150a9576150a29250602082015190606060408401519301515f1a90615142565b9192909190565b50505f9160029190565b90637ffffff581131561513c57637ffffffe1981019060438213615135575f82121561510957637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156139b6577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151b9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156151af57905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561519b908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611792575080631f69cb751461155c5780632cb77e9f146115305780632fbc4ba0146113ce57806341d1514f146113975780635cffe9de1461123b578063607461191461109f578063613255ab1461101c57806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b27565b6024358281116101825761010c903690600401611b27565b60c0366043190112610182576101043583811161018257610131903690600401611ccd565b90610124359384116101825761014e61015c943690600401611ccd565b926101576126bd565b612203565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611816565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611996565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c9236906004016117e5565b91906102786126bd565b604051926102858461197a565b5f84523691611da1565b90612b9c565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c79036906004016117e5565b9190604051926102d68461197a565b5f84528284016102e582611a7a565b946102f36040519687611996565b8286526102ff83611a7a565b9361031186880195601f1901866121e7565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118a2565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120c7565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611996565b30613a0b565b6103ce828a611fad565b526103d98189611fad565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161210f565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c08260040193833603011261018257602435908111610182576104849036906004016117e5565b61048f9291926126bd565b6104c06104bb6104b66104af6104a588806120fa565b60408101906120c7565b36916119b8565b6139a1565b6139f6565b801561071957600110156107075760248201926104dd8486611f0a565b9050156106f55760448301936104f38587611f0a565b9050156106e3576105596105219561054d6105186105118a806120fa565b948a611f0a565b9890928a611f0a565b91909261053e60405196610534886118c6565b3388523690611a1c565b9960209a8b8801523691611a92565b60408501523691611a92565b606082015260648401356080820152610571816126ff565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b82015260606040820152806106096060820188612015565b0390a10191610618838a6120c7565b905061063b575b50505061062e93949550612730565b8190838080808080610587565b6106486104af848b6120c7565b61065181614792565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b5116926120c7565b92906040519384938452868c850152606060408501526060840191611cfc565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118a2565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107646126bd565b5f808061077960048035608481019101611e53565b90501561100a576024600435013592610791846127ab565b15610ff8576060806040516107a58161192e565b6107ad611ea8565b81525f60208201525f604082015201526107c5611ea8565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611e53565b90611eda565b80611ef5565b6040810190611f0a565b60206108186107e9608460043501600435600401611e53565b013591611f40565b611ce8565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611e53565b6060810190611f0a565b60406108186107e9608460043501600435600401611e53565b8160405197610882896118f6565b16875216602086015260408501526108a4608460043501600435600401611e53565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611e53565b9050811080610fe5575b15610e32576108f4608460043501600435600401611e53565b821015610e1e578160051b810135607e198236030181121561018257608081830136031261018257604051916109298361192e565b8181013567ffffffffffffffff81116101825761094b90369084840101611b27565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611ccd565b606082015280516001600160a01b036109a66040830151602085015190611fad565b5151166001600160a01b0385511614801590610dea575b610dd8576109d56020830151604084015190836130ed565b6109de816126ff565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a688461197a565b5f8452339186613122565b925f93610a8b606082015160446004350135906127ce565b15610af257505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610aea575b5092610a3c565b905088610ae3565b610aff60408201516127ab565b158015610dc5575b15610b5c57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610adc565b9250925050600196959691610b75606460043501611fc1565b15610d325796610be597610bf560408401516040880151610b96818361347b565b15610d2a5750925b610bef848592610bd8610bd260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e4b565b90614006565b9d8e9260408d0151613546565b60408c0152613570565b99613570565b98610c00848461359a565b610c0a84826135f8565b60405192338452608060208501526060610c308451608080880152610100870190612015565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610ccc57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610cc796604084015260608301520390a180858c5101808d5260051b8c015261370a565b610adc565b9091929396602080610d1d600193601f198782030189528b51906001600160a01b0382511681526040610d0c858401516060878501526060840190612094565b9201519060408184039101526118a2565b9901950193929101610c6d565b905092610b9e565b610be590610bf56060840151610bef610d70610bd260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e4b565b60408a0151610d7f818361347b565b15610dbd5750915b829c8d916060890151908116155f14610dae575060408801515b96879460408d0151613546565b610db890856134a2565b610da1565b905091610d87565b50610dd36060820151613458565b610b07565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e066060830151604085015190611fad565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e44606460043501611fc1565b15610fdf57835b6004356004013590610e5d828261347b565b610fc15750508490610e7d856001600160a01b0360208701511633613084565b505060a46004350190610e95826004356004016120c7565b905015159081610fb9575b50610f18575b506001600160a01b03610ebc92935116336127f5565b50505b8351811015610ee45780610ede610ed860019387611fad565b516138e3565b01610ebf565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f426001600160a01b03855116926004356004016120c7565b929091333b1561018257610f8a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611cfc565b038183335af190811561022c57859115610ea6579050610faa915061194a565b5f836001600160a01b03610ea6565b905088610ea0565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e4b565b50610ff360408301516127ab565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611041611816565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611072575b50604051908152f35b90508181813d8311611098575b6110898183611996565b81010312610182575182611069565b503d61107f565b34610182576110ad36611856565b6110b56126bd565b6110c0848633612777565b6110c9836127ab565b1561120e576110d9848633612db7565b6110e3818561347b565b15611208575082935b6110f885828833613026565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611129898533613084565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111845760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6111fb9761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e0850152610100840193846040526111cf8561195e565b600685526111e061012082016121cb565b6111e985611f9d565b526111f384611f9d565b503691611da1565b808080808080808061015c565b936110ec565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b03908181168091036101825761126a61182c565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576112f79560209216936112b9868587612f47565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611cfc565b03815f855af193841561022c575f94611363575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9840361134a5761133f93503091612fc0565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d60201161138f575b8161137f60209383611996565b810103126101825751928461130b565b3d9150611372565b346101825760603660031901126101825760206113c66113b5611816565b6113bd61182c565b60443591612db7565b604051908152f35b34610182576113dc36611856565b839493926113e86126bd565b6113f3848633612777565b6113fc816127ab565b15611502578061141061145f9287336127f5565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a13361289b565b9590938261148d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6114f69661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e0840193846040526114d28561195e565b600685526114e361010082016121cb565b6114ec85611f8d565b526111f384611f8d565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a08436039384011261018257602435828111610182576115ab9036906004016117e5565b906115b46126bd565b5f946001600160a01b0394856115c986611ce8565b163303611770576115e26115dd3687611b27565b6126ff565b91825f525f60205260405f2096600188541461162a575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405191338352846020840152606060408401528161165689611842565b16606084015260248a013590606219018112156101825789019060a060808401528061168460048401611842565b1661010084015261169760248301611842565b1661012083015260448101356022198236030181121561018257019560246004880135970192871161018257863603831361018257602098608461175384936117127f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117639c6060610140890152610160880191611cfc565b6117446117396117256044880185611d1c565b605f198a8603810160a08c01529491611d51565b926064870190611d1c565b918784030160c0880152611d51565b91013560e08301520390a1612730565b82808080808080806115f9565b60248661177c87611ce8565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b81149081156117d4575b5015158152f35b6301ffc9a760e01b149050836117cd565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff82116101825761189e916004016117e5565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff8211176118e257604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176118e257604052565b6040810190811067ffffffffffffffff8211176118e257604052565b6080810190811067ffffffffffffffff8211176118e257604052565b67ffffffffffffffff81116118e257604052565b60e0810190811067ffffffffffffffff8211176118e257604052565b6020810190811067ffffffffffffffff8211176118e257604052565b90601f8019910116810190811067ffffffffffffffff8211176118e257604052565b92919267ffffffffffffffff82116118e257604051916119e2601f8201601f191660200184611996565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a19933591016119b8565b90565b91906060838203126101825760405190611a35826118f6565b8193611a4081611842565b8352611a4e60208201611842565b602084015260408101359167ffffffffffffffff831161018257604092611a7592016119fe565b910152565b67ffffffffffffffff81116118e25760051b60200190565b929192611a9e82611a7a565b604092611aae6040519283611996565b819581835260208093019160061b84019381851161018257915b848310611ad757505050505050565b8583830312610182578386918251611aee81611912565b611af786611842565b81528286013583820152815201920191611ac8565b9080601f8301121561018257816020611a1993359101611a92565b91909160a0818403126101825760405190611b41826118c6565b8193611b4c82611842565b835267ffffffffffffffff9160208101358381116101825782611b70918301611a1c565b602085015260408101358381116101825782611b8d918301611b0c565b6040850152606081013592831161018257611bae6080939284938301611b0c565b60608501520135910152565b909291611bc684611a7a565b916040611bd66040519485611996565b839580855260208095019160059160051b8401948086116101825784935b868510611c05575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c30816118f6565b611c3983611842565b81528a83013584811161018257830185601f8201121561018257803590611c5f82611a7a565b91611c6c89519384611996565b8083528d808401918b1b83010191888311610182578e809101915b838310611cbd57509150508201528583013593841161018257611cae858c958695016119fe565b86820152815201940193611bf4565b82358152918101918f9101611c87565b9080601f8301121561018257816020611a1993359101611bba565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611d6e575050505090565b909192936001906001600160a01b03611d8687611842565b16815285830135838201526040908101950193920190611d60565b90929192611dae81611a7a565b91604091611dbf6040519485611996565b839581855260208095019160051b8301938185116101825783925b858410611dea5750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e1481611912565b82358481116101825786611e29918501611a1c565b81528983013593841161018257611e44868b95869501611ccd565b83820152815201930192611dda565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611e96826118f6565b60606040835f81525f60208201520152565b60405190611eb5826118c6565b5f608083828152611ec4611e89565b6020820152606060408201526060808201520152565b9015610e1e57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e1e5760061b0190565b805115610e1e5760200190565b805160011015610e1e5760400190565b805160021015610e1e5760600190565b805160031015610e1e5760800190565b805160041015610e1e5760a00190565b805160051015610e1e5760c00190565b8051821015610e1e5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110611fed575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101611fdf565b9060808061208b61207961206760406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118a2565b60408701518682036040880152611fce565b60608601518582036060870152611fce565b93015191015290565b9081518082526020808093019301915f5b8281106120b3575050505090565b8351855293810193928101926001016120a5565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121266115dd61211f8380611ef5565b3690611b27565b5f525f602052600160405f2054036121c25780612146816121b293611ef5565b6121aa61216561216a6020850135938460408701359384923690611b27565b6130ed565b6121826121778580611ef5565b946060810190611e53565b92906121a2604051966121948861197a565b5f88525f3681373690611b27565b933691611bba565b923392613122565b6040810151606090910151600192565b505f905f905f90565b5f5b60c081106121d9575050565b6060828201526020016121cd565b5f5b8281106121f557505050565b6060828201526020016121e9565b926001600160a01b038451166001600160a01b03835116146126ab576001600160a01b03612238606086015160643590611fad565b515116906040830151916001600160a01b036122576084358095611fad565b5151161480159061266b575b610dd8576040850151906001600160a01b036122826044358094611fad565b5151166001600160a01b0361229d60643560608a0151611fad565b51511614612659576122ae866126ff565b805f525f60205260405f20541561260657506122c9846126ff565b805f525f60205260405f2054156125b257506123ac9291612386917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061233161232361012033845280602085015283018d612015565b82810360408401528a612015565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123798461197a565b5f8452606435908a613122565b936001600160a01b038651166040519261239f8461197a565b5f845260a4359086613122565b916123ba60408201516127ab565b15801561259e575b801561258b575b8015612578575b61256657604051916123e18361192e565b5f83525f60208401525f60408401525f606084015261240084836147b6565b8452604084015261242661241483866147b6565b60208601528060608601528451613546565b9461243a6020850151604086015190613546565b9361244487613458565b8015612557575b6125455761250c61253e957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946124ee6125439a60a09661248d8a885161359a565b61249b8c602089015161359a565b6124a98a60408901516135f8565b6124b78c60608901516135f8565b6124c08a6138e3565b6124c98c6138e3565b6001600160a01b036124e560c435926060606435910151611fad565b5151163361289b565b50506001600160a01b036124e560e43592606060a435910151611fad565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161370a565b61370a565b565b604051630d86822160e01b8152600490fd5b5061256185613458565b61244b565b6040516321badf1f60e01b8152600490fd5b506125866060840151613458565b6123d0565b506125996060820151613458565b6123c9565b506125ac60408401516127ab565b156123c2565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f394935083925050606082019050612601565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612685606085015160a43590611fad565b5151166001600160a01b036126a1604088015160443590611fad565b5151161415612263565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146126ed5760029055565b604051633ee5aeb560e01b8152600490fd5b60405161272a8161271c6020820194602086526040830190612015565b03601f198101835282611996565b51902090565b612543929161275b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611da1565b909115612782575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127ca905f60e01d906001600160e01b038160e01d9116601b0b614819565b1290565b906127ca916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61489a565b92919261280182613ade565b9361280b81613458565b6128895784816001600160e01b0361282a9360e01d9116601b0b614919565b9290809315612860575b50829081612844575b5050509190565b612858926001600160a01b03309216612fc0565b5f818161283d565b9092505f19811461287557600101915f612834565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b939291936128a883613458565b61294657846128c4576128bc939450613084565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612901835f20549485613570565b9561290b87613458565b61292e575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261299a82611a7a565b916129a86040519384611996565b808352848084019160051b830101918683116101825785809101915b838310612a375750505050948281015191821161018257019180601f840112156101825782516129f381611a7a565b93612a016040519586611996565b818552838086019260051b820101928311610182578301905b828210612a28575050505090565b81518152908301908301612a1a565b82518152918101918691016129c4565b90808251908181526020809101926020808460051b8301019501935f915b848310612a755750505050505090565b9091929394958480612a93600193601f198682030187528a51612094565b9801930193019194939290612a65565b91906020928381526001600160a01b0382511684820152838201516040820152612add604083015160e060608401526101008301906118a2565b9060608301516080820152612b04608084015192601f1993848483030160a0850152612a47565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b4757505050611a1994955060c060e09101519282850301910152612094565b825187529588019591880191600101612b23565b90604082019082526020606081936040838201528551809452019301915f5b828110612b88575050505090565b835185529381019392810192600101612b7a565b919091604092835192612bae8461195e565b60068452602094612bc08686016121cb565b5f5b8451811015612bf55780612bd860019287611fad565b51612be38289611fad565b52612bee8188611fad565b5001612bc2565b50925092939093335f52308252825f2091835195612c1287611912565b612c1a611e89565b875260608281980152845190612c2f8261197a565b5f8252855190612c3e8261197a565b5f82525f3681375f5b8151811015612dab57898688612c5d8486611fad565b51888151948d80870151908151612c7f575b5050505050505050600101612c47565b905f92916001600160a01b0396612ca48887818d51169c015116998789015190613bbd565b95825199612cb18b61195e565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180612cec600498898301612aa3565b03915afa938415612da1579089915f95612d7b575b508451612d17575b50899250808e8c938e612c6f565b5101511691823b1561018257612d45925f92838d5180968195829463012c676d60e21b845233908401612b5b565b03925af18015612d71579060019291612d62575b81928782612d09565b612d6b9061194a565b5f612d59565b89513d5f823e3d90fd5b612d989195503d805f833e612d908183611996565b81019061295f565b9050935f612d01565b8c513d5f823e3d90fd5b50505050505050509050565b8215612dec576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612df882613def565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612f0e575f97612f18575b5083612e4f612e4883612e7f9a614ace565b5090614259565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612f0e575f97612edd575b50612e48612ea391611a1998614ace565b50612eae818361347b565b15612ed55750935b5f5260018252825f20905f528152815f20905f8052525f205490613570565b905093612eb6565b96508387813d8311612f07575b612ef48183611996565b8101031261018257955195612e48612e92565b503d612eea565b85513d5f823e3d90fd5b96508387813d8311612f40575b612f2f8183611996565b810103126101825795519583612e36565b503d612f25565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612fa1575b8360405215612f8b57505050565b635274afe760e01b835216600482015260249150fd5b6001811516612fb757813b15153d151616612f7d565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613010575b836040525f60605215612f8b57505050565b6001811516612fb757813b15153d151616612ffe565b9392919361303383613458565b6129465784613047576128bc9394506127f5565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612901835f20549485613546565b9092919261309181613ade565b9361309b81613458565b6130db5784816001600160e01b036130ba9360e01d9116601b0b614919565b508092816130c9575050509190565b6001600160a01b036128589316612f47565b604051632d1671a360e11b8152600490fd5b9161311890606061310d936001600160a01b039485916040880151611fad565b515116940151611fad565b5151161461265957565b949193613361919360c0915f6132e86040928351946131408661195e565b613148611ea8565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261329885519161317e8361195e565b6006835261318d8884016121cb565b8d613197816126ff565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131cd86611f50565b526131d785611f50565b5088516131e3816118f6565b6002815289368c8301376131f686611f5d565b5261320085611f5d565b5060ff8a6132638b85019361324d876132268161321e858a51611fad565b515116613def565b97511688613235848951611fad565b51511685613244858a51611fad565b51015191612db7565b96613259828751611fad565b5151169451611fad565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6132a182611f6d565b526132ab81611f6d565b506132cf8a8d8d60ff8a6132638d85019361324d876132268161321e858a51611fad565b6132d882611f7d565b526132e281611f7d565b50613bbd565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916133198361197a565b8683528751956133288761195e565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612aa3565b03915afa96871561344e575f945f9861342c575b508451600281106134155750818386015195015161339b61339588611f8d565b51611f7d565b516133a6818361347b565b1561340d5750925b6133d08685919060405192600284526020840152604083015260608201604052565b6133d988611f6d565b526133e387611f6d565b508251996133f08b61195e565b8a52890152870152850152608084015260a083015260c082015290565b9050926133ae565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134449194503d805f833e612d908183611996565b939093965f613375565b50513d5f823e3d90fd5b613477905f60e01d906001600160e01b038160e01d9116601b0b614819565b1390565b90613477916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61489a565b6134c96001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614010565b90637ffffff58213613519575b906134e091614259565b9290921580613511575b6134f357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134ea565b6135238282614ef9565b156134d657604483856040519163d556b11160e01b835260048301526024820152fd5b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61445f565b611a1991610bd2916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614623565b6135f49160808101826135b66135b08351611f8d565b51611f8d565b526135ed6135e76001600160a01b038094515116936135de6135d88551611f8d565b51611f50565b51169251611f8d565b51611f6d565b5191613026565b5050565b9060808101918061360c6135b08551611f7d565b526001600160a01b038092515116916136286135d88551611f7d565b51166136376135e78551611f7d565b5190816136d25761364783613458565b612946579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612601955f526020906001825261369d604094855f20835f528452855f20855f528452855f2054613570565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a47565b91613703917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a95936126019561289b565b50506136b7565b60c0810151908151915f9261387e575b506137bf6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916137678361197a565b8683528c51936137768561197a565b8785528d51966137858861195e565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612aa3565b03915afa948515613874578795613856575b5084516137e2575b50505050505050565b81905101510151169051813b1561385257918491849383613817965180978195829463012c676d60e21b845260048401612b5b565b03925af19081156138495750613832575b80808080806137d9565b61383c829161194a565b6138465780613828565b80fd5b513d84823e3d90fd5b8480fd5b61386b9195503d8089833e612d908183611996565b9050935f6137d1565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138c1925f928360405180968195829463012c676d60e21b845260048401612b5b565b03925af1801561022c571561371a576138db91925061194a565b5f905f61371a565b608081016138f46135e78251611f7d565b5191821561390157505050565b61391b6135d86001600160a01b0380935151169351611f7d565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b038516613956575b505050505050565b61397a955f9284845260018152828420868552815282842091845252812055613084565b5f80808061394e565b811561398d570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139e9576020810151908051603f1981019081116128755760051c82116139d55760016020920160051b010190565b50506040516139e38161197a565b5f815290565b506040516139e38161197a565b805115613a0657602001515f1a90565b505f90565b905f8091602081519101845af48080613a89575b15613a3f5750506040513d81523d5f602083013e60203d82010160405290565b15613a6657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a77576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a1f5750813b1515613a1f565b60041115613aa657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613ada83613a9c565b0152565b613ae6614fe7565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613bb4575f925f94613b7f575b50613b3c83613a9c565b600183141580613b6d575b613b515750505090565b5163ee07877f60e01b81529182916106df919060048401613aba565b50613b7783613a9c565b821515613b47565b90809450613ba39293503d8511613bad575b613b9b8183611996565b8101906148ef565b919091925f613b32565b503d613b91565b513d5f823e3d90fd5b90805191613bca83611a7a565b91613be5604094613bdd86519586611996565b808552611a7a565b601f199460209186013686840137835183519095908015613de4576001613c3b9101965b6001978891010197613c32613c1d8a611a7a565b99613c2a86519b8c611996565b808b52611a7a565b018489016121e7565b85805f9684516002815233878201523086820152606081018652613c5e8b611f50565b52613c688a611f50565b505f925b613da0575b5050508351613c84575b50505050505090565b85809598979692980181613c988289611fad565b52613ca38188611fad565b505f925b613cb6575b5085969750613c7b565b8451831015613d9b576001600160a01b03613d2d81613cd58689611fad565b51511686613ce3878a611fad565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d24888b611fad565b51015191614a45565b15613d8357868098999a928192613d44878a611fad565b515116613d518787611fad565b52019385613d5f8289611fad565b510151613d6c868c611fad565b52613d77858b611fad565b50019290989796613ca7565b8951630a57f30960e31b815260048101859052602490fd5b613cac565b9091968151881015613ddb578280910197613dbb8184611fad565b51613dc68a8d611fad565b52613dd1898c611fad565b5001919081613c6c565b96829150613c71565b50613c3b5f96613c09565b613df7614fe7565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613bb4575f925f94613b7f5750613b3c83613a9c565b9091939284158215175f14613e655750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f9c575b5050613e8881614bbe565b93613e9281614bbe565b94613e9d8682614bde565b90918215613f8d575f9083986f0785ee10d5da46d900f436a000000000808611613f7f575b50670de0b6b3a7640000808b11613f70575b50633b9aca00808b11613f61575b50612710808b11613f53575b5098805b613f425750819061189e989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bf1565b60019290920191600a900480613ef2565b60049a04998a930192613eee565b600991939a049901915f613ee2565b601291939a049901915f613ed4565b85049950602592505f613ec2565b5092905061189e949550614bf1565b5f821215613ff057808413613fe2575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e7d5790925061189e939491614afc565b90925061189e939491614b63565b80841215613fac5790925061189e939491614afc565b6134e08282614259565b92909180614036576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461404b57505050505f905f90565b6140649361405891614cab565b92919490938492614cab565b909391928461407288614bbe565b9161407c86614bbe565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614223575b030191600160ff1b98838a018112155f146141f0575050035b5f955f8212806141e7575b6141c9575b5f8112806141b7575b6141995786820103966001600160ff1b038814908161418f575b5080614186575b8061417d575b61415f5750906141139291614e57565b915f8113614126575b5061189e93614bf1565b9091604c82136141545761413d91600a0a90613983565b90811561414a575f61411c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614103565b508284146140fd565b905088145f6140f6565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140dc565b95508087018613156141e15786818703015b956140d3565b5f6141db565b505f81136140ce565b89985090920390506001600160ff1b038190038701821361421457018601946140c3565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506140aa565b811561398d570590565b8082601b82810b831461444e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143fa575b8380820b036143e957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561439a575b838060030b0361431e575b8084136143025750506001600160e01b036001925b60e01b91161791565b8303600a0a801561398d576001600160e01b03910715926142f9565b92915f84131561436e5750906143348383614ef9565b61435057637ffffffe1901600a0a810290637fffffff926142e4565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141545761438d91600a0a9061424f565b91821561414a57926142e4565b5f198401808060030b146143ae57506142d9565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a9093059261428c565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000084051561443b576305f5e100600894058094819201955b91505061428c565b620186a060059405809481920195614433565b50826142d957505050505f90600190565b919291600160ff1b84016144775761189e9350614f12565b9061189e935f0391614623565b919291600160ff1b91908015806146115750906144a091614cab565b9490929091905f868585858282138015614608575b6145eb575b505050508682841860ff1c94860391039081604c0381116145d05701600a0a8082059190846145b6575b505081019182821860ff1c11156145ae57826001600160ff1b031461459057905f600192135f1461456157600a9004915b01925b8115811761452557509190565b8061453e575b508015614536579190565b505f91508190565b91926145549203600160ff1b01600a0a9061424f565b600160ff1b91905f61452b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614515565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614518565b81076145c3575b806144e4565b60ff1d600117015f6145bd565b5050509193506145de579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b945092509050868080806144ba565b50835f126144b5565b1561461c5750509190565b9350919050565b93929193841581158181176147745750509061463e91614cab565b919490829561464f82958294614cab565b809692949196938786848213801561476b575b614752575b5050505050508682841860ff1c94860391039081604c0381116145d05701600a0a808205919084614738575b505081019182821860ff1c111561473057826001600160ff1b031461459057905f600192135f1461470157600a9004915b01925b811581176146d457509190565b806146e457508015614536579190565b600160ff1b936146fb9291038401600a0a9061424f565b5f61452b565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146c4565b5090926146c7565b8107614745575b80614693565b60ff1d600117015f61473f565b929b5098509196509450925090505f8080808080614667565b50858412614662565b939593909291901561478a575050614536579190565b945092915050565b6008815110613a06576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147f0610bd2606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e4b565b945193016147ff8151866127ce565b614807575050565b909350611a19919250519251836134a2565b92915f9060018184145f87128715171717614893575f92808213614885575b03604c81135f82121761487957600a0a9084614857838202938461424f565b1461486c57505015614868575f9190565b5f90565b9093509015611a19579190565b505015614868575f9190565b5f9560019450925090614838565b5050505f90565b93929190918083145f83125f871218831587151717176148e9575f928082136148dc5703604c81135f82121761487957600a0a9084614857838202938461424f565b9194600193509190614838565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614941576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361495357505090505f90600190565b60ff8116820191808312614a1b575f83121561498b575050604c198112614536575f03600a0a916149848382613983565b9283021490565b909293915f81135f14614a1157604d81136149e657600a0a92831561398d57835f190483116149bd5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a8057614a579192615050565b50614a6181613a9c565b159182614a6d57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614af457600a6001818404940192061590565b909190600190565b909392915f614b0c918184613e4b565b9490945f8483019182019412159081614b59575b8115614b4f575b50614b3157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b27565b8281129150614b20565b614b7893600160fe1b90810193920190613e4b565b9081815f821215614baf575050604b1982126128bc57614b9d915f03600a0a9061424f565b9081614ba7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a1957600160ff1b90808203614bd7575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c86576001600160ff1b039283831115614c7057600160ff1b93838503614c2657505050509190565b90919293508514614c40575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612875575f039190565b90916001600160ff1b038084111561283d578514614c40575050600a60019104920190565b9190918015614e4d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d5b575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d4c575b8313614d365791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d2a565b6f4b3b4ca85a86c47a098a22400000000080840515614e3b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e24575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614e10575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614e0057820515614df1575b5f614cdf565b9290600a02905f190192614deb565b9391606402916001190193614dbc565b93916402540be40002916009190193614dbc565b9391678ac7230489e8000002916012190193614d97565b6025198301955092909202915f614d75565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614ed55714614ecd579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a1991905f811215614f0d575f0361508a565b61508a565b909291600160ff1b91828101614fa45750808414614f9a57808413918215614f92578185035b604c811115614f815750505f915b15614f7257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a90811561398d570491614f46565b848203614f38565b505090505f905f90565b93614fb192945f03614484565b80939180928114614fc5575b50505f039190565b915092506001600160ff1b03831461459057600a600191059201915f80614fbd565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615025575b61500d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615006565b8151919060418303615080576150799250602082015190606060408401519301515f1a90615119565b9192909190565b50505f9160029190565b90637ffffff581131561511357637ffffffe198101906043821361510c575f8212156150e057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a801561398d577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615190579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561518657905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index e382dbc8b9..dca7aedb11 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506126f08061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ab565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d9190612407565b6100ce6100c936600461242d565b610bed565b60405161009d939291906124d7565b6040517f7e92d4e954f131b7ce6471bc48157dc3125be0b90c8c9e26855b88218d95eb20815260200161009d565b61011e61011936600461242d565b610d31565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d69565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e660056001612548565b6101f1906001612548565b6101fc906002612548565b6001600160401b0381111561021357610213612419565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b6123a1815260200190600190039081610262579050509050611706815f8151811061028f5761028f61255b565b60200260200101906001600160401b031690816001600160401b031681525050611723816001815181106102c5576102c561255b565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123a18152602001906001900390816102f5579050509050611732815f815181106103225761032261255b565b60200260200101906001600160401b031690816001600160401b031681525050611741816001815181106103585761035861255b565b60200260200101906001600160401b031690816001600160401b0316815250506117508160028151811061038e5761038e61255b565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123a18152602001906001900390816103be579050509050611760815f815181106103eb576103eb61255b565b60200260200101906001600160401b031690816001600160401b03168152505061176f816001815181106104215761042161255b565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123a181526020019060019003908161045157905050905061177f815f8151811061047e5761047e61255b565b60200260200101906001600160401b031690816001600160401b03168152505061178e816001815181106104b4576104b461255b565b60200260200101906001600160401b031690816001600160401b03168152505061179e816002815181106104ea576104ea61255b565b60200260200101906001600160401b031690816001600160401b0316815250506117ae816003815181106105205761052061255b565b60200260200101906001600160401b031690816001600160401b0316815250506117bd816004815181106105565761055661255b565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123a18152602001906001900390816105865790505090506117cd815f815181106105b3576105b361255b565b60200260200101906001600160401b031690816001600160401b0316815250506117dc816001815181106105e9576105e961255b565b60200260200101906001600160401b031690816001600160401b0316815250506117ec8160028151811061061f5761061f61255b565b60200260200101906001600160401b031690816001600160401b0316815250506117fc816003815181106106555761065561255b565b60200260200101906001600160401b031690816001600160401b03168152505061180c8160048151811061068b5761068b61255b565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123a18152602001906001900390816106ba57905050905061181b815f815181106106e7576106e761255b565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123a1815260200190600190039081610716579050509050611834815f815181106107435761074361255b565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107765761077661255b565b602002602001018190525085886001815181106107955761079561255b565b602002602001018190525084886002815181106107b4576107b461255b565b602002602001018190525083886003815181106107d3576107d361255b565b602002602001018190525082886004815181106107f2576107f261255b565b6020908102919091010152818861080b60056001612548565b8151811061081b5761081b61255b565b6020908102919091010152808861083460056001612548565b61083f906001612548565b8151811061084f5761084f61255b565b602090810291909101015260408051600680825260e082019092525f91816020015b6123a1815260200190600190039081610871579050509050611880815f8151811061089e5761089e61255b565b60200260200101906001600160401b031690816001600160401b03168152505061188f816001815181106108d4576108d461255b565b60200260200101906001600160401b031690816001600160401b03168152505061189e8160028151811061090a5761090a61255b565b60200260200101906001600160401b031690816001600160401b0316815250506118ae816003815181106109405761094061255b565b60200260200101906001600160401b031690816001600160401b0316815250506118be816004815181106109765761097661255b565b60200260200101906001600160401b031690816001600160401b0316815250506118ce816005815181106109ac576109ac61255b565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109e0576109e061255b565b602090810291909101015260408051600780825261010082019092525f91816020015b6123a1815260200190600190039081610a03579050509050611706815f81518110610a3057610a3061255b565b60200260200101906001600160401b031690816001600160401b03168152505061173281600181518110610a6657610a6661255b565b60200260200101906001600160401b031690816001600160401b03168152505061174181600281518110610a9c57610a9c61255b565b60200260200101906001600160401b031690816001600160401b03168152505061175081600381518110610ad257610ad261255b565b60200260200101906001600160401b031690816001600160401b0316815250506118de81600481518110610b0857610b0861255b565b60200260200101906001600160401b031690816001600160401b0316815250506118ee81600581518110610b3e57610b3e61255b565b60200260200101906001600160401b031690816001600160401b0316815250506118fe81600681518110610b7457610b7461255b565b6001600160401b0390921660209283029190910190910152808a610b9a60056001612548565b610ba5906001612548565b610bb0906001612548565b81518110610bc057610bc061255b565b602090810291909101015289610bdd610bd88261190e565b611923565b9b50505050505050505050505090565b5f6060805f805f610c0d87610c006119b2565b610c086119d2565b6119f2565b9250925092505f610c2382610220015160200190565b90505f8261022001515182610c389190612548565b90505f610c5683836f07fffffe0000000003ff200000000000611ae3565b80925081945050505f80610c6f86610240015184611b7f565b915091508115610d04575f610c848783611c56565b90506123a15f610c92611c85565b90505f60028251610ca39190612583565b9050808510610cd4576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610ced8c8c8686565b9e509e509e50505050505050505050505050610d2a565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d59866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d7860056001612548565b610d83906001612548565b610d8e906002612548565b6001600160401b03811115610da557610da5612419565b604051908082528060200260200182016040528015610dd857816020015b6060815260200190600190039081610dc35790505b50604080516002808252606082019092529192505f9190816020015b6123a1815260200190600190039081610df4579050509050611ca5815f81518110610e2157610e2161255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca581600181518110610e5757610e5761255b565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123a1815260200190600190039081610e87579050509050611ca5815f81518110610eb457610eb461255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca581600181518110610eea57610eea61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca581600281518110610f2057610f2061255b565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123a1815260200190600190039081610f50579050509050611ca5815f81518110610f7d57610f7d61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca581600181518110610fb357610fb361255b565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123a1815260200190600190039081610fe3579050509050611ca5815f815181106110105761101061255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816001815181106110465761104661255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160028151811061107c5761107c61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816003815181106110b2576110b261255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816004815181106110e8576110e861255b565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123a1815260200190600190039081611118579050509050611ca5815f815181106111455761114561255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160018151811061117b5761117b61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816002815181106111b1576111b161255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816003815181106111e7576111e761255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160048151811061121d5761121d61255b565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123a181526020019060019003908161124c579050509050611cce815f815181106112795761127961255b565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123a18152602001906001900390816112a8579050509050611d6a815f815181106112d5576112d561255b565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106113085761130861255b565b602002602001018190525085886001815181106113275761132761255b565b602002602001018190525084886002815181106113465761134661255b565b602002602001018190525083886003815181106113655761136561255b565b602002602001018190525082886004815181106113845761138461255b565b6020908102919091010152818861139d60056001612548565b815181106113ad576113ad61255b565b602090810291909101015280886113c660056001612548565b6113d1906001612548565b815181106113e1576113e161255b565b602090810291909101015260408051600680825260e082019092525f91816020015b6123a1815260200190600190039081611403579050509050611ca5815f815181106114305761143061255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816001815181106114665761146661255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160028151811061149c5761149c61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816003815181106114d2576114d261255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816004815181106115085761150861255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160058151811061153e5761153e61255b565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115725761157261255b565b602090810291909101015260408051600780825261010082019092525f91816020015b6123a1815260200190600190039081611595579050509050611ca5815f815181106115c2576115c261255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816001815181106115f8576115f861255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160028151811061162e5761162e61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816003815181106116645761166461255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca58160048151811061169a5761169a61255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca5816005815181106116d0576116d061255b565b60200260200101906001600160401b031690816001600160401b031681525050611ca581600681518110610b7457610b7461255b565b5f6060806117145f80611e22565b92509250925093509350939050565b5f6060806117145f6001611e22565b5f60608061171460015f611e22565b5f606080611714600180611e22565b5f60608061171460016002611e22565b5f60608061171460025f611e22565b5f60608061171460026001611e22565b5f60608061171460035f611e22565b5f60608061171460036001611e22565b5f60608061171460036002611e22565b5f606080611714600380611e22565b5f60608061171460036004611e22565b5f60608061171460045f611e22565b5f60608061171460046001611e22565b5f60608061171460046002611e22565b5f60608061171460046003611e22565b5f606080611714600480611e22565b5f60608061171461182e60056001612548565b85611e22565b5f60608060ff80851690600886901c1661186f8261185460056001612548565b61185f906001612548565b6118699190612548565b82611e22565b945094509450505093509350939050565b5f606080611714600580611e22565b5f60608061171460055f611e22565b5f60608061171460056001611e22565b5f60608061171460056002611e22565b5f60608061171460056003611e22565b5f60608061171460056004611e22565b5f60608061171460016003611e22565b5f60608061171460016004611e22565b5f60608061171460016005611e22565b6060815f61191b82611ea4565b949350505050565b60605f82516002026001600160401b0381111561194257611942612419565b6040519080825280601f01601f19166020018201604052801561196c576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119a657805183518616908516178152602090920191600201611984565b50939695505050505050565b60606040518060e0016040528060a281526020016125ce60a29139905090565b60606040518060600160405280604081526020016126b060409139905090565b5f80611a816040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611acd87878760405180602001604052805f815250611f12565b915080826101e001819052505093509350939050565b5f808060018187870360208111611afa5780611afd565b60205b915050875192505b8519600184841a1b16158183101615611b2357600182019150611b05565b9681019660208290036008810293841c90931b92611b6e5760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ccb91600401612407565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c445760018301516021909301805190935f90819060ff168180611bc9838e6120c3565b915091508186165f03611beb575f809b509b5050505050505050505050611c4f565b5f87611bfb6001850389166120ee565b016004028b015195505062ffffff9081169350841683039150611c2f9050575060019750601c1a9550611c4f945050505050565b611c38836120ee565b84019350505050611ba0565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c7c9083565b95945050505050565b606060405180606001604052806040815260200161267060409139905090565b5f81515f14611cc7576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d2b575060208101516001600160e01b038116601b0b60e082901d5f611cfc8383836121a7565b905061ffff811115611d2157604051631e4e01d760e21b815260040160405180910390fd5b9250611d65915050565b81515f03611d4c57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611dff57602082015160408301516001600160e01b038216601b0b60e083901d5f611d9c8383836121a7565b6001600160e01b038516601b0b935060e085901d925090505f611dc08484836121a7565b905060ff821180611dd1575060ff81115b15611def57604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d659350505050565b600282511015611d4c57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e35575060ff84115b15611e5d57604051639b0f326160e01b81526004810186905260248101859052604401610ccb565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611eb0836121e9565b90505f611ebe8260206125a2565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f0657602083515102806020855101835e6020939093019201611ee3565b50919695505050505050565b611f9f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561202457612024612419565b60405190808252806020026020018201604052801561204d578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c7c565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c4f575060019250929050565b5f5f1982036121005750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121b5868686612232565b91509150806121e05760405162bc8ecf60e31b81526004810187905260248101869052604401610ccb565b50949350505050565b5f60208201602083510281015b8082101561222b57815151928301928084101561221f57634e487b715f5260116020526024601cfd5b506020820191506121f6565b5050919050565b5f805f85121561225f57604051634a7d166b60e01b81526004810186905260248101859052604401610ccb565b845f0361227157505f90506001611b77565b8460ff84168501858112156122ac5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ccb565b5f805f8312156122f857604c198312156122cf575f809550955050505050611b77565b825f03600a0a91508184816122e6576122e661256f565b0495505084029091149150611b779050565b5f83131561239157604d8313156123355760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ccb565b82600a0a9150815f198161234b5761234b61256f565b0484111561237f5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ccb565b5091909102925060019150611b779050565b8360019550955050505050611b77565b6123a96125b9565b565b5f602082840312156123bb575f80fd5b81356001600160e01b0319811681146123d2575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123d260208301846123d9565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561243d575f80fd5b81356001600160401b0380821115612453575f80fd5b818401915084601f830112612466575f80fd5b81358181111561247857612478612419565b604051601f8201601f19908116603f011681019083821181831017156124a0576124a0612419565b816040528281528760208487010111156124b8575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f6020606060208401526124f360608401866123d9565b8381036040850152845180825260208087019201905f5b818110156125265783518352928401929184019160010161250a565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612534565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261259d57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612534565b634e487b7160e01b5f52605160045260245ffdfe0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61ff3dcab0616592209895f0b14fec9301b02e0920c5bfe561d21609201e959460b1974270f844db208bcd3bf1e989376171049db11b934301a0ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6119d260cc107b9bfc0eec7ade13cba2891c6b14a518792bdb02e0f14716565589170617231732174117501760176f177f178e179e17ae17bd17cd17dc17ec17fc180c1880188f189e18ae18be18ce181b1834170617321741175018de18ee18fe1ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51ca51cce1d6a1ca51ca51ca51ca51ca51ca51ca5", + "object": "0x6080604052348015600e575f80fd5b506127168061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd5565b60405161009d939291906124fd565b6040517fa18bcfb6026768fff923ba3f6d2ab7c37c7a6ab3f226e540ca92278af8d56f2c815260200161009d565b61011e610119366004612453565b610d19565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d51565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b6123c78152602001906001900390816102625790505090506116ee815f8151811061028f5761028f612581565b60200260200101906001600160401b031690816001600160401b03168152505061170b816001815181106102c5576102c5612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c78152602001906001900390816102f557905050905061171a815f8151811061032257610322612581565b60200260200101906001600160401b031690816001600160401b0316815250506117298160018151811061035857610358612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160028151811061038e5761038e612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103be579050509050611748815f815181106103eb576103eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042157610421612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610451579050509050611767815f8151811061047e5761047e612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b4576104b4612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104ea576104ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061052057610520612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055657610556612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105865790505090506117b5815f815181106105b3576105b3612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e9576105e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061f5761061f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065557610655612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068b5761068b612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106ba579050509050611803815f815181106106e7576106e7612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071657905050905061181c815f8151811061074357610743612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077657610776612581565b6020026020010181905250858860018151811061079557610795612581565b602002602001018190525084886002815181106107b4576107b4612581565b602002602001018190525083886003815181106107d3576107d3612581565b602002602001018190525082886004815181106107f2576107f2612581565b6020908102919091010152818861080b6006600161256e565b8151811061081b5761081b612581565b602090810291909101015280886108346006600161256e565b61083f90600161256e565b8151811061084f5761084f612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610871579050509050611868815f8151811061089e5761089e612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d4576108d4612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090a5761090a612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061094057610940612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097657610976612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ac576109ac612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109e0576109e0612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a035790505090506118c6815f81518110610a3057610a30612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6657610a66612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9c57610a9c612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad257610ad2612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0857610b08612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3e57610b3e612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7457610b74612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba857610ba8612581565b602090810291909101015289610bc5610bc082611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf587610be86119d8565b610bf06119f8565b611a18565b9250925092505f610c0b82610220015160200190565b90505f8261022001515182610c20919061256e565b90505f610c3e83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5786610240015184611ba5565b915091508115610cec575f610c6c8783611c7c565b90506123c75f610c7a611cab565b90505f60028251610c8b91906125a9565b9050808510610cbc576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd58c8c8686565b9e509e509e50505050505050505050505050610d12565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d41866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d606006600161256e565b610d6b90600161256e565b610d7690600161256e565b6001600160401b03811115610d8d57610d8d61243f565b604051908082528060200260200182016040528015610dc057816020015b6060815260200190600190039081610dab5790505b50604080516002808252606082019092529192505f9190816020015b6123c7815260200190600190039081610ddc579050509050611ccb815f81518110610e0957610e09612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e3f57610e3f612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c7815260200190600190039081610e6f579050509050611ccb815f81518110610e9c57610e9c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610ed257610ed2612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610f0857610f08612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f38579050509050611ccb815f81518110610f6557610f65612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9b57610f9b612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fcb579050509050611ccb815f81518110610ff857610ff8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102e5761102e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106457611064612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109a5761109a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110d0576110d0612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081611100579050509050611ccb815f8151811061112d5761112d612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116357611163612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119957611199612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cf576111cf612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120557611205612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611234579050509050611cf4815f8151811061126157611261612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611290579050509050611d90815f815181106112bd576112bd612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112f0576112f0612581565b6020026020010181905250858860018151811061130f5761130f612581565b6020026020010181905250848860028151811061132e5761132e612581565b6020026020010181905250838860038151811061134d5761134d612581565b6020026020010181905250828860048151811061136c5761136c612581565b602090810291909101015281886113856006600161256e565b8151811061139557611395612581565b602090810291909101015280886113ae6006600161256e565b6113b990600161256e565b815181106113c9576113c9612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113eb579050509050611ccb815f8151811061141857611418612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144e5761144e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148457611484612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114ba576114ba612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114f0576114f0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152657611526612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155a5761155a612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157d579050509050611ccb815f815181106115aa576115aa612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115e0576115e0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161657611616612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164c5761164c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168257611682612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b8576116b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7457610b74612581565b5f6060806116fc5f80611e48565b92509250925093509350939050565b5f6060806116fc5f6001611e48565b5f6060806116fc60015f611e48565b5f6060806116fc600180611e48565b5f6060806116fc60016002611e48565b5f6060806116fc60025f611e48565b5f6060806116fc60026001611e48565b5f6060806116fc60035f611e48565b5f6060806116fc60036001611e48565b5f6060806116fc60036002611e48565b5f6060806116fc600380611e48565b5f6060806116fc60036004611e48565b5f6060806116fc60045f611e48565b5f6060806116fc60046001611e48565b5f6060806116fc60046002611e48565b5f6060806116fc60046003611e48565b5f6060806116fc600480611e48565b5f6060806116fc6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fc600580611e48565b5f6060806116fc60055f611e48565b5f6060806116fc60056001611e48565b5f6060806116fc60056002611e48565b5f6060806116fc60056003611e48565b5f6060806116fc60056004611e48565b5f6060806116fc600680611e48565b5f6060806116fc60065f611e48565b5f6060806116fc60066001611e48565b5f6060806116fc60066002611e48565b5f6060806116fc60066003611e48565b5f6060806116fc60066004611e48565b5f6060806116fc60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b60606040518060600160405280604081526020016125f460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb39160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b606060405180606001604052806040815260200161263460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb3565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb3565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb3565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d9016ee170b171a1729173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb02e0f14716565589", "linkReferences": {} } } diff --git a/meta/RaindexV6SubParser.rain.meta b/meta/RaindexV6SubParser.rain.meta index b79d36ee752738d792b78278bc401841756d9320..17d9b479aec0d33f665b0e31c1ced1606363f0ea 100644 GIT binary patch delta 1346 zcmV-I1-<&_3g!xb{|br5bnbX`qySk3GaO~#rmFhKqwoh^PyTXb`YY#Q`K^flTbE(^tH)vaYZ3i_uSeu>oP_0Xjw14lu>7rv z{Ad#u>6BjM1B#Le|Q{`{~wlr zbRL#}j3V;Ou>6ygu>8}Du>7;*u>A95E;1spV$}N+(f`uz$$}tb134RrN~GW+ z&N4xy{vRuUB+F?*l_HrDDS?^9siK@&F-%EuDJh#9xz(pQB5RVCiX>>VfFZv;{sT>k z8IkgmDI%6wsLc@~$vi=;1z`v?HyMUciP48o;dw>{NmUMGrzMzEM%R<4lQw;b&Jc#D zRAk6Kkk&b)Z^f+%iSQg#CKVz$T_6r>M6w$p0b?={vhE-GPVpaoH>ri1&x|w9laB!x ze_FeTbMMx@bqi!OCrjECSU$dDL$Wu{_eD$mETS=)IQ#YdIH-NrW?x(OUmBTdU=s8@ z&2yi*E}oF(LMN`yLZTzfc-z!nfE4FxnPVu;ae>!kUaDoO4(H$B+CNZCi?Tpgc_Yk6 zh$c|qsx}H2n!6fh=P0hrcq^klyK&Im*uMx1V zj{zJT6Mf>=HGbc;)JHug+Hd{r441jGl4Kv>I3p=7a4rwX_pRphdWQg7J|i8|f2;>t zH@?T3@8_SIWR}Gy1WS2g)-_EFYZ_#N%c%^6iYE~Rb$**k2jzdF`KLI?EG2DDxa4iD za&9?67~DZ6IPu`&BN(2SBnk6FFa*J}j|VaSXC^=BYzA#vyFi&?4S0lSiipk*RdtN> z72Zg+dUX)VDNLP^Fe|zzoHILvU$kCkG_A;Xk=RUr6)bM^`d(hwp5sUA` zw)L~#_L}u)Madq%0SzL?_o%Hu^Z|5yLmNbl@5g3;aAdUx0Z-<9t3kjLqR>q6BH7~W z-vDBKPh0B00eRg9(BOv`)w2P__@8&G|At35(g5H92B)r6pTP8st6ROZ3_#Nf@p`|{qOjeBkf6;CQd&$58j`4M^UyreKSgQDj6>yBNSN&Fye(~Pr>s!Dv zzWZJ3*E8UJw@$YB`WA4E@5@O2hR~XP3JX{_$M*PsFuwmZpH;neGq80hP%9dJ0V_6k z&sIIZTDWVM44r51yEhH!fz3vV^L*ovlQN0KZ%_k_#jkV!+gHGnf6fP9J$B;ztJYsg z1!#>nzh-cs2iJLPrQf99NWvBG?u-JfbU~!MI?T($>^C=Fh1-5M6{5MI*}fIZ4jsFp z2lxM<-`;Go_uuA%45E>q zR!(D83SyI4KO*a;Bo4g(9RinX0Xs&sU$+0#KS?dL_W-P%<}^j8WK#>)3z&~0>XShQ ECG}IPM*si- delta 1346 zcmV-I1-<&_3g!xb{|br5bnbX`qySk3Gfk3hV zgdB+t3la%NLhM}AT{Ba1ch#t>+B3t-Th_dQpMtd)?05+tf^DRny0yD!daAnHW6KM> zPF=op`kcQmqwo*9p8e&>@K?^m_FIwpZ(WA%uO5f(uSMp6e?4M<<0Nc(gzaxd z=6@T7?YGav_B)aBcP_*BcTU3gcO&z^cOJIijf}s08MeQF61IOZir6p0_79K4_Kza= zk59t(Peu{@Mc95Xvi`mQ!uC(k!}iZExyXnZr#Zobh*9sKG>!!#n2kG`GMLd|E!8Ml*- z0T+LIb`R&it^4X0$YxHKv`t|7_=*k5-Z#vugWFVGkX33x`p05d@D zC;R-Td@S^U?%v1!|7T(f5@z)dQD*&VcvcHT(|zB2pZ6eZgo1P6v(=%J(Ln6LrsE~A z5wNWv12{HI^od*7_{1DF0Kk!}Y>y&|rax z#rIL${#lp3X8l=HvWIVgK*abSx9LM4K*u*!AYyz!H1)xe)dT`s=6p*aU<*-bCU}u- z@%0yg7~iv&`fos9R{$FP@S%DNK#c!+r}}SrbRz-)7cjVWrTPY@KU{s)n-zb8j2I$5 z==479{!=YkT{B#Zzh9bEcB$Y@Lj@|v_f-pD{XFKcKn`Q~66E;?3P6nSyJr2@3jd09 z7qWITX!7+IfEeFVOa1Q@zGG-TsxV3l zz^ivBzCUaAK`KDIX!G9;?z4Yzon0#}L0U-RiDP#}fmOO7(p{bNvM_qP@l!bYZBB^h zf@b@^knK8lT@UX6-@i6d;Cn0uKco7%Hr>>A0r$H0z~1yRgCX$PHLZMs&X{dD1BL#@ zz5kdCB19uSt(?ZH6vRG)=_ayX>cH!FI9#d)D5lvj?BDbcQVZ>U04sl|IZe?i+0=ry zqH2)|yc(DzvG{!7qMuhwRypjOb`{=R1`2$PudBX$jGfDL#WzggV|=~zy@K?IyIsD% z0w3dh&_&-p1I~A=bc?UAz{mK$i0FF=t;wgbfOFN@KJOfi?_bSlr`~!w+Ilmp6^(wN z7aMz~uiCE;cC|;S&Z8pty{iZ2fx~Et^L*o<8)OoR-=GaL7QfE>}#0Fg2dn;lpjgcdK5VBOpx HroaRMI~5Q^ delta 66 zcmZ2ry})`y95a)+!$d|oCW! `handleOperandSingleFullNoDefault` -/// - signed-context (column 7, row 0) -> `handleOperandDoublePerByteNoDefault` +/// - signers (column 7, row 0) -> `handleOperandSingleFullNoDefault` +/// - signed-context (column 8, row 0) -> `handleOperandDoublePerByteNoDefault` /// Because the build function is a freshly compiled `external pure`, this test /// runs against a fresh deployment WITHOUT etching or pointer regeneration. The /// absolute pointer values are unstable across source edits (solc reorders its @@ -25,7 +25,7 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// deterministically covers the operand-handler outer length, the column /// assignments, and the deposit/withdraw column offsets: any of those mutations /// changes the table length and/or relocates the two distinct handler pointers -/// off slots 23/24. +/// off slots 30/31. contract RaindexV6SubParserOperandHandlersWiringTest is Test { RaindexV6SubParser internal subParser; @@ -40,12 +40,12 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { // col 3 vault inputs (5 rows) -> 7..11 // col 4 vault outputs (5 rows) -> 12..16 // col 5 deposit (6 rows) -> 17..22 - // col 6 signers (1 row) -> 23 - // col 7 signed context (1 row) -> 24 - // col 8 withdraw (7 rows) -> 25..31 + // col 6 withdraw (7 rows) -> 23..29 + // col 7 signers (1 row) -> 30 + // col 8 signed context (1 row) -> 31 uint256 internal constant TABLE_SLOTS = 32; - uint256 internal constant SLOT_SIGNERS = 23; - uint256 internal constant SLOT_SIGNED_CONTEXT = 24; + uint256 internal constant SLOT_SIGNERS = 30; + uint256 internal constant SLOT_SIGNED_CONTEXT = 31; /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the /// freshly built operand-handler table, asserting the table is the expected @@ -64,8 +64,8 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { pointerAt(0); } - /// Every slot before signers (base through deposit) is the shared - /// disallowed pointer; the signers slot (column 6, row 0) differs. + /// Every slot before signers (base through withdraw) is the shared + /// disallowed pointer; the signers slot (column 7, row 0) differs. function testSignersOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); for (uint256 slot = 0; slot < SLOT_SIGNERS; slot++) { @@ -74,7 +74,7 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { assertTrue(pointerAt(SLOT_SIGNERS) != disallowed, "signers handler must differ from handleOperandDisallowed"); } - /// The signed-context handler (column 7, row 0) differs from both the + /// The signed-context handler (column 8, row 0) differs from both the /// disallowed default and the signers handler. function testSignedContextOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); @@ -88,15 +88,12 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { ); } - /// Every deposit (slots 17..22) and withdraw (slots 25..31) slot is the + /// Every deposit (slots 17..22) and withdraw (slots 23..29) slot is the /// shared disallowed pointer. function testDepositWithdrawOperandHandlersAllDisallowed() external view { uint16 disallowed = pointerAt(0); for (uint256 slot = 17; slot < SLOT_SIGNERS; slot++) { - assertEq(pointerAt(slot), disallowed, "deposit operand slot uses handleOperandDisallowed"); - } - for (uint256 slot = SLOT_SIGNED_CONTEXT + 1; slot < TABLE_SLOTS; slot++) { - assertEq(pointerAt(slot), disallowed, "withdraw operand slot uses handleOperandDisallowed"); + assertEq(pointerAt(slot), disallowed, "deposit/withdraw operand slot uses handleOperandDisallowed"); } } } diff --git a/test/concrete/parser/RaindexV6SubParser.routing.t.sol b/test/concrete/parser/RaindexV6SubParser.routing.t.sol index 115d47daf2..18d2d20b0b 100644 --- a/test/concrete/parser/RaindexV6SubParser.routing.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routing.t.sol @@ -156,50 +156,53 @@ contract RaindexV6SubParserRoutingTest is Test { checkRoute(LibRaindexSubParser.subParserDepositVaultBalanceAfter, 5, 3); } - // Withdraw words route to the calling context column (column 1), withdraw - // row enum. + // Withdraw column (column 6). + + function testRouteWithdrawer() external pure { + checkRoute(LibRaindexSubParser.subParserWithdrawer, 6, 6); + } function testRouteWithdrawToken() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawToken, 1, 0); + checkRoute(LibRaindexSubParser.subParserWithdrawToken, 6, 0); } function testRouteWithdrawVaultId() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawVaultId, 1, 1); + checkRoute(LibRaindexSubParser.subParserWithdrawVaultId, 6, 1); } function testRouteWithdrawVaultBalanceBefore() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceBefore, 1, 2); + checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceBefore, 6, 2); } function testRouteWithdrawVaultBalanceAfter() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceAfter, 1, 3); + checkRoute(LibRaindexSubParser.subParserWithdrawVaultBalanceAfter, 6, 3); } function testRouteWithdrawTargetAmount() external pure { - checkRoute(LibRaindexSubParser.subParserWithdrawTargetAmount, 1, 4); + checkRoute(LibRaindexSubParser.subParserWithdrawTargetAmount, 6, 4); } // Operand-driven words. - /// signers routes to the signers column (column 6) and uses the raw + /// signers routes to the signers column (column 7) and uses the raw /// operand as the row. function testRouteSignersRowFromOperand() external pure { - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(0))), 6, 0); - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(1))), 6, 1); - checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 6, 7); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(0))), 7, 0); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(1))), 7, 1); + checkRouteOperand(LibRaindexSubParser.subParserSigners, OperandV2.wrap(bytes32(uint256(7))), 7, 7); } /// signed-context low operand byte selects a column offset added to the - /// signed context start column (column 7); the second byte selects the row. + /// signed context start column (column 8); the second byte selects the row. function testRouteSignedContextColumnMaskAndRowShift() external pure { - // operand 0x0000 -> column 7 + 0, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 7, 0); - // operand 0x0001 -> low byte 1 -> column 7 + 1 = 8, row 0. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 8, 0); - // operand 0x0100 -> low byte 0 -> column 7, second byte 1 -> row 1. - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 7, 1); - // operand 0x0201 -> column 7 + 1 = 8, row 2. Proves column and row are + // operand 0x0000 -> column 8 + 0, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0000))), 8, 0); + // operand 0x0001 -> low byte 1 -> column 8 + 1 = 9, row 0. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0001))), 9, 0); + // operand 0x0100 -> low byte 0 -> column 8, second byte 1 -> row 1. + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0100))), 8, 1); + // operand 0x0201 -> column 8 + 1 = 9, row 2. Proves column and row are // taken from distinct operand bytes (mask vs shift not swapped). - checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 8, 2); + checkRouteOperand(LibRaindexSubParser.subParserSignedContext, OperandV2.wrap(bytes32(uint256(0x0201))), 9, 2); } } diff --git a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol index 9a2c965b56..16ca0cdacd 100644 --- a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol @@ -37,7 +37,7 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { column = uint8(bytecode[3]); } - /// withdraw-token-decimals routes to the calling context column (1), row 5. + /// withdraw-token-decimals routes to the withdraw column (6), row 5. /// A mutation of either the column or the row constant lands a different /// byte in the decoded bytecode and fails here. function testRouteWithdrawTokenDecimalsAbsolute() external pure { @@ -46,7 +46,7 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { assertTrue(success, "parser must succeed"); assertEq(constants.length, 0, "context has no constants"); (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 1, "withdraw-token-decimals column is calling-context (1)"); + assertEq(column, 6, "withdraw-token-decimals column is withdraw (6)"); assertEq(row, 5, "withdraw-token-decimals row is 5"); } @@ -61,10 +61,10 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { } /// The signed-context ROW is `(operand >> 8) & 0xFF`. An operand of - /// `0x010000` has low byte 0 (column offset 0 -> column 7) and `>> 8` = + /// `0x010000` has low byte 0 (column offset 0 -> column 8) and `>> 8` = /// `0x0100` = 256. WITH the mask the row is `0x0100 & 0xFF` = 0, so the - /// parser succeeds and returns (column 7, row 0). WITHOUT the mask the row is - /// 256, which exceeds uint8 and reverts `ContextGridOverflow(7, 256)`. This + /// parser succeeds and returns (column 8, row 0). WITHOUT the mask the row is + /// 256, which exceeds uint8 and reverts `ContextGridOverflow(8, 256)`. This /// asserts the masked, non-reverting outcome, so dropping the row mask flips /// success into a revert and fails the test. function testSignedContextRowMaskKeepsRowInRange() external pure { @@ -72,21 +72,21 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { LibRaindexSubParser.subParserSignedContext(0, 0, OperandV2.wrap(bytes32(uint256(0x010000)))); assertTrue(success, "parser must succeed (row mask keeps row in range)"); (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 7, "column is signed-context start (7) + low byte 0"); + assertEq(column, 8, "column is signed-context start (8) + low byte 0"); assertEq(row, 0, "row is (0x010000 >> 8) & 0xFF = 0"); } /// Confirms the discriminator above is genuine: the SAME wide operand, with /// the row mask DROPPED (`>> 8` without `& 0xFF`), drives the row to 256 and - /// `LibSubParse.subParserContext` reverts `ContextGridOverflow(7, 256)`. This + /// `LibSubParse.subParserContext` reverts `ContextGridOverflow(8, 256)`. This /// documents the exact revert the production mask prevents, so the pairing of /// these two tests pins the mask: removing it makes the happy test above /// revert with this very selector/args. function testSignedContextUnmaskedRowWouldOverflow() external { uint256 column = uint256(0x010000) & 0xFF; // low byte 0 uint256 unmaskedRow = uint256(0x010000) >> 8; // 256 - vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, column + 7, unmaskedRow)); - this.callContext(column + 7, unmaskedRow); + vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, column + 8, unmaskedRow)); + this.callContext(column + 8, unmaskedRow); } /// @dev External wrapper so `vm.expectRevert` can catch the library revert. diff --git a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol index f0495b1de2..26aabf88b3 100644 --- a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol @@ -30,29 +30,12 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { // col 3 vault inputs (5 rows) -> 7..11 // col 4 vault outputs (5 rows) -> 12..16 // col 5 deposit (6 rows) -> 17..22 - // col 6 signers (1 row) -> 23 - // col 7 signed context (1 row) -> 24 - // col 8 withdraw (7 rows) -> 25..31 + // col 6 withdraw (7 rows) -> 23..29 + // col 7 signers (1 row) -> 30 + // col 8 signed context (1 row) -> 31 uint256 internal constant TABLE_SLOTS = 32; - uint256 internal constant SLOT_BASE_SENDER = 0; - - // Withdraw row words route to the SAME (CONTEXT_CALLING_CONTEXT_COLUMN, row) - // as these order words, so solc deduplicates them to a shared 16-bit - // pointer, which pins the withdraw column offset by pointer equality. - uint256 internal constant SLOT_CALLING_ORDER_HASH = 2; - uint256 internal constant SLOT_CALLING_ORDER_OWNER = 3; - uint256 internal constant SLOT_CALLING_ORDER_COUNTERPARTY = 4; - uint256 internal constant SLOT_DEPOSIT_FIRST = 17; - uint256 internal constant SLOT_DEPOSIT_TOKEN_DECIMALS = 22; - - uint256 internal constant SLOT_WITHDRAW_WITHDRAWER = 25; - uint256 internal constant SLOT_WITHDRAW_TOKEN = 26; - uint256 internal constant SLOT_WITHDRAW_VAULT_ID = 27; - uint256 internal constant SLOT_WITHDRAW_VAULT_BEFORE = 28; - uint256 internal constant SLOT_WITHDRAW_VAULT_AFTER = 29; - uint256 internal constant SLOT_WITHDRAW_TARGET_AMOUNT = 30; - uint256 internal constant SLOT_WITHDRAW_TOKEN_DECIMALS = 31; + uint256 internal constant SLOT_WITHDRAW_LAST = 29; /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the /// freshly built word-parser table. @@ -63,104 +46,16 @@ contract RaindexV6SubParserWordParsersWiringTest is Test { return (uint16(uint8(table[byteIndex])) << 8) | uint16(uint8(table[byteIndex + 1])); } - /// Every deposit word, depositor included, reads its own deposit column - /// cell, so each deposit slot's pointer differs from every other slot. - function testDepositSlotsAreUnique() external view { - for (uint256 slot = SLOT_DEPOSIT_FIRST; slot <= SLOT_DEPOSIT_TOKEN_DECIMALS; slot++) { + /// Every deposit and withdraw word, depositor and withdrawer included, reads + /// its own cell, so each of those slots has a pointer no other slot shares. + function testDepositWithdrawSlotsAreUnique() external view { + for (uint256 slot = SLOT_DEPOSIT_FIRST; slot <= SLOT_WITHDRAW_LAST; slot++) { uint16 pointer = pointerAt(slot); for (uint256 other = 0; other < TABLE_SLOTS; other++) { if (other != slot) { - assertTrue(pointer != pointerAt(other), "deposit slot shares a parser with another slot"); + assertTrue(pointer != pointerAt(other), "deposit/withdraw slot shares a parser with another slot"); } } } } - - /// The withdrawer slot of the withdraw column is wired to `subParserSender`. - function testWithdrawerAliasesSender() external view { - assertEq(pointerAt(SLOT_WITHDRAW_WITHDRAWER), pointerAt(SLOT_BASE_SENDER), "withdrawer must alias base sender"); - assertTrue( - pointerAt(SLOT_WITHDRAW_WITHDRAWER) != pointerAt(SLOT_WITHDRAW_TOKEN), - "withdrawer must differ from withdraw-token parser" - ); - } - - /// Every non-withdrawer withdraw slot is wired to its own DISTINCT withdraw - /// parser function: token, vault-id, balance-before, balance-after, - /// target-amount are five different functions, none of them - /// `subParserSender`. - function testWithdrawSlotsAreDistinctFunctions() external view { - uint16 sender = pointerAt(SLOT_BASE_SENDER); - uint16 token = pointerAt(SLOT_WITHDRAW_TOKEN); - uint16 vaultId = pointerAt(SLOT_WITHDRAW_VAULT_ID); - uint16 before = pointerAt(SLOT_WITHDRAW_VAULT_BEFORE); - uint16 afterPtr = pointerAt(SLOT_WITHDRAW_VAULT_AFTER); - uint16 target = pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT); - - assertTrue(token != sender, "withdraw-token must not be sender"); - assertTrue(vaultId != sender, "withdraw-vault-id must not be sender"); - assertTrue(before != sender, "withdraw-before must not be sender"); - assertTrue(afterPtr != sender, "withdraw-after must not be sender"); - assertTrue(target != sender, "withdraw-target must not be sender"); - - assertTrue(token != vaultId, "withdraw token vs vault-id distinct"); - assertTrue(token != before, "withdraw token vs before distinct"); - assertTrue(token != afterPtr, "withdraw token vs after distinct"); - assertTrue(token != target, "withdraw token vs target distinct"); - assertTrue(vaultId != before, "withdraw vault-id vs before distinct"); - assertTrue(vaultId != afterPtr, "withdraw vault-id vs after distinct"); - assertTrue(vaultId != target, "withdraw vault-id vs target distinct"); - assertTrue(before != afterPtr, "withdraw before vs after distinct"); - assertTrue(before != target, "withdraw before vs target distinct"); - assertTrue(afterPtr != target, "withdraw after vs target distinct"); - } - - /// Pins the withdraw column to the table after the signed context start - /// column (slots 25..31): its row 0/1/2 words alias the order words, and - /// withdraw-target-amount (row 4) is reached by no order word. - function testWithdrawColumnAfterSignedContext() external view { - assertEq( - pointerAt(SLOT_WITHDRAW_TOKEN), - pointerAt(SLOT_CALLING_ORDER_HASH), - "withdraw-token aliases calling-context order-hash (row 0)" - ); - assertEq( - pointerAt(SLOT_WITHDRAW_VAULT_ID), - pointerAt(SLOT_CALLING_ORDER_OWNER), - "withdraw-vault-id aliases calling-context order-owner (row 1)" - ); - assertEq( - pointerAt(SLOT_WITHDRAW_VAULT_BEFORE), - pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "withdraw-vault-before aliases calling-context order-counterparty (row 2)" - ); - assertTrue( - pointerAt(SLOT_CALLING_ORDER_HASH) != pointerAt(SLOT_CALLING_ORDER_OWNER), "order-hash != order-owner" - ); - assertTrue( - pointerAt(SLOT_CALLING_ORDER_OWNER) != pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), - "order-owner != order-counterparty" - ); - uint16 target = pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT); - assertTrue(target != pointerAt(SLOT_CALLING_ORDER_HASH), "withdraw-target != order-hash (row 0)"); - assertTrue(target != pointerAt(SLOT_CALLING_ORDER_OWNER), "withdraw-target != order-owner (row 1)"); - assertTrue( - target != pointerAt(SLOT_CALLING_ORDER_COUNTERPARTY), "withdraw-target != order-counterparty (row 2)" - ); - } - - /// withdraw-token-decimals routes to calling-context row 5, reached by no - /// other word. - function testWithdrawTokenDecimalsWiring() external view { - uint16 withdrawDecimals = pointerAt(SLOT_WITHDRAW_TOKEN_DECIMALS); - assertTrue( - withdrawDecimals != pointerAt(SLOT_WITHDRAW_TARGET_AMOUNT), - "withdraw-token-decimals (row 5) != withdraw-target-amount (row 4)" - ); - assertTrue( - withdrawDecimals != pointerAt(SLOT_DEPOSIT_TOKEN_DECIMALS), - "withdraw-token-decimals != deposit-token-decimals" - ); - assertTrue(withdrawDecimals != pointerAt(SLOT_BASE_SENDER), "withdraw-token-decimals != sender"); - } } diff --git a/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol b/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol index 2edf266f45..2bfc964a70 100644 --- a/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol +++ b/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol @@ -21,8 +21,8 @@ import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {LibTestContextWords} from "test/util/lib/LibTestContextWords.sol"; /// @title RaindexV6ContextWordEntrypointsTest -/// @notice Every deposit context word reads its true value in deposit tasks and -/// reverts out of bounds in every other entrypoint. +/// @notice Every deposit and withdraw context word reads its true value in its +/// own task entrypoint and reverts out of bounds in every other entrypoint. contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { using Strings for address; using Strings for uint256; @@ -152,19 +152,42 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { checks[5] = Check("deposit-token-decimals()", "18"); } + function withdrawChecks() internal view returns (Check[] memory checks) { + checks = new Check[](7); + checks[0] = Check("withdrawer()", ACTOR.toHexString()); + checks[1] = Check("withdraw-token()", address(iToken0).toHexString()); + checks[2] = Check("withdraw-vault-id()", uint256(VAULT_ID).toHexString()); + checks[3] = Check("withdraw-vault-before()", "1"); + checks[4] = Check("withdraw-vault-after()", "0"); + checks[5] = Check("withdraw-target-amount()", "1"); + checks[6] = Check("withdraw-token-decimals()", "18"); + } + + function words() internal pure returns (string[] memory all) { + string[] memory deposit = LibTestContextWords.depositWords(); + string[] memory withdraw = LibTestContextWords.withdrawWords(); + all = new string[](deposit.length + withdraw.length); + for (uint256 i = 0; i < deposit.length; i++) { + all[i] = deposit[i]; + } + for (uint256 i = 0; i < withdraw.length; i++) { + all[deposit.length + i] = withdraw[i]; + } + } + // Task entrypoint runner. function checkTaskFamily(function(TaskV2[] memory) external run, Check[] memory checks) internal { uint256 start = vm.snapshotState(); run(task(checks.length > 0 ? ensures(checks) : ":;")); vm.revertToState(start); - string[] memory words = LibTestContextWords.depositWords(); - for (uint256 i = 0; i < words.length; i++) { - if (inFamily(checks, words[i])) { + string[] memory all = words(); + for (uint256 i = 0; i < all.length; i++) { + if (inFamily(checks, all[i])) { continue; } uint256 snapshot = vm.snapshotState(); - TaskV2[] memory post = task(string.concat(":set(0 ", words[i], ");")); + TaskV2[] memory post = task(string.concat(":set(0 ", all[i], ");")); vm.expectRevert(stdError.indexOOBError); run(post); vm.revertToState(snapshot); @@ -176,7 +199,7 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { } function testWithdrawContextWords() external { - checkTaskFamily(this.doWithdraw, new Check[](0)); + checkTaskFamily(this.doWithdraw, withdrawChecks()); } function testAddOrderContextWords() external { @@ -197,10 +220,10 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { uint256 start = vm.snapshotState(); this.doTake("_ _:1 1;", ":;"); vm.revertToState(start); - string[] memory words = LibTestContextWords.depositWords(); - for (uint256 i = 0; i < words.length; i++) { + string[] memory all = words(); + for (uint256 i = 0; i < all.length; i++) { uint256 snapshot = vm.snapshotState(); - string memory read = string.concat(":set(0 ", words[i], ");"); + string memory read = string.concat(":set(0 ", all[i], ");"); vm.expectRevert(stdError.indexOOBError); if (handle) { this.doTake("_ _:1 1;", read); diff --git a/test/util/lib/LibTestContextWords.sol b/test/util/lib/LibTestContextWords.sol index 4c766d371a..0086680ab8 100644 --- a/test/util/lib/LibTestContextWords.sol +++ b/test/util/lib/LibTestContextWords.sol @@ -14,4 +14,16 @@ library LibTestContextWords { words[5] = "deposit-token-decimals()"; return words; } + + function withdrawWords() internal pure returns (string[] memory) { + string[] memory words = new string[](7); + words[0] = "withdrawer()"; + words[1] = "withdraw-token()"; + words[2] = "withdraw-vault-id()"; + words[3] = "withdraw-vault-before()"; + words[4] = "withdraw-vault-after()"; + words[5] = "withdraw-target-amount()"; + words[6] = "withdraw-token-decimals()"; + return words; + } }