diff --git a/precompiles/Precompiles.sol b/precompiles/Precompiles.sol index 5cb05410..04887da6 100644 --- a/precompiles/Precompiles.sol +++ b/precompiles/Precompiles.sol @@ -19,7 +19,7 @@ contract Precompiles { bytes public constant BYTECODE_BATCH_LOCKUP = hex"6080806040523461001657611f10908161001c8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816337266dd31461125b5750806349a32c4014610eb7578063606ef87514610b6b5780639e743f29146107fc578063a514f83e146104295763f7ca34eb1461006157600080fd5b346103555761006f366115d6565b9283156103ff5760009060005b8581106103cb57506001600160a01b036100999116918483611b81565b6100a284611858565b9260005b8581106100bf57604051806100bb8782611664565b0390f35b6100ca818786611b1e565b6100d3906118a7565b906100df818887611b1e565b6020016100eb906118a7565b85886100f8848284611b1e565b60400161010490611725565b61010f858385611b1e565b60600161011b906118bb565b610126868486611b1e565b608001610132906118bb565b9061013e878587611b1e565b60a00161014a90611b5e565b9287610157818789611b1e565b60c0810161016491611a2a565b96610170929198611b1e565b60e00196604051996101818b6117aa565b6001600160a01b03168a526001600160a01b031660208a01526fffffffffffffffffffffffffffffffff1660408901526001600160a01b038916606089015215156080880152151560a087015264ffffffffff1660c086015236906101e592611a7e565b60e0840152366101f4916119cc565b610100830152604051917f31df3d48000000000000000000000000000000000000000000000000000000008352600483016020905280516001600160a01b0316602484015260208101516001600160a01b0316604484015260408101516fffffffffffffffffffffffffffffffff16606484015260608101516001600160a01b031660848401526080810151151560a484015260a0810151151560c484015260c081015164ffffffffff1660e48401528260e082015161010482016101409052805180610164840152610184830191602001906000905b80821061036e5750505081906103006101006020950151610124840190602080916001600160a01b0381511684520151910152565b03816000885af180156103625760009061032a575b600192506103238288611a05565b52016100a6565b506020823d60201161035a575b81610344602093836117ff565b810103126103555760019151610315565b600080fd5b3d9150610337565b6040513d6000823e3d90fd5b919493509160206060826103bc600194895164ffffffffff604080926fffffffffffffffffffffffffffffffff815116855267ffffffffffffffff6020820151166020860152015116910152565b019501920186939492916102cb565b916001906fffffffffffffffffffffffffffffffff6103f660406103f0878b8a611b1e565b01611725565b1601920161007c565b60046040517ff8bf106c000000000000000000000000000000000000000000000000000000008152fd5b346103555760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610355576104606116a0565b6104686115c0565b9060443567ffffffffffffffff8082116103555736602383011215610355578160040135116103555736602461014083600401350283010111610355578060040135156103ff576000805b826004013582106107c7576104d39150846001600160a01b038516611b81565b6104e08160040135611858565b9160005b826004013581106104fd57604051806100bb8682611664565b61051761051282856004013560248701611b70565b6118a7565b9083610536602061053084846004013560248601611b70565b016118a7565b61054d60406103f085856004013560248701611b70565b9361056b606061056586866004013560248801611b70565b016118bb565b946080956fffffffffffffffffffffffffffffffff6105968861056589896004013560248b01611b70565b926001600160a01b036101006105c78a6105b88160048d013560248e01611b70565b9a602481600401359101611b70565b019681604051976105d789611742565b1687521660208601521660408401526001600160a01b038b166060840152151586830152151560a082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6084360301126103555761075c9261067f60e093604051610644816117c7565b61065060a08501611939565b815261066f8660c095610664878201611939565b602085015201611939565b60408201528385015236906119cc565b83830152604051957f53b157270000000000000000000000000000000000000000000000000000000087526001600160a01b0383511660048801526001600160a01b0360208401511660248801526fffffffffffffffffffffffffffffffff60408401511660448801526001600160a01b0360608401511660648801528201511515608487015260a0820151151560a4870152810151604064ffffffffff918281511660c48901528260208201511660e48901520151166101048601520151610124840190602080916001600160a01b0381511684520151910152565b6020826101648160006001600160a01b0388165af1801561036257600090610794575b6001925061078d8287611a05565b52016104e4565b506020823d6020116107bf575b816107ae602093836117ff565b81010312610355576001915161077f565b3d91506107a1565b6001906fffffffffffffffffffffffffffffffff6107f260406103f086886004013560248a01611b70565b16019101906104b3565b346103555761080a366115d6565b9283156103ff5760009060005b858110610b3d57506001600160a01b036108349116918483611b81565b61083d84611858565b9260005b85811061085657604051806100bb8782611664565b610861818786611b1e565b61086a906118a7565b90610876818887611b1e565b602001610882906118a7565b858861088f848284611b1e565b60400161089b90611725565b6108a6858385611b1e565b6060016108b2906118bb565b6108bd868486611b1e565b6080016108c9906118bb565b906108d5878587611b1e565b60a0016108e190611b5e565b92876108ee818789611b1e565b60c081016108fb916118c8565b96610907929198611b1e565b60e00196604051996109188b6117aa565b6001600160a01b03168a526001600160a01b031660208a01526fffffffffffffffffffffffffffffffff1660408901526001600160a01b038916606089015215156080880152151560a087015264ffffffffff1660c0860152369061097c9261194b565b60e08401523661098b916119cc565b610100830152604051917f32fbe22b000000000000000000000000000000000000000000000000000000008352600483016020905280516001600160a01b0316602484015260208101516001600160a01b0316604484015260408101516fffffffffffffffffffffffffffffffff16606484015260608101516001600160a01b031660848401526080810151151560a484015260a0810151151560c484015260c081015164ffffffffff1660e48401528260e082015161010482016101409052805180610164840152610184830191602001906000905b808210610af4575050508190610a976101006020950151610124840190602080916001600160a01b0381511684520151910152565b03816000885af1801561036257600090610ac1575b60019250610aba8288611a05565b5201610841565b506020823d602011610aec575b81610adb602093836117ff565b810103126103555760019151610aac565b3d9150610ace565b91949350916020604082610b2e600194895164ffffffffff602080926fffffffffffffffffffffffffffffffff8151168552015116910152565b01950192018693949291610a62565b916001906fffffffffffffffffffffffffffffffff610b6260406103f0878b8a611b1e565b16019201610817565b3461035557610b79366115d6565b9283156103ff5760009060005b858110610e8957506001600160a01b03610ba39116918483611b81565b610bac84611858565b9260005b858110610bc557604051806100bb8782611664565b610bd08187866116b6565b610bd9906118a7565b90610be58188876116b6565b602001610bf1906118a7565b8782610bfe81838a6116b6565b604001610c0a90611725565b610c1582848b6116b6565b606001610c21906118bb565b610c2c83858c6116b6565b608001610c38906118bb565b91610c4484868d6116b6565b60a08101610c5191611a2a565b94610c5d91968d6116b6565b60c0019560405198610c6e8a611742565b6001600160a01b031689526001600160a01b031660208901526fffffffffffffffffffffffffffffffff1660408801526001600160a01b038816606088015215156080870152151560a08601523690610cc692611a7e565b60c084015236610cd5916119cc565b60e0830152604051917f54c02292000000000000000000000000000000000000000000000000000000008352600483016020905282610144810182516001600160a01b0316602483015260208301516001600160a01b0316604483015260408301516fffffffffffffffffffffffffffffffff16606483015260608301516001600160a01b031660848301526080830151151560a483015260a0830151151560c483015260c08301519060e4830161012090528151809152610164830191602001906000905b808210610e2c575050508190610dcf60e06020950151610104840190602080916001600160a01b0381511684520151910152565b03816000885af1801561036257600090610df9575b60019250610df28288611a05565b5201610bb0565b506020823d602011610e24575b81610e13602093836117ff565b810103126103555760019151610de4565b3d9150610e06565b91949350916020606082610e7a600194895164ffffffffff604080926fffffffffffffffffffffffffffffffff815116855267ffffffffffffffff6020820151166020860152015116910152565b01950192018693949291610d9b565b916001906fffffffffffffffffffffffffffffffff610eae60406103f0878b8a6116b6565b16019201610b86565b346103555760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035557610eee6116a0565b610ef66115c0565b9060443567ffffffffffffffff8082116103555736602383011215610355578160040135116103555736602461012083600401350283010111610355578060040135156103ff576000805b8260040135821061122657610f619150846001600160a01b038516611b81565b610f6e8160040135611858565b9160005b82600401358110610f8b57604051806100bb8682611664565b610fa061051282856004013560248701611a19565b9083610fb9602061053084846004013560248601611a19565b610fd060406103f085856004013560248701611a19565b93610fe8606061056586866004013560248801611a19565b946080956fffffffffffffffffffffffffffffffff6110138861056589896004013560248b01611a19565b926001600160a01b0360e06110438a6110348160048d013560248e01611a19565b9a602481600401359101611a19565b0196816040519761105389611742565b1687521660208601521660408401526001600160a01b038b166060840152151586830152151560a082015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608436030112610355576111bb926110eb60e0936040516110c08161178e565b6110cc60a08501611939565b81526110db60c0809501611939565b60208201528385015236906119cc565b83830152604051957fab167ccc0000000000000000000000000000000000000000000000000000000087526001600160a01b0383511660048801526001600160a01b0360208401511660248801526fffffffffffffffffffffffffffffffff60408401511660448801526001600160a01b0360608401511660648801528201511515608487015260a0820151151560a4870152810151602064ffffffffff918281511660c489015201511660e48601520151610104840190602080916001600160a01b0381511684520151910152565b6020826101448160006001600160a01b0388165af18015610362576000906111f3575b600192506111ec8287611a05565b5201610f72565b506020823d60201161121e575b8161120d602093836117ff565b8101031261035557600191516111de565b3d9150611200565b6001906fffffffffffffffffffffffffffffffff61125160406103f086886004013560248a01611a19565b1601910190610f41565b3461035557611269366115d6565b93849391929315611598575060009060005b85811061156a57506001600160a01b036112989116918483611b81565b6112a184611858565b9260005b8581106112ba57604051806100bb8782611664565b6112c58187866116b6565b6112ce906118a7565b906112da8188876116b6565b6020016112e6906118a7565b87826112f381838a6116b6565b6040016112ff90611725565b61130a82848b6116b6565b606001611316906118bb565b61132183858c6116b6565b60800161132d906118bb565b9161133984868d6116b6565b60a08101611346916118c8565b9461135291968d6116b6565b60c00195604051986113638a611742565b6001600160a01b031689526001600160a01b031660208901526fffffffffffffffffffffffffffffffff1660408801526001600160a01b038816606088015215156080870152151560a086015236906113bb9261194b565b60c0840152366113ca916119cc565b60e0830152604051917f897f362b000000000000000000000000000000000000000000000000000000008352600483016020905282610144810182516001600160a01b0316602483015260208301516001600160a01b0316604483015260408301516fffffffffffffffffffffffffffffffff16606483015260608301516001600160a01b031660848301526080830151151560a483015260a0830151151560c483015260c08301519060e4830161012090528151809152610164830191602001906000905b8082106115215750505081906114c460e06020950151610104840190602080916001600160a01b0381511684520151910152565b03816000885af18015610362576000906114ee575b600192506114e78288611a05565b52016112a5565b506020823d602011611519575b81611508602093836117ff565b8101031261035557600191516114d9565b3d91506114fb565b9194935091602060408261155b600194895164ffffffffff602080926fffffffffffffffffffffffffffffffff8151168552015116910152565b01950192018693949291611490565b916001906fffffffffffffffffffffffffffffffff61158f60406103f0878b8a6116b6565b1601920161127b565b807ff8bf106c0000000000000000000000000000000000000000000000000000000060049252fd5b602435906001600160a01b038216820361035557565b9060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610355576001600160a01b0391600435838116810361035557926024359081168103610355579160443567ffffffffffffffff9283821161035557806023830112156103555781600401359384116103555760248460051b83010111610355576024019190565b602090602060408183019282815285518094520193019160005b82811061168c575050505090565b83518552938101939281019260010161167e565b600435906001600160a01b038216820361035557565b91908110156116f65760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0181360301821215610355570190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b356fffffffffffffffffffffffffffffffff811681036103555790565b610100810190811067ffffffffffffffff82111761175f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761175f57604052565b610120810190811067ffffffffffffffff82111761175f57604052565b6060810190811067ffffffffffffffff82111761175f57604052565b6080810190811067ffffffffffffffff82111761175f57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761175f57604052565b67ffffffffffffffff811161175f5760051b60200190565b9061186282611840565b61186f60405191826117ff565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061189d8294611840565b0190602036910137565b356001600160a01b03811681036103555790565b3580151581036103555790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610355570180359067ffffffffffffffff821161035557602001918160061b3603831361035557565b35906fffffffffffffffffffffffffffffffff8216820361035557565b359064ffffffffff8216820361035557565b92919261195782611840565b60409261196760405192836117ff565b819581835260208093019160061b84019381851161035557915b84831061199057505050505050565b85838303126103555783869182516119a78161178e565b6119b08661191c565b81526119bd838701611939565b83820152815201920191611981565b9190826040910312610355576040516119e48161178e565b809280356001600160a01b0381168103610355578252602090810135910152565b80518210156116f65760209160051b010190565b91908110156116f657610120020190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610355570180359067ffffffffffffffff82116103555760200191606082023603831361035557565b929192611a8a82611840565b604094611a9a60405192836117ff565b8195848352602080930191606080960285019481861161035557925b858410611ac65750505050505050565b868483031261035557825190611adb826117c7565b611ae48561191c565b8252858501359067ffffffffffffffff8216820361035557828792838b950152611b0f868801611939565b86820152815201930192611ab6565b91908110156116f65760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee181360301821215610355570190565b3564ffffffffff811681036103555790565b91908110156116f657610140020190565b90604080516020907f23b872dd000000000000000000000000000000000000000000000000000000008282015233602482015260449030828201528660648201526064815260a081019080821067ffffffffffffffff83111761175f57611bea91855285611d86565b6001600160a01b0394858516958451917fdd62ed3e0000000000000000000000000000000000000000000000000000000083523060048401521690816024820152838184818a5afa908115611d6357908891600091611d32575b5010611c54575b50505050505050565b8351956000808589017f095ea7b3000000000000000000000000000000000000000000000000000000009a8b82528560248c0152868b0152858a52611c988a6117e3565b89519082855af190611ca8611e12565b82611cff575b5081611cf4575b50611c4b57611ce896611ce394519384015260248301526000818301528152611cdd816117e3565b82611d86565b611d86565b38808080808080611c4b565b90503b151538611cb5565b809192505190858215928315611d1a575b5050509038611cae565b611d2a9350820181019101611d6e565b388581611d10565b809250858092503d8311611d5c575b611d4b81836117ff565b810103126103555787905138611c44565b503d611d41565b85513d6000823e3d90fd5b90816020910312610355575180151581036103555790565b6000806001600160a01b03611db093169360208151910182865af1611da9611e12565b9083611e70565b8051908115159182611df7575b5050611dc65750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b611e0a9250602080918301019101611d6e565b153880611dbd565b3d15611e6b573d9067ffffffffffffffff821161175f5760405191611e5f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846117ff565b82523d6000602084013e565b606090565b90611eaf5750805115611e8557805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580611efa575b611ec0575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b15611eb856fea164736f6c6343000817000a"; bytes public constant BYTECODE_MERKLE_LOCKUP_FACTORY = - hex"6080806040523461001657614200908161001c8239f35b600080fdfe608060405260043610156200001357600080fd5b60003560e01c806389a40c0814620005245763a729a319146200003557600080fd5b346200051f5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200051f5760043567ffffffffffffffff81116200051f576200008990369060040162000930565b73ffffffffffffffffffffffffffffffffffffffff6024351680602435036200051f576044359167ffffffffffffffff83116200051f57366023840112156200051f57826004013567ffffffffffffffff81116200046b5760405193620000f760208360051b01866200088f565b8185526024602086019260061b820101903682116200051f57602401915b818310620004cb575050506000906000906000925b8551841015620001b65767ffffffffffffffff806200014a868962000b3c565b51511691160167ffffffffffffffff811162000187576001909264ffffffffff602062000178878a62000b3c565b5101511601930192916200012a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff9195935016670de0b6b3a764000081036200049a57506200020a6200036860a38651620002ae60208901516200021960408b0151604051978891602080840152604083019062000a44565b03601f1981018852876200088f565b6200025560608b01516200024f60206040518362000241829551809285808601910162000a1f565b81010380845201826200088f565b62000a6b565b90888b7fffffffffff000000000000000000000000000000000000000000000000000000608082015160a083015190620002bd60e060c08601511515950151151595604051998a91602080840152604083019062000b80565b03601f1981018a52896200088f565b604862000311604051809e819c7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009a8b809260601b16602085015260601b1660348301526020815194859301910162000a1f565b8901966048880152606887015260d81b16608885015260f81b608d84015260f81b608e83015260243560601b16608f82015262000358825180936020878501910162000a1f565b010360838101845201826200088f565b60208151910120604051611e158082019082821067ffffffffffffffff8311176200046b578291620003c391620023df843960608152620003ad606082018a62000aad565b9088602082015260408183039101528662000b80565b03906000f580156200045f576020947fee52c9be756b04ff87545717a099143dd3f3a3df3d30ed320884849c5769c22e926200043e73ffffffffffffffffffffffffffffffffffffffff6200042b941696879660405195869560c0875260c087019062000aad565b918a860152848203604086015262000b80565b906060830152606435608083015260843560a08301520390a2604051908152f35b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b602490604051907f1b05170a0000000000000000000000000000000000000000000000000000000082526004820152fd5b6040833603126200051f5760405190620004e58262000872565b83359067ffffffffffffffff821682036200051f5782602092604094526200050f8387016200090f565b8382015281520192019162000115565b600080fd5b346200051f5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200051f5767ffffffffffffffff6004358181116200051f576200057990369060040162000930565b73ffffffffffffffffffffffffffffffffffffffff8060243516602435036200051f5760407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc3601126200051f5760405190620005d68262000872565b64ffffffffff9360443585811681036200051f57835260643594851685036200051f5760209485840152835162000629868601516200063860408801516040519384918b80840152604083019062000a44565b03601f1981018452836200088f565b6200065f60608801516200024f8a6040518362000241829551809285808601910162000a1f565b8860808901519160a08a01519360c08b0151151560e08c01511515906200069f6040519586018d6020908164ffffffffff91828151168552015116910152565b6040855260608501978589108b8a11176200046b576200077d978f977fffffffffff000000000000000000000000000000000000000000000000000000926200073460a39a8d60405260808b019e8f997fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009a8b809360601b16905260601b1660948c0152825192839160a88d01910162000a1f565b88019660a888015260c887015260d81b1660e885015260f81b60ed84015260f81b60ee83015260243560601b1660ef82015281519062000358828d610103840190860162000a1f565b519020604051909161180c90818301908111838210176200046b57829162000bd3833960808152620007de6040620007b9608084018a62000aad565b9287602435168b82015201876020908164ffffffffff91828151168552015116910152565b03906000f580156200045f576200085793827fb905fb2b79e37b53ad42b4bbb04afcfc7c13d2771efe396ad8c687a844662e959362000830931695869560405194859460c0865260c086019062000aad565b92602435168985015260408401906020908164ffffffffff91828151168552015116910152565b608435608083015260a43560a08301520390a2604051908152f35b6040810190811067ffffffffffffffff8211176200046b57604052565b90601f601f19910116810190811067ffffffffffffffff8211176200046b57604052565b81601f820112156200051f5780359067ffffffffffffffff82116200046b5760405192620008ec6020601f19601f86011601856200088f565b828452602083830101116200051f57816000926020809301838601378301015290565b359064ffffffffff821682036200051f57565b359081151582036200051f57565b9190916101009081818503126200051f5760405191820167ffffffffffffffff90838110828211176200046b576040528294823573ffffffffffffffffffffffffffffffffffffffff9081811681036200051f578552602084013590811681036200051f57602085015260408301358281116200051f5781620009b5918501620008b3565b604085015260608301359182116200051f5782620009de60e0949262000a1a94869401620008b3565b606086015260808101356080860152620009fb60a082016200090f565b60a086015262000a0e60c0820162000922565b60c08601520162000922565b910152565b60005b83811062000a335750506000910152565b818101518382015260200162000a22565b90601f19601f60209362000a648151809281875287808801910162000a1f565b0116010190565b60208151910151906020811062000a80575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b9060e08062000b0a62000af761010073ffffffffffffffffffffffffffffffffffffffff808851168752602088015116602087015260408701519080604088015286019062000a44565b6060860151858203606087015262000a44565b936080810151608085015264ffffffffff60a08201511660a085015260c0810151151560c08501520151151591015290565b805182101562000b515760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90815180825260208080930193019160005b82811062000ba1575050505090565b8351805167ffffffffffffffff16865282015164ffffffffff16858301526040909401939281019260010162000b9256fe6101608060405234620005b4576200180c8038038091620000218285620005d5565b83398101908082039160808312620005b45781516001600160401b038111620005b45782019261010084830312620005b4576040519361010085016001600160401b038111868210176200059e5760405280516001600160a01b0381168103620005b45785526020810151926001600160a01b0384168403620005b4576020860193845260408201516001600160401b038111620005b45781620000c79184016200063a565b60408701908152606083015190916001600160401b038211620005b457620000f19184016200063a565b6060870152608082015195608081019687526200011160a0840162000687565b9660a082019788526200013c60e06200012d60c087016200069a565b9560c08501968752016200069a565b60e083019081526020880151959093906001600160a01b0387168703620005b457604090603f190112620005b45760408051989089016001600160401b0381118a8210176200059e57620001a7916060916040526200019e6040820162000687565b8b520162000687565b9460208901958652606084015151602081116200057f57508351600080546001600160a01b0319166001600160a01b0392831617815598511660805251151560a052975164ffffffffff90811660c052975180516001600160401b0381116200056b5760019182548381811c9116801562000560575b60208210146200054c57601f8111620004ff575b50602090601f83116001146200049357606095949392918a918362000487575b5050600019600383901b1c191690821b1790555b5160e052015160405162000299602082816200028b818301968781519384920162000615565b8101038084520182620005d5565b519051906020811062000474575b50610100525115159461012095865261014094838652511669ffffffffff0000000000600354925160281b169160018060501b031916171760035560018060a01b03608051166040519160208301848063095ea7b360e01b9283815260018060a01b03851660248801526000196044880152604487526200032887620005b9565b86519082875af162000339620006a8565b8162000433575b508062000428575b15620003dc575b60405161104290878983620007ca8439608051838181610470015281816107440152610c36015260a05183818161076b0152610b5c015260c05183818161015d01528181610aa801528181610d8f0152610f60015260e0518381816102e2015261066201526101005183610e250152518281816107930152610b1f0152518181816101ae01526109060152f35b6200041d94620004179260405192602084015260018060a01b031660248301526044820152604481526200041081620005b9565b82620006dd565b620006dd565b38808080806200034f565b50823b151562000348565b80518015925082156200044a575b50503862000340565b8192509060209181010312620004705760206200046891016200069a565b388062000441565b8580fd5b6000199060200360031b1b1638620002a7565b01519050388062000251565b838a5260208a209190601f1984168b5b818110620004e857509185949291836060999897959310620004ce575b505050811b01905562000265565b015160001960f88460031b161c19169055388080620004c0565b8284015185559386019360209384019301620004a3565b838a5260208a20601f840160051c8101916020851062000541575b601f0160051c019084905b8281106200053557505062000231565b8b815501849062000525565b90915081906200051a565b634e487b7160e01b8a52602260045260248afd5b90607f16906200021d565b634e487b7160e01b88526041600452602488fd5b6044906040519063a52d539b60e01b8252600482015260206024820152fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b608081019081106001600160401b038211176200059e57604052565b601f909101601f19168101906001600160401b038211908210176200059e57604052565b6001600160401b0381116200059e57601f01601f191660200190565b60005b838110620006295750506000910152565b818101518382015260200162000618565b81601f82011215620005b45780516200065381620005f9565b92620006636040519485620005d5565b81845260208284010111620005b45762000684916020808501910162000615565b90565b519064ffffffffff82168203620005b457565b51908115158203620005b457565b3d15620006d8573d90620006bc82620005f9565b91620006cc6040519384620005d5565b82523d6000602084013e565b606090565b6000806200070a9260018060a01b03169360208151910182865af162000702620006a8565b908362000761565b80519081151591826200073a575b5050620007225750565b60249060405190635274afe760e01b82526004820152fd5b8192509060209181010312620005b45760206200075891016200069a565b15388062000718565b906200078a57508051156200077857805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580620007bf575b6200079d575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156200079456fe608080604052600436101561001357600080fd5b60003560e01c90816306fdde0314610e0e575080631686c90914610b8157806316c3549d14610b445780631bfd681414610b075780633bfe03a814610ad85780633f31ae3f146104945780634800d97f1461044357806349fc73dd1461030557806351e75e8b146102ca57806375829def146101ed57806390e64d13146101d25780639e93e57714610181578063bb4b57341461013f578063ce516507146100fd5763f851a440146100c457600080fd5b346100f85760006003193601126100f857602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b600080fd5b346100f85760206003193601126100f857602061013560043560ff6001918060081c6000526002602052161b60406000205416151590565b6040519015158152f35b346100f85760006003193601126100f857602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760006003193601126100f8576020610135610f58565b346100f85760206003193601126100f857610206610ebc565b60005473ffffffffffffffffffffffffffffffffffffffff8082169233840361027d577fffffffffffffffffffffffff00000000000000000000000000000000000000009350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152336024820152604490fd5b346100f85760006003193601126100f85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f85760006003193601126100f85760405160009060018054908160011c9060018316928315610439575b602093848410811461040a578386529081156103cc5750600114610371575b61036d8461036181880382610f17565b60405191829182610e56565b0390f35b600160009081529294507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106103b9575050508161036d936103619282010193610351565b805485850187015292850192810161039d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858501525050151560051b82010191506103618161036d610351565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610332565b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760806003193601126100f85760243573ffffffffffffffffffffffffffffffffffffffff811681036100f857604435906fffffffffffffffffffffffffffffffff821682036100f85767ffffffffffffffff606435116100f8573660236064350112156100f85767ffffffffffffffff60643560040135116100f8573660246064356004013560051b6064350101116100f8576040516020810190600435825273ffffffffffffffffffffffffffffffffffffffff831660408201526fffffffffffffffffffffffffffffffff841660608201526060815261057a81610efb565b519020604051602081019182526020815261059481610edf565b519020916105a0610f58565b610a7a576105c960043560ff6001918060081c6000526002602052161b60406000205416151590565b610a4857604051926105e760206064356004013560051b0185610f17565b60643560048101358552602401602085015b60246064356004013560051b60643501018210610a38575050906000915b845183101561065e5760208360051b860101519081811060001461064b57600052602052600160406000205b920191610617565b9060005260205260016040600020610643565b83907f000000000000000000000000000000000000000000000000000000000000000003610a0e5760043560081c60005260026020526040600020600160ff600435161b815417905573ffffffffffffffffffffffffffffffffffffffff60005416906040516106cd81610edf565b600081526000602082015260405192610100840184811067ffffffffffffffff8211176109df57604052835273ffffffffffffffffffffffffffffffffffffffff821660208401526fffffffffffffffffffffffffffffffff8416604084015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608401527f0000000000000000000000000000000000000000000000000000000000000000151560808401527f0000000000000000000000000000000000000000000000000000000000000000151560a08401526040516107c581610edf565b64ffffffffff600354818116835260281c16602082015260c084015260e0830152602060e0604051937fab167ccc00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff815116600486015273ffffffffffffffffffffffffffffffffffffffff838201511660248601526fffffffffffffffffffffffffffffffff604082015116604486015273ffffffffffffffffffffffffffffffffffffffff606082015116606486015260808101511515608486015260a0810151151560a486015264ffffffffff8360c08301518281511660c489015201511660e4860152015173ffffffffffffffffffffffffffffffffffffffff815116610104850152015161012483015260208261014481600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af19182156109d35760009261099e575b506020927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d604073ffffffffffffffffffffffffffffffffffffffff85946fffffffffffffffffffffffffffffffff835195600435875216888601521692a3604051908152f35b91506020823d6020116109cb575b816109b960209383610f17565b810103126100f8579051906020610937565b3d91506109ac565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60046040517f0fa7d73c000000000000000000000000000000000000000000000000000000008152fd5b81358152602091820191016105f9565b60246040517f712b37a30000000000000000000000000000000000000000000000000000000081526004356004820152fd5b6040517f442b18410000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b346100f85760006003193601126100f857604060035464ffffffffff825191818116835260281c166020820152f35b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760406003193601126100f857610b9a610ebc565b6024356fffffffffffffffffffffffffffffffff81168091036100f85773ffffffffffffffffffffffffffffffffffffffff8060005416338103610dbf5750610be1610f58565b15610d61576040519060209160008083858401977fa9059cbb000000000000000000000000000000000000000000000000000000008952169687602485015286604485015260448452610c3384610efb565b847f00000000000000000000000000000000000000000000000000000000000000001693519082855af13d15610d55573d67ffffffffffffffff81116109df57610cbc9160405191610cac877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610f17565b82523d60008784013e5b83610f95565b8051848115159182610d34575b50509050610d035750907f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f916000541692604051908152a3005b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b83809293500103126100f8578301518015908115036100f857808488610cc9565b610cbc90606090610cb6565b6040517fe13612970000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152336024820152604490fd5b346100f85760006003193601126100f85761036d907f000000000000000000000000000000000000000000000000000000000000000060208201526020815261036181610edf565b60208082528251818301819052939260005b858110610ea8575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201610e68565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f857565b6040810190811067ffffffffffffffff8211176109df57604052565b6080810190811067ffffffffffffffff8211176109df57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176109df57604052565b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081610f8d575090565b905042101590565b90610fd45750805115610faa57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b8151158061102c575b610fe5575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b15610fdd56fea164736f6c6343000817000a6101608060405234620006e95762001e1590813803809262000022828462000735565b82396060818381010312620006e95780516001600160401b038111620006e9578101916101009283818385010312620006e957604051908482016001600160401b03811183821017620007035760405280516001600160a01b0381168103620006e957825260208101516001600160a01b0381168103620006e957602083015260408101516001600160401b038111620006e957620000c7908486019083016200079a565b604083015260608101516001600160401b038111620006e9576200013491620000f860e0928688019083016200079a565b6060850152608081015160808501526200011560a08201620007e7565b60a08501526200012860c08201620007fa565b60c085015201620007fa565b60e08201526020830151916001600160a01b0383168303620006e9576040840151906001600160401b038211620006e957808501601f838701011215620006e95784820151906001600160401b0382116200070357604051956200019f60208460051b018862000735565b828752602087019382820160208560061b838501010111620006e95793602085830101945b60208560061b828501010186106200068357505050505050606081015151602081116200066457508051600080546001600160a01b0319166001600160a01b03928316178155602083015190911660805260c080830151151560a090815283015164ffffffffff16905260408201518051919290916001600160401b038111620006505760019283548481811c9116801562000645575b60208210146200063157601f8111620005e4575b50602090601f83116001146200057a5760e09392918691836200056e575b5050600019600383901b1c191690841b1783555b608081015182526060810151604051620002db60208281620002cd818301968781519384920162000775565b810103808452018262000735565b51905190602081106200055b575b5087520151151593610120948552610140938452805190835b82811062000499575050505060018060a01b036080511660018060a01b03835116906040519160208301848063095ea7b360e01b92838152846024880152600019604488015260448752620003578762000719565b86519082875af16200036862000808565b8162000458575b50806200044d575b1562000409575b6040516114eb9087898b846200092a85396080518481816104e2015281816108550152610f1c015260a05184818161087c0152610e42015260c05184818161022001528181610dbd015281816110750152611246015260e05184818161035401526106ba0152518361110b0152518281816108a40152610e0501525181818161012a0152610a0e0152f35b62000442946200043c926040519260208401526024830152604482015260448152620004358162000719565b826200083d565b6200083d565b38808080806200037e565b50823b151562000377565b80518015925082156200046f575b5050386200036f565b8192509060209181010312620004955760206200048d9101620007fa565b388062000466565b8580fd5b8151811015620005475760208160051b8301015160038054906801000000000000000082101562000533578682018082558210156200051f578752602080882083519201805493909101516cffffffffff000000000000000060409190911b166001600160401b039092166001600160681b031990931692909217179055830162000302565b634e487b7160e01b88526032600452602488fd5b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b85526032600452602485fd5b6000199060200360031b1b1638620002e9565b0151905038806200028d565b92918491601f198216908388526020882091885b818110620005cb5750958360e09710620005b1575b505050811b018355620002a1565b015160001960f88460031b161c19169055388080620005a3565b828801518455889590930192602092830192016200058e565b84865260208620601f840160051c8101916020851062000626575b601f0160051c019085905b8281106200061a5750506200026f565b8781550185906200060a565b9091508190620005ff565b634e487b7160e01b86526022600452602486fd5b90607f16906200025b565b634e487b7160e01b84526041600452602484fd5b6044906040519063a52d539b60e01b8252600482015260206024820152fd5b6040868585010312620006e957604080519081016001600160401b03811182821017620006ee5760405286516001600160401b0381168103620006e95760209382859260409452620006d7838b01620007e7565b838201528152019601959150620001c4565b600080fd5b60246000634e487b7160e01b81526041600452fd5b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b038211176200070357604052565b601f909101601f19168101906001600160401b038211908210176200070357604052565b6001600160401b0381116200070357601f01601f191660200190565b60005b838110620007895750506000910152565b818101518382015260200162000778565b81601f82011215620006e9578051620007b38162000759565b92620007c3604051948562000735565b81845260208284010111620006e957620007e4916020808501910162000775565b90565b519064ffffffffff82168203620006e957565b51908115158203620006e957565b3d1562000838573d906200081c8262000759565b916200082c604051938462000735565b82523d6000602084013e565b606090565b6000806200086a9260018060a01b03169360208151910182865af16200086262000808565b9083620008c1565b80519081151591826200089a575b5050620008825750565b60249060405190635274afe760e01b82526004820152fd5b8192509060209181010312620006e9576020620008b89101620007fa565b15388062000878565b90620008ea5750805115620008d857805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806200091f575b620008fd575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15620008f456fe608080604052600436101561001357600080fd5b60003560e01c90816306fdde03146110f4575080631686c90914610e6757806316c3549d14610e2a5780631bfd681414610ded5780633f31ae3f146105065780634800d97f146104b557806349fc73dd1461037757806351e75e8b1461033c57806375829def1461025f57806390e64d1314610244578063bb4b573414610202578063bf4ed03f14610190578063ce5165071461014e578063da792468146100fd5763f851a440146100c457600080fd5b346100f85760006003193601126100f857602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b600080fd5b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760206003193601126100f857602061018660043560ff6001918060081c6000526002602052161b60406000205416151590565b6040519015158152f35b346100f85760006003193601126100f8576101a9611293565b6040516020918282018383528151809152836040840192019360005b8281106101d25784840385f35b8551805167ffffffffffffffff16855282015164ffffffffff1684830152948101946040909301926001016101c5565b346100f85760006003193601126100f857602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760006003193601126100f857602061018661123e565b346100f85760206003193601126100f8576102786111a2565b60005473ffffffffffffffffffffffffffffffffffffffff808216923384036102ef577fffffffffffffffffffffffff00000000000000000000000000000000000000009350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152336024820152604490fd5b346100f85760006003193601126100f85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f85760006003193601126100f85760405160009060018054908160011c90600183169283156104ab575b602093848410811461047c5783865290811561043e57506001146103e3575b6103df846103d3818803826111fd565b6040519182918261113c565b0390f35b600160009081529294507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b82841061042b57505050816103df936103d392820101936103c3565b805485850187015292850192810161040f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858501525050151560051b82010191506103d3816103df6103c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916103a4565b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760806003193601126100f85760243573ffffffffffffffffffffffffffffffffffffffff811681036100f8576fffffffffffffffffffffffffffffffff60443516604435036100f85767ffffffffffffffff606435116100f8573660236064350112156100f857606435600401359067ffffffffffffffff82116100f85760248260051b60643501013681116100f8576040516020810190600435825273ffffffffffffffffffffffffffffffffffffffff841660408201526fffffffffffffffffffffffffffffffff604435166060820152606081526105eb816111e1565b5190206040516020810191825260208152610605816111c5565b5190209061061161123e565b610d8f5761063a60043560ff6001918060081c6000526002602052161b60406000205416151590565b610d5d576106478461127b565b9361065560405195866111fd565b8452606435602401602085015b828210610d4d575050506000905b83518210156106b657610683828561132e565b5190818110156106a357600052602052600160406000205b910190610670565b906000526020526001604060002061069b565b90507f000000000000000000000000000000000000000000000000000000000000000003610d23576106e6611293565b90600082516106f48161127b565b9361070260405195866111fd565b8185527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061072f8361127b565b0160005b818110610cfe5750506000905b828210610bd95750506fffffffffffffffffffffffffffffffff82166fffffffffffffffffffffffffffffffff604435168111610baa576fffffffffffffffffffffffffffffffff6044351611610b56575b505060043560081c60005260026020526040600020600160ff600435161b815417905573ffffffffffffffffffffffffffffffffffffffff6000541691604051906107dc826111c5565b600082526000602083015260405193610100850185811067ffffffffffffffff821117610b2757604052845273ffffffffffffffffffffffffffffffffffffffff831660208501526fffffffffffffffffffffffffffffffff60443516604085015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608501527f0000000000000000000000000000000000000000000000000000000000000000151560808501527f0000000000000000000000000000000000000000000000000000000000000000151560a085015260c084015260e0830152604051917f897f362b0000000000000000000000000000000000000000000000000000000083526020600484015282610144810173ffffffffffffffffffffffffffffffffffffffff835116602483015273ffffffffffffffffffffffffffffffffffffffff60208401511660448301526fffffffffffffffffffffffffffffffff604084015116606483015273ffffffffffffffffffffffffffffffffffffffff60608401511660848301526080830151151560a483015260a0830151151560c483015260c08301519061012060e484015281518091526020610164840192019060005b818110610ae9575050508190602060e08195015173ffffffffffffffffffffffffffffffffffffffff81511661010485015201516101248301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1918215610add57600092610aa8575b60208380847f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d604073ffffffffffffffffffffffffffffffffffffffff81519360043585526fffffffffffffffffffffffffffffffff60443516888601521692a3604051908152f35b91506020823d602011610ad5575b81610ac3602093836111fd565b810103126100f8576020915191610a3f565b3d9150610ab6565b6040513d6000823e3d90fd5b825180516fffffffffffffffffffffffffffffffff16855260209081015164ffffffffff1681860152889550604090940193909201916001016109b9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6fffffffffffffffffffffffffffffffff610b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8293018661132e565b5192604435031681835116011690528280610792565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b9092610c0e67ffffffffffffffff610bf1868561132e565b5151166fffffffffffffffffffffffffffffffff60443516611371565b6fffffffffffffffffffffffffffffffff8111610ccd576fffffffffffffffffffffffffffffffff8091169164ffffffffff6020610c4c888761132e565b5101511660405190610c5d826111c5565b8482526020820152610c6f878a61132e565b52610c7a868961132e565b5016016fffffffffffffffffffffffffffffffff8111610c9e579260010190610740565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b602490604051907f4916adce0000000000000000000000000000000000000000000000000000000082526004820152fd5b602090604051610d0d816111c5565b6000815260008382015282828a01015201610733565b60046040517f0fa7d73c000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610662565b60246040517f712b37a30000000000000000000000000000000000000000000000000000000081526004356004820152fd5b6040517f442b18410000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760406003193601126100f857610e806111a2565b6024356fffffffffffffffffffffffffffffffff81168091036100f85773ffffffffffffffffffffffffffffffffffffffff80600054163381036110a55750610ec761123e565b15611047576040519060209160008083858401977fa9059cbb000000000000000000000000000000000000000000000000000000008952169687602485015286604485015260448452610f19846111e1565b847f00000000000000000000000000000000000000000000000000000000000000001693519082855af13d1561103b573d67ffffffffffffffff8111610b2757610fa29160405191610f92877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846111fd565b82523d60008784013e5b8361143e565b805184811515918261101a575b50509050610fe95750907f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f916000541692604051908152a3005b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b83809293500103126100f8578301518015908115036100f857808488610faf565b610fa290606090610f9c565b6040517fe13612970000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152336024820152604490fd5b346100f85760006003193601126100f8576103df907f00000000000000000000000000000000000000000000000000000000000000006020820152602081526103d3816111c5565b60208082528251818301819052939260005b85811061118e575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b81810183015184820160400152820161114e565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f857565b6040810190811067ffffffffffffffff821117610b2757604052565b6080810190811067ffffffffffffffff821117610b2757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b2757604052565b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081611273575090565b905042101590565b67ffffffffffffffff8111610b275760051b60200190565b600354906112a08261127b565b9160406112b060405194856111fd565b8184528360208091019160036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000935b8585106112f457505050505050565b60018481928451611304816111c5565b64ffffffffff875467ffffffffffffffff81168352871c16838201528152019301940193916112e5565b80518210156113425760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8382098382029182808310920391808303921461142d57670de0b6b3a764000090818310156113f657947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b9061147d575080511561145357805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806114d5575b61148e575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561148656fea164736f6c6343000817000aa164736f6c6343000817000a"; + hex"6080806040523461001657614398908161001c8239f35b600080fdfe604060805260c06080515260043610156200001957600080fd5b6000803560e01c8063769bed20146200054f5763b0df6f4e146200003c57600080fd5b346200054c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200054c5767ffffffffffffffff60043581811162000544576200009190369060040162000a9e565b9160249182359273ffffffffffffffffffffffffffffffffffffffff92838516958686036200054857604435848111620005445736602382011215620005445780600401359785891162000517576020916080515199620000f8848260051b018c620009bc565b808b5286848c019160061b8301019136831162000513578701905b828210620004c457505050909183968485985b8b518a1015620001a757888087620001408f8e9062000cc8565b510151169116018881116200017b57949392919060019064ffffffffff620001698c8f62000cc8565b51511601990198909192939462000126565b87877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b918689898d8f97968316670de0b6b3a7640000810362000493575086518a89898281015115159360805182015194606083015196608084015192608051519485888101958987526080518201620001fe9162000bb2565b03947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0958681018852620002339088620009bc565b60a08201519660c08301518a60805151828193519081848085019201916200025b9262000b8d565b810103808352016200026e9082620009bc565b620002799062000bf7565b9260e001511515936080515197888c81019b8d8d5260805182016200029e9162000d0c565b039081018952620002b09089620009bc565b608051519c8d9c8d9c8d019e8f997fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009a8b809660601b16905260f81b906034015260d81b7fffffffffff0000000000000000000000000000000000000000000000000000001660358d015260601b16603a8b0152519081604e8b01620003369262000b8d565b880195604e870152606e86015260f81b608e85015260601b16608f83015251918260a38301620003669262000b8d565b010360838101825260a3016200037d9082620009bc565b519020916080515191611e1b9081840192848410908411176200046857508291620003d19162002571843960608152620003bb606082018a62000c39565b908b8d8201528082039060805101528962000d0c565b039083f59081156200045b575091620004397fbac0e8860aa7a297dc546300f9e29ba273fd81a99ebfc7517a4e630e68a9642694926200042594169687966080515195869560c0875260c087019062000c39565b918a86015284820360805186015262000d0c565b906060830152606435608083015260843560a08301520390a260805151908152f35b60805151903d90823e3d90fd5b857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b905060805151907f1b05170a0000000000000000000000000000000000000000000000000000000082526004820152fd5b60805182360312620005135760805151620004df8162000970565b620004ea8362000a11565b8152858301358a811681036200050f5786820152815260805190910190840162000113565b8880fd5b8680fd5b5050507f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8280fd5b5080fd5b80fd5b50346200054c5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200054c5767ffffffffffffffff6004358181116200054457620005a590369060040162000a9e565b9173ffffffffffffffffffffffffffffffffffffffff908160243516602435036200054c576080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc3601126200054c576080515192620006068462000970565b64ffffffffff60443581811681036200096c57855260643590811681036200054457602060a05260a051850152845160a05186015115156080518701519162000673606089015192620006a060808b01516080515193849160a05160a05184015260805183019062000bb2565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283620009bc565b60a08a015191620006e860c08c0151620006e26080515182620006d1829451809260a05185019060a0510162000b8d565b81010380835260a0510182620009bc565b62000bf7565b60e08c01511515916080515195620007198d60a0518901906020908164ffffffffff91828151168552015116910152565b608051875260608701978789108b8a11176200093f57916200080f9795939160a39795938a608051527fffffffffff000000000000000000000000000000000000000000000000000000608089019c8d977fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009889809660601b16905260f81b60948b015260d81b16609589015260601b16609a870152620007c68151809260ae89019060a0510162000b8d565b85019360ae85015260ce84015260f81b60ee83015260243560601b1660ef820152815190620007ff82610103830160a051860162000b8d565b01036083810184520182620009bc565b51902060805151909161181280830191821183831017620009125790829162000d5f833960808152620008746200084a608083018a62000c39565b91876024351660a05182015260805101886020908164ffffffffff91828151168552015116910152565b039083f59081156200045b5750620008f293827f2ba0fe49588281dbb122dd3b7f3e2b3396338f70dbe3c62bf3e3888b4ba7ffb893620008c893169586956080515194859460c0865260c086019062000c39565b926024351660a0518501526080518401906020908164ffffffffff91828151168552015116910152565b608435608083015260a43560a08301520390a26080515190815260a05190f35b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8380fd5b6040810190811067ffffffffffffffff8211176200098d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176200098d57604052565b3590811515820362000a0c57565b600080fd5b359064ffffffffff8216820362000a0c57565b81601f8201121562000a0c5780359067ffffffffffffffff82116200098d576040519262000a7b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185620009bc565b8284526020838301011162000a0c57816000926020809301838601378301015290565b91909161010090818185031262000a0c5760405191820167ffffffffffffffff90838110828211176200098d576040528294823573ffffffffffffffffffffffffffffffffffffffff90818116810362000a0c57855262000b0260208501620009fe565b602086015262000b156040850162000a11565b60408601526060840135908116810362000a0c576060850152608083013582811162000a0c578162000b4991850162000a24565b608085015260a083013560a085015260c083013591821162000a0c578262000b7c60e0949262000b889486940162000a24565b60c086015201620009fe565b910152565b60005b83811062000ba15750506000910152565b818101518382015260200162000b90565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000bf08151809281875287808801910162000b8d565b0116010190565b60208151910151906020811062000c0c575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b9060e08062000cbd62000ca061010073ffffffffffffffffffffffffffffffffffffffff80885116875260208801511515602088015264ffffffffff6040890151166040880152606088015116606087015260808701519080608088015286019062000bb2565b60a086015160a086015260c086015185820360c087015262000bb2565b930151151591015290565b805182101562000cdd5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90815180825260208080930193019160005b82811062000d2d575050505090565b8351805164ffffffffff16865282015167ffffffffffffffff16858301526040909401939281019260010162000d1e56fe6101608060405234620005ba57620018128038038091620000218285620005db565b833981019080820360808112620005ba5781516001600160401b038111620005ba5782019061010082850312620005ba576040519361010085016001600160401b03811186821017620005a45760405282516001600160a01b0381168103620005ba5785526200009460208401620005ff565b9260208601938452620000aa604082016200060d565b604087019081526060820151909690926001600160a01b0384168403620005ba576060820193845260808301516001600160401b038111620005ba5781620000f491850162000661565b6080830190815260a08085015190840190815260c085015191949092906001600160401b038311620005ba576200013460e0926200014094830162000661565b60c086015201620005ff565b60e083019081526020880151959093906001600160a01b0387168703620005ba57604090603f190112620005ba5760408051989089016001600160401b0381118a821017620005a457620001ab91606091604052620001a2604082016200060d565b8b52016200060d565b946020890195865260c0840151516020811162000585575051600080546001600160a01b0319166001600160a01b0392831617815584519091166080529651151560a052975164ffffffffff90811660c052975180516001600160401b038111620005715760019182548381811c9116801562000566575b60208210146200055257601f811162000505575b50602090601f8311600114620004995760c095949392918a91836200048d575b5050600019600383901b1c191690821b1790555b5160e05201516040516200029f602082816200029181830196878151938492016200063c565b8101038084520182620005db565b51905190602081106200047a575b50610100525115159461012095865261014094838652511669ffffffffff0000000000600354925160281b169160018060501b031916171760035560018060a01b03608051166040519160208301848063095ea7b360e01b9283815260018060a01b03851660248801526000196044880152604487526200032e87620005bf565b86519082875af16200033f620006ae565b8162000439575b50806200042e575b15620003e2575b60405161104290878983620007d08439608051838181610470015281816107440152610c36015260a05183818161076b0152610b5c015260c05183818161015d01528181610aa801528181610d8f0152610f60015260e0518381816102e2015261066201526101005183610e250152518281816107930152610b1f0152518181816101ae01526109060152f35b62000423946200041d9260405192602084015260018060a01b031660248301526044820152604481526200041681620005bf565b82620006e3565b620006e3565b388080808062000355565b50823b15156200034e565b805180159250821562000450575b50503862000346565b8192509060209181010312620004765760206200046e9101620005ff565b388062000447565b8580fd5b6000199060200360031b1b1638620002ad565b01519050388062000257565b838a5260208a209190601f1984168b5b818110620004ee575091859492918360c0999897959310620004d4575b505050811b0190556200026b565b015160001960f88460031b161c19169055388080620004c6565b8284015185559386019360209384019301620004a9565b838a5260208a20601f840160051c8101916020851062000547575b601f0160051c019084905b8281106200053b57505062000237565b8b81550184906200052b565b909150819062000520565b634e487b7160e01b8a52602260045260248afd5b90607f169062000223565b634e487b7160e01b88526041600452602488fd5b6044906040519063a52d539b60e01b8252600482015260206024820152fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b608081019081106001600160401b03821117620005a457604052565b601f909101601f19168101906001600160401b03821190821017620005a457604052565b51908115158203620005ba57565b519064ffffffffff82168203620005ba57565b6001600160401b038111620005a457601f01601f191660200190565b60005b838110620006505750506000910152565b81810151838201526020016200063f565b81601f82011215620005ba5780516200067a8162000620565b926200068a6040519485620005db565b81845260208284010111620005ba57620006ab91602080850191016200063c565b90565b3d15620006de573d90620006c28262000620565b91620006d26040519384620005db565b82523d6000602084013e565b606090565b600080620007109260018060a01b03169360208151910182865af162000708620006ae565b908362000767565b805190811515918262000740575b5050620007285750565b60249060405190635274afe760e01b82526004820152fd5b8192509060209181010312620005ba5760206200075e9101620005ff565b1538806200071e565b906200079057508051156200077e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580620007c5575b620007a3575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156200079a56fe608080604052600436101561001357600080fd5b60003560e01c90816306fdde0314610e0e575080631686c90914610b8157806316c3549d14610b445780631bfd681414610b075780633bfe03a814610ad85780633f31ae3f146104945780634800d97f1461044357806349fc73dd1461030557806351e75e8b146102ca57806375829def146101ed57806390e64d13146101d25780639e93e57714610181578063bb4b57341461013f578063ce516507146100fd5763f851a440146100c457600080fd5b346100f85760006003193601126100f857602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b600080fd5b346100f85760206003193601126100f857602061013560043560ff6001918060081c6000526002602052161b60406000205416151590565b6040519015158152f35b346100f85760006003193601126100f857602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760006003193601126100f8576020610135610f58565b346100f85760206003193601126100f857610206610ebc565b60005473ffffffffffffffffffffffffffffffffffffffff8082169233840361027d577fffffffffffffffffffffffff00000000000000000000000000000000000000009350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152336024820152604490fd5b346100f85760006003193601126100f85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f85760006003193601126100f85760405160009060018054908160011c9060018316928315610439575b602093848410811461040a578386529081156103cc5750600114610371575b61036d8461036181880382610f17565b60405191829182610e56565b0390f35b600160009081529294507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106103b9575050508161036d936103619282010193610351565b805485850187015292850192810161039d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858501525050151560051b82010191506103618161036d610351565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610332565b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760806003193601126100f85760243573ffffffffffffffffffffffffffffffffffffffff811681036100f857604435906fffffffffffffffffffffffffffffffff821682036100f85767ffffffffffffffff606435116100f8573660236064350112156100f85767ffffffffffffffff60643560040135116100f8573660246064356004013560051b6064350101116100f8576040516020810190600435825273ffffffffffffffffffffffffffffffffffffffff831660408201526fffffffffffffffffffffffffffffffff841660608201526060815261057a81610efb565b519020604051602081019182526020815261059481610edf565b519020916105a0610f58565b610a7a576105c960043560ff6001918060081c6000526002602052161b60406000205416151590565b610a4857604051926105e760206064356004013560051b0185610f17565b60643560048101358552602401602085015b60246064356004013560051b60643501018210610a38575050906000915b845183101561065e5760208360051b860101519081811060001461064b57600052602052600160406000205b920191610617565b9060005260205260016040600020610643565b83907f000000000000000000000000000000000000000000000000000000000000000003610a0e5760043560081c60005260026020526040600020600160ff600435161b815417905573ffffffffffffffffffffffffffffffffffffffff60005416906040516106cd81610edf565b600081526000602082015260405192610100840184811067ffffffffffffffff8211176109df57604052835273ffffffffffffffffffffffffffffffffffffffff821660208401526fffffffffffffffffffffffffffffffff8416604084015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608401527f0000000000000000000000000000000000000000000000000000000000000000151560808401527f0000000000000000000000000000000000000000000000000000000000000000151560a08401526040516107c581610edf565b64ffffffffff600354818116835260281c16602082015260c084015260e0830152602060e0604051937fab167ccc00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff815116600486015273ffffffffffffffffffffffffffffffffffffffff838201511660248601526fffffffffffffffffffffffffffffffff604082015116604486015273ffffffffffffffffffffffffffffffffffffffff606082015116606486015260808101511515608486015260a0810151151560a486015264ffffffffff8360c08301518281511660c489015201511660e4860152015173ffffffffffffffffffffffffffffffffffffffff815116610104850152015161012483015260208261014481600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af19182156109d35760009261099e575b506020927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d604073ffffffffffffffffffffffffffffffffffffffff85946fffffffffffffffffffffffffffffffff835195600435875216888601521692a3604051908152f35b91506020823d6020116109cb575b816109b960209383610f17565b810103126100f8579051906020610937565b3d91506109ac565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60046040517f0fa7d73c000000000000000000000000000000000000000000000000000000008152fd5b81358152602091820191016105f9565b60246040517f712b37a30000000000000000000000000000000000000000000000000000000081526004356004820152fd5b6040517f442b18410000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b346100f85760006003193601126100f857604060035464ffffffffff825191818116835260281c166020820152f35b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760406003193601126100f857610b9a610ebc565b6024356fffffffffffffffffffffffffffffffff81168091036100f85773ffffffffffffffffffffffffffffffffffffffff8060005416338103610dbf5750610be1610f58565b15610d61576040519060209160008083858401977fa9059cbb000000000000000000000000000000000000000000000000000000008952169687602485015286604485015260448452610c3384610efb565b847f00000000000000000000000000000000000000000000000000000000000000001693519082855af13d15610d55573d67ffffffffffffffff81116109df57610cbc9160405191610cac877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610f17565b82523d60008784013e5b83610f95565b8051848115159182610d34575b50509050610d035750907f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f916000541692604051908152a3005b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b83809293500103126100f8578301518015908115036100f857808488610cc9565b610cbc90606090610cb6565b6040517fe13612970000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152336024820152604490fd5b346100f85760006003193601126100f85761036d907f000000000000000000000000000000000000000000000000000000000000000060208201526020815261036181610edf565b60208082528251818301819052939260005b858110610ea8575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201610e68565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f857565b6040810190811067ffffffffffffffff8211176109df57604052565b6080810190811067ffffffffffffffff8211176109df57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176109df57604052565b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081610f8d575090565b905042101590565b90610fd45750805115610faa57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b8151158061102c575b610fe5575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b15610fdd56fea164736f6c6343000817000a6101608060405234620006ee5762001e1b9081380380926200002282846200073a565b82396060818381010312620006ee5780516001600160401b038111620006ee578101916101009283818385010312620006ee57604051908482016001600160401b03811183821017620007085760405280516001600160a01b0381168103620006ee57825262000095602082016200075e565b6020830152620000a8604082016200076c565b604083015260608101516001600160a01b0381168103620006ee57606083015260808101516001600160401b038111620006ee57620000ed90848601908301620007c0565b608083015260a0818101519083015260c08101516001600160401b038111620006ee5762000134916200012860e092868801908301620007c0565b60c0850152016200075e565b60e08201526020830151916001600160a01b0383168303620006ee576040840151906001600160401b038211620006ee57808501601f838701011215620006ee5784820151906001600160401b0382116200070857604051956200019f60208460051b01886200073a565b828752602087019382820160208560061b838501010111620006ee5793602085830101945b60208560061b82850101018610620006825750505050505060c081015151602081116200066357506060810151600080546001600160a01b0319166001600160a01b03928316178155825190911660809081526020830151151560a052604083015164ffffffffff90811660c052908301518051919592939092916001600160401b0381116200064f5760019384548581811c9116801562000644575b60208210146200063057601f8111620005e3575b50602090601f8311600114620005795760e09392918791836200056d575b5050600019600383901b1c191690851b1784555b60a0810151825260c0810151604051620002e160208281620002d381830196878151938492016200079b565b81010380845201826200073a565b51905190602081106200055a575b5088520151151594610120958652610140948552815191845b838110620004a057505050505060018060a01b036080511660018060a01b03835116906040519160208301848063095ea7b360e01b928381528460248801526000196044880152604487526200035e876200071e565b86519082875af16200036f6200080d565b816200045f575b508062000454575b1562000410575b6040516114ec9087898b846200092f85396080518481816104e2015281816108550152610f1c015260a05184818161087c0152610e42015260c05184818161022001528181610dbd015281816110750152611246015260e05184818161035401526106ba0152518361110b0152518281816108a40152610e0501525181818161012a0152610a0e0152f35b6200044994620004439260405192602084015260248301526044820152604481526200043c816200071e565b8262000842565b62000842565b388080808062000385565b50823b15156200037e565b805180159250821562000476575b50503862000376565b81925090602091810103126200049c5760206200049491016200075e565b38806200046d565b8580fd5b8151811015620005465760208160051b8301015160038054906801000000000000000082101562000532578782018082558210156200051e578852602080892083519201805491909301516001600160681b03199091169186169190911760289190911b6cffffffffffffffff000000000016179055840162000308565b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b89526041600452602489fd5b634e487b7160e01b86526032600452602486fd5b6000199060200360031b1b1638620002ef565b01519050388062000293565b92918591601f198216908389526020892091895b818110620005ca5750958360e09710620005b0575b505050811b018455620002a7565b015160001960f88460031b161c19169055388080620005a2565b828801518455899590930192602092830192016200058d565b85875260208720601f840160051c8101916020851062000625575b601f0160051c019086905b8281106200061957505062000275565b88815501869062000609565b9091508190620005fe565b634e487b7160e01b87526022600452602487fd5b90607f169062000261565b634e487b7160e01b85526041600452602485fd5b6044906040519063a52d539b60e01b8252600482015260206024820152fd5b6040868585010312620006ee57604080519081018082116001600160401b0390911117620006f35760408101604052620006bc876200076c565b815260208701516001600160401b0381168103620006ee576020938285928360409501528152019601959150620001c4565b600080fd5b60246000634e487b7160e01b81526041600452fd5b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b038211176200070857604052565b601f909101601f19168101906001600160401b038211908210176200070857604052565b51908115158203620006ee57565b519064ffffffffff82168203620006ee57565b6001600160401b0381116200070857601f01601f191660200190565b60005b838110620007af5750506000910152565b81810151838201526020016200079e565b81601f82011215620006ee578051620007d9816200077f565b92620007e960405194856200073a565b81845260208284010111620006ee576200080a91602080850191016200079b565b90565b3d156200083d573d9062000821826200077f565b916200083160405193846200073a565b82523d6000602084013e565b606090565b6000806200086f9260018060a01b03169360208151910182865af1620008676200080d565b9083620008c6565b80519081151591826200089f575b5050620008875750565b60249060405190635274afe760e01b82526004820152fd5b8192509060209181010312620006ee576020620008bd91016200075e565b1538806200087d565b90620008ef5750805115620008dd57805190602001fd5b604051630a12f52160e11b8152600490fd5b8151158062000924575b62000902575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15620008f956fe608080604052600436101561001357600080fd5b60003560e01c90816306fdde03146110f4575080631686c90914610e6757806316c3549d14610e2a5780631bfd681414610ded5780633f31ae3f146105065780634800d97f146104b557806349fc73dd1461037757806351e75e8b1461033c57806375829def1461025f57806390e64d1314610244578063bb4b573414610202578063bf4ed03f14610190578063ce5165071461014e578063da792468146100fd5763f851a440146100c457600080fd5b346100f85760006003193601126100f857602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b600080fd5b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760206003193601126100f857602061018660043560ff6001918060081c6000526002602052161b60406000205416151590565b6040519015158152f35b346100f85760006003193601126100f8576101a9611293565b6040516020918282018383528151809152836040840192019360005b8281106101d25784840385f35b8551805164ffffffffff16855282015167ffffffffffffffff1684830152948101946040909301926001016101c5565b346100f85760006003193601126100f857602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760006003193601126100f857602061018661123e565b346100f85760206003193601126100f8576102786111a2565b60005473ffffffffffffffffffffffffffffffffffffffff808216923384036102ef577fffffffffffffffffffffffff00000000000000000000000000000000000000009350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152336024820152604490fd5b346100f85760006003193601126100f85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f85760006003193601126100f85760405160009060018054908160011c90600183169283156104ab575b602093848410811461047c5783865290811561043e57506001146103e3575b6103df846103d3818803826111fd565b6040519182918261113c565b0390f35b600160009081529294507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b82841061042b57505050816103df936103d392820101936103c3565b805485850187015292850192810161040f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858501525050151560051b82010191506103d3816103df6103c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916103a4565b346100f85760006003193601126100f857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f85760806003193601126100f85760243573ffffffffffffffffffffffffffffffffffffffff811681036100f8576fffffffffffffffffffffffffffffffff60443516604435036100f85767ffffffffffffffff606435116100f8573660236064350112156100f857606435600401359067ffffffffffffffff82116100f85760248260051b60643501013681116100f8576040516020810190600435825273ffffffffffffffffffffffffffffffffffffffff841660408201526fffffffffffffffffffffffffffffffff604435166060820152606081526105eb816111e1565b5190206040516020810191825260208152610605816111c5565b5190209061061161123e565b610d8f5761063a60043560ff6001918060081c6000526002602052161b60406000205416151590565b610d5d576106478461127b565b9361065560405195866111fd565b8452606435602401602085015b828210610d4d575050506000905b83518210156106b657610683828561132f565b5190818110156106a357600052602052600160406000205b910190610670565b906000526020526001604060002061069b565b90507f000000000000000000000000000000000000000000000000000000000000000003610d23576106e6611293565b90600082516106f48161127b565b9361070260405195866111fd565b8185527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061072f8361127b565b0160005b818110610cfe5750506000905b828210610bd95750506fffffffffffffffffffffffffffffffff82166fffffffffffffffffffffffffffffffff604435168111610baa576fffffffffffffffffffffffffffffffff6044351611610b56575b505060043560081c60005260026020526040600020600160ff600435161b815417905573ffffffffffffffffffffffffffffffffffffffff6000541691604051906107dc826111c5565b600082526000602083015260405193610100850185811067ffffffffffffffff821117610b2757604052845273ffffffffffffffffffffffffffffffffffffffff831660208501526fffffffffffffffffffffffffffffffff60443516604085015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608501527f0000000000000000000000000000000000000000000000000000000000000000151560808501527f0000000000000000000000000000000000000000000000000000000000000000151560a085015260c084015260e0830152604051917f897f362b0000000000000000000000000000000000000000000000000000000083526020600484015282610144810173ffffffffffffffffffffffffffffffffffffffff835116602483015273ffffffffffffffffffffffffffffffffffffffff60208401511660448301526fffffffffffffffffffffffffffffffff604084015116606483015273ffffffffffffffffffffffffffffffffffffffff60608401511660848301526080830151151560a483015260a0830151151560c483015260c08301519061012060e484015281518091526020610164840192019060005b818110610ae9575050508190602060e08195015173ffffffffffffffffffffffffffffffffffffffff81511661010485015201516101248301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1918215610add57600092610aa8575b60208380847f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d604073ffffffffffffffffffffffffffffffffffffffff81519360043585526fffffffffffffffffffffffffffffffff60443516888601521692a3604051908152f35b91506020823d602011610ad5575b81610ac3602093836111fd565b810103126100f8576020915191610a3f565b3d9150610ab6565b6040513d6000823e3d90fd5b825180516fffffffffffffffffffffffffffffffff16855260209081015164ffffffffff1681860152889550604090940193909201916001016109b9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6fffffffffffffffffffffffffffffffff610b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8293018661132f565b5192604435031681835116011690528280610792565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b9092610c1167ffffffffffffffff6020610bf3878661132f565b510151166fffffffffffffffffffffffffffffffff60443516611372565b6fffffffffffffffffffffffffffffffff8111610ccd576fffffffffffffffffffffffffffffffff8091169164ffffffffff610c4d878661132f565b51511660405190610c5d826111c5565b8482526020820152610c6f878a61132f565b52610c7a868961132f565b5016016fffffffffffffffffffffffffffffffff8111610c9e579260010190610740565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b602490604051907f4916adce0000000000000000000000000000000000000000000000000000000082526004820152fd5b602090604051610d0d816111c5565b6000815260008382015282828a01015201610733565b60046040517f0fa7d73c000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610662565b60246040517f712b37a30000000000000000000000000000000000000000000000000000000081526004356004820152fd5b6040517f442b18410000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760006003193601126100f85760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346100f85760406003193601126100f857610e806111a2565b6024356fffffffffffffffffffffffffffffffff81168091036100f85773ffffffffffffffffffffffffffffffffffffffff80600054163381036110a55750610ec761123e565b15611047576040519060209160008083858401977fa9059cbb000000000000000000000000000000000000000000000000000000008952169687602485015286604485015260448452610f19846111e1565b847f00000000000000000000000000000000000000000000000000000000000000001693519082855af13d1561103b573d67ffffffffffffffff8111610b2757610fa29160405191610f92877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846111fd565b82523d60008784013e5b8361143f565b805184811515918261101a575b50509050610fe95750907f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f916000541692604051908152a3005b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b83809293500103126100f8578301518015908115036100f857808488610faf565b610fa290606090610f9c565b6040517fe13612970000000000000000000000000000000000000000000000000000000081524260048201527f000000000000000000000000000000000000000000000000000000000000000064ffffffffff166024820152604490fd5b6040517fc6cce6a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152336024820152604490fd5b346100f85760006003193601126100f8576103df907f00000000000000000000000000000000000000000000000000000000000000006020820152602081526103d3816111c5565b60208082528251818301819052939260005b85811061118e575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b81810183015184820160400152820161114e565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f857565b6040810190811067ffffffffffffffff821117610b2757604052565b6080810190811067ffffffffffffffff821117610b2757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b2757604052565b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081611273575090565b905042101590565b67ffffffffffffffff8111610b275760051b60200190565b600354906112a08261127b565b9160406112b060405194856111fd565b8184528360208091019160036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b906000935b8585106112f457505050505050565b60018481928451611304816111c5565b67ffffffffffffffff875464ffffffffff8116835260281c16838201528152019301940193916112e5565b80518210156113435760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8382098382029182808310920391808303921461142e57670de0b6b3a764000090818310156113f757947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b9061147e575080511561145457805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806114d6575b61148f575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561148756fea164736f6c6343000817000aa164736f6c6343000817000a"; /*////////////////////////////////////////////////////////////////////////// DEPLOYERS diff --git a/src/SablierV2MerkleLockupFactory.sol b/src/SablierV2MerkleLockupFactory.sol index d0ef38ce..1625564a 100644 --- a/src/SablierV2MerkleLockupFactory.sol +++ b/src/SablierV2MerkleLockupFactory.sol @@ -35,13 +35,13 @@ contract SablierV2MerkleLockupFactory is ISablierV2MerkleLockupFactory { // Hash the parameters to generate a salt. bytes32 salt = keccak256( abi.encodePacked( - baseParams.initialAdmin, baseParams.asset, + baseParams.cancelable, + baseParams.expiration, + baseParams.initialAdmin, abi.encode(baseParams.ipfsCID), - bytes32(abi.encodePacked(baseParams.name)), baseParams.merkleRoot, - baseParams.expiration, - baseParams.cancelable, + bytes32(abi.encodePacked(baseParams.name)), baseParams.transferable, lockupLinear, abi.encode(streamDurations) @@ -86,13 +86,13 @@ contract SablierV2MerkleLockupFactory is ISablierV2MerkleLockupFactory { // Hash the parameters to generate a salt. bytes32 salt = keccak256( abi.encodePacked( - baseParams.initialAdmin, baseParams.asset, + baseParams.cancelable, + baseParams.expiration, + baseParams.initialAdmin, abi.encode(baseParams.ipfsCID), - bytes32(abi.encodePacked(baseParams.name)), baseParams.merkleRoot, - baseParams.expiration, - baseParams.cancelable, + bytes32(abi.encodePacked(baseParams.name)), baseParams.transferable, lockupTranched, abi.encode(tranchesWithPercentages) diff --git a/src/types/DataTypes.sol b/src/types/DataTypes.sol index 4acad74d..111353c9 100644 --- a/src/types/DataTypes.sol +++ b/src/types/DataTypes.sol @@ -90,22 +90,22 @@ library BatchLockup { library MerkleLockup { /// @notice Struct encapsulating the base constructor parameters of a MerkleLockup campaign. - /// @param initialAdmin The initial admin of the MerkleLockup campaign. /// @param asset The contract address of the ERC-20 asset to be distributed. + /// @param cancelable Indicates if the stream will be cancelable after claiming. + /// @param expiration The expiration of the campaign, as a Unix timestamp. + /// @param initialAdmin The initial admin of the MerkleLockup campaign. /// @param ipfsCID The content identifier for indexing the contract on IPFS. - /// @param name The name of the campaign. /// @param merkleRoot The Merkle root of the claim data. - /// @param expiration The expiration of the campaign, as a Unix timestamp. - /// @param cancelable Indicates if the stream will be cancelable after claiming. + /// @param name The name of the campaign. /// @param transferable Indicates if the stream will be transferable after claiming. struct ConstructorParams { - address initialAdmin; IERC20 asset; + bool cancelable; + uint40 expiration; + address initialAdmin; string ipfsCID; - string name; bytes32 merkleRoot; - uint40 expiration; - bool cancelable; + string name; bool transferable; } } @@ -114,7 +114,7 @@ library MerkleLT { /// @notice Struct encapsulating the unlock percentage and duration of a tranche. /// @dev Since users may have different amounts allocated, this struct makes it possible to calculate the amounts /// at claim time. An 18-decimal format is used to represent percentages: 100% = 1e18. For more information, see - /// the PRBMath documentation on {UD2x18}: https://github.com/PaulRBerg/prb-math + /// the PRBMath documentation on UD2x18: https://github.com/PaulRBerg/prb-math /// @param unlockPercentage The percentage designated to be unlocked in this tranche. /// @param duration The time difference in seconds between this tranche and the previous one. struct TrancheWithPercentage { diff --git a/test/Base.t.sol b/test/Base.t.sol index 06483407..5310e4ea 100644 --- a/test/Base.t.sol +++ b/test/Base.t.sol @@ -286,13 +286,13 @@ abstract contract Base_Test is { bytes32 salt = keccak256( abi.encodePacked( - admin, address(asset_), + defaults.CANCELABLE(), + expiration, + admin, abi.encode(defaults.IPFS_CID()), - defaults.NAME_BYTES32(), merkleRoot, - expiration, - defaults.CANCELABLE(), + defaults.NAME_BYTES32(), defaults.TRANSFERABLE(), lockupLinear, abi.encode(defaults.durations()) @@ -330,13 +330,13 @@ abstract contract Base_Test is { bytes32 salt = keccak256( abi.encodePacked( - admin, address(asset_), + defaults.CANCELABLE(), + expiration, + admin, abi.encode(defaults.IPFS_CID()), - defaults.NAME_BYTES32(), merkleRoot, - expiration, - defaults.CANCELABLE(), + defaults.NAME_BYTES32(), defaults.TRANSFERABLE(), lockupTranched, abi.encode(defaults.tranchesWithPercentages()) @@ -361,7 +361,7 @@ abstract contract Base_Test is returns (bytes memory) { bytes memory constructorArgs = - abi.encode(defaults.baseParams(admin, asset_, merkleRoot, expiration), lockupLinear, defaults.durations()); + abi.encode(defaults.baseParams(admin, asset_, expiration, merkleRoot), lockupLinear, defaults.durations()); if (!isTestOptimizedProfile()) { return bytes.concat(type(SablierV2MerkleLL).creationCode, constructorArgs); } else { @@ -381,7 +381,7 @@ abstract contract Base_Test is returns (bytes memory) { bytes memory constructorArgs = abi.encode( - defaults.baseParams(admin, asset_, merkleRoot, expiration), + defaults.baseParams(admin, asset_, expiration, merkleRoot), lockupTranched, defaults.tranchesWithPercentages() ); diff --git a/test/fork/merkle-lockup/MerkleLT.t.sol b/test/fork/merkle-lockup/MerkleLT.t.sol index ec8ec664..ad741646 100644 --- a/test/fork/merkle-lockup/MerkleLT.t.sol +++ b/test/fork/merkle-lockup/MerkleLT.t.sol @@ -35,11 +35,11 @@ abstract contract MerkleLT_Fork_Test is Fork_Test { } struct Vars { - uint256 actualStreamId; LockupTranched.StreamLT actualStream; + uint256 actualStreamId; LockupTranched.Tranche[] actualTranches; - uint128[] amounts; uint256 aggregateAmount; + uint128[] amounts; MerkleLockup.ConstructorParams baseParams; uint128 clawbackAmount; address expectedLT; diff --git a/test/integration/merkle-lockup/MerkleLockup.t.sol b/test/integration/merkle-lockup/MerkleLockup.t.sol index 8d6be352..ba55de28 100644 --- a/test/integration/merkle-lockup/MerkleLockup.t.sol +++ b/test/integration/merkle-lockup/MerkleLockup.t.sol @@ -62,7 +62,7 @@ abstract contract MerkleLockup_Integration_Test is Integration_Test { function createMerkleLL(address admin, uint40 expiration) internal returns (ISablierV2MerkleLL) { return merkleLockupFactory.createMerkleLL({ - baseParams: defaults.baseParams(admin, dai, defaults.MERKLE_ROOT(), expiration), + baseParams: defaults.baseParams(admin, dai, expiration, defaults.MERKLE_ROOT()), lockupLinear: lockupLinear, streamDurations: defaults.durations(), aggregateAmount: defaults.AGGREGATE_AMOUNT(), @@ -113,7 +113,7 @@ abstract contract MerkleLockup_Integration_Test is Integration_Test { function createMerkleLT(address admin, uint40 expiration) internal returns (ISablierV2MerkleLT) { return merkleLockupFactory.createMerkleLT({ - baseParams: defaults.baseParams(admin, dai, defaults.MERKLE_ROOT(), expiration), + baseParams: defaults.baseParams(admin, dai, expiration, defaults.MERKLE_ROOT()), lockupTranched: lockupTranched, tranchesWithPercentages: defaults.tranchesWithPercentages(), aggregateAmount: defaults.AGGREGATE_AMOUNT(), diff --git a/test/utils/Defaults.sol b/test/utils/Defaults.sol index 2dbc9c70..d922d642 100644 --- a/test/utils/Defaults.sol +++ b/test/utils/Defaults.sol @@ -119,27 +119,27 @@ contract Defaults is Merkle { } function baseParams() public view returns (MerkleLockup.ConstructorParams memory) { - return baseParams(users.admin, asset, MERKLE_ROOT, EXPIRATION); + return baseParams(users.admin, asset, EXPIRATION, MERKLE_ROOT); } function baseParams( address admin, IERC20 asset_, - bytes32 merkleRoot, - uint40 expiration + uint40 expiration, + bytes32 merkleRoot ) public pure returns (MerkleLockup.ConstructorParams memory) { return MerkleLockup.ConstructorParams({ - initialAdmin: admin, asset: asset_, + cancelable: CANCELABLE, + expiration: expiration, + initialAdmin: admin, ipfsCID: IPFS_CID, - name: NAME, merkleRoot: merkleRoot, - expiration: expiration, - cancelable: CANCELABLE, + name: NAME, transferable: TRANSFERABLE }); }