diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index c5567cf5cb..be01e4b762 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -2387,7 +2387,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556158f9908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b92610157612ad8565b612261565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b9190610278612ad8565b60405192610285846119d4565b5f84523691611dfb565b90612fb7565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612245565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b30614169565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f929192612ad8565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6140ff565b614154565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b60608201526064840135608082015261057181612b1a565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550612b4b565b8190838080808080610587565b6106486104af848b612121565b61065181614ef0565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c0906004353603011261018257610764612ad8565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184612bc6565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613500565b6109de81612b1a565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613572565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af160608201516044600435013590612be9565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151612bc6565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613bd9565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145a9565b90614764565b9d8e9260408d0151613ca4565b60408c0152613cce565b99613cce565b98610c5a8484613cf8565b610c648482613d56565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c0152613e68565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145a9565b60408a0151610dd98183613bd9565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613ca4565b610e129085613c00565b610dfb565b905091610de1565b50610e2d6060820151613bb6565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613bd9565b61101b5750508490610ed7856001600160a01b0360208701511633613497565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f169293511633612c10565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614041565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151612bc6565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f612ad8565b61111a848633612b92565b61112383612bc6565b15611268576111338486336131ca565b61113d8185613bd9565b15611262575082935b61115285828833613439565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613497565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612229565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761135195602092169361131386858761335a565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a457611399935030916133d3565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b604435916131ca565b604051908152f35b3461018257611436366118b0565b83949392611442612ad8565b61144d848633612b92565b61145681612bc6565b1561155c578061146a6114b9928733612c10565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612cb6565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612229565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e612ad8565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b612b1a565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1612b4b565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121806116376121798380611f4f565b3690611b81565b5f525f602052600160405f20540361222057806121a08161220c93611f4f565b6122046121bf6121c46020850135938460408701359384923690611b81565b613500565b6121dc6121d18580611f4f565b946060810190611ead565b92906121fc604051966121ee886119d4565b5f88525f3681373690611b81565b933691611c14565b92339261381e565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60c08110612237575050565b60608282015260200161222b565b5f5b82811061225357505050565b606082820152602001612247565b91926001600160a01b038351166001600160a01b0383511614612ac6576001600160a01b03612297606085015160643590612007565b5151166001600160a01b036122b3604085015160843590612007565b51511614801590612a86575b610e32576001600160a01b036122dc604085015160443590612007565b5151166001600160a01b036122f76064356060870151612007565b51511614612a745761230883612b1a565b805f525f60205260405f205415612a25575061232382612b1a565b805f525f60205260405f2054156129d5575061269392937f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061238761237961012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16126006001600160a01b0384511692604051936123d7856119d4565b5f85526123e2613535565b50604051906123f0826119b8565b6006825261240060208301612229565b61240989612b1a565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261243c82611faa565b5261244681611faa565b5060405161245381611950565b60028152604036602083013761246882611fb7565b5261247281611fb7565b506125466124996001600160a01b0361249160443560408d0151612007565b51511661454d565b6124df6001600160a01b038b51168b60206124d66001600160a01b036124c56044356040860151612007565b515116926040604435910151612007565b510151916131ca565b908a60ff60206125116001600160a01b036125006044356040870151612007565b515116936040604435910151612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61254f82611fc7565b5261255981611fc7565b506125e76125786001600160a01b0361249160643560608d0151612007565b6125b56001600160a01b038b51168b60206124d66001600160a01b036125a46064356060860151612007565b515116926060606435910151612007565b908a60ff60206125116001600160a01b036125d66064356060870151612007565b515116936060606435910151612007565b6125f082611fd7565b526125fa81611fd7565b5061431b565b915f6001600160a01b038751169160208801908151906001600160a01b0360208184511693015116928585523060205260408086209151015160405191612646836119d4565b86835260405195612656876119b8565b86526020860152604085015284606085015287608085015260a084015260c0830152604051808099819463d04dfe2360e01b835260048301612ebe565b03915afa94855f915f976129af575b506126b2576040513d5f823e3d90fd5b94908551600281106129975750906127859291604060208801519701516126e16126db87611fe7565b51611fd7565b516126ec8183613bd9565b1561298f5750945b6127168887919060405192600284526020840152604083015260608201604052565b61271f82611fc7565b5261272981611fc7565b5060405195612737876119b8565b8987526064356020880152604087015260608601978852608086015260a085015260c08401526001600160a01b038651169060405191612776836119d4565b5f835260a4356084358761381e565b9390506127956040830151612bc6565b15908115612979575b8115612968575b508015612955575b61294357604051916127be83611988565b5f83525f60208401525f60408401525f60608401526127dd8483614f14565b845260408401526128036127f18386614f14565b60208601528060608601528451613ca4565b946128176020850151604086015190613ca4565b9361282187613bb6565b8015612934575b612922576128e961291b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128cb6129209a60a09661286a8a8851613cf8565b6128788c6020890151613cf8565b6128868a6040890151613d56565b6128948c6060890151613d56565b61289d8a614041565b6128a68c614041565b6001600160a01b036128c260c435926060606435910151612007565b51511633612cb6565b50506001600160a01b036128c260e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e68565b613e68565b565b604051630d86822160e01b8152600490fd5b5061293e85613bb6565b612828565b6040516321badf1f60e01b8152600490fd5b506129636060840151613bb6565b6127ad565b612973915051613bb6565b5f6127a5565b90506129886040850151612bc6565b159061279e565b9050946126f4565b60249060405190630fbb8e5560e21b82526004820152fd5b9096506129ce91503d805f833e6129c681836119f0565b810190612d7a565b955f6126a2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9251604080513381526001600160a01b039092166020830152810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3925081905060608101612a20565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612aa0606084015160a43590612007565b5151166001600160a01b03612abc604086015160443590612007565b51511614156122bf565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b085760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b4581612b37602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b6129209291612b7661028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611dfb565b909115612b9d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612be5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1290565b90612be5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b929192612c1c8261423c565b93612c2681613bb6565b612ca45784816001600160e01b03612c459360e01d9116601b0b615077565b9290809315612c7b575b50829081612c5f575b5050509190565b612c73926001600160a01b033092166133d3565b5f8181612c58565b9092505f198114612c9057600101915f612c4f565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612cc383613bb6565b612d615784612cdf57612cd7939450613497565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613cce565b95612d2687613bb6565b612d49575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612db582611ad4565b91612dc360405193846119f0565b808352848084019160051b830101918683116101825785809101915b838310612e525750505050948281015191821161018257019180601f84011215610182578251612e0e81611ad4565b93612e1c60405195866119f0565b818552838086019260051b820101928311610182578301905b828210612e43575050505090565b81518152908301908301612e35565b8251815291810191869101612ddf565b90808251908181526020809101926020808460051b8301019501935f915b848310612e905750505050505090565b9091929394958480612eae600193601f198682030187528a516120ee565b9801930193019194939290612e80565b91906020928381526001600160a01b0382511684820152838201516040820152612ef8604083015160e060608401526101008301906118fc565b9060608301516080820152612f1f608084015192601f1993848483030160a0850152612e62565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f6257505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101612f3e565b90604082019082526020606081936040838201528551809452019301915f5b828110612fa3575050505090565b835185529381019392810192600101612f95565b919091604092835192612fc9846119b8565b60068452602094612fdb868601612229565b5f5b84518110156130105780612ff360019287612007565b51612ffe8289612007565b526130098188612007565b5001612fdd565b50925092939093335f52308252825f209183519561302d8761196c565b613035611ee3565b87526060828198015284519061304a826119d4565b5f8252855190613059826119d4565b5f82525f3681375f5b81518110156131be578986886130788486612007565b51888151948d8087015190815161309a575b5050505050505050600101613062565b905f92916001600160a01b03966130bf8887818d51169c01511699878901519061431b565b958251996130cc8b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180613107600498898301612ebe565b03915afa9384156131b4579089915f95613196575b508451613132575b50899250808e8c938e61308a565b5101511691823b1561018257613160925f92838d5180968195829463012c676d60e21b845233908401612f76565b03925af1801561318c57906001929161317d575b81928782613124565b613186906119a4565b5f613174565b89513d5f823e3d90fd5b6131ab9195503d805f833e6129c681836119f0565b9050935f61311c565b8c513d5f823e3d90fd5b50505050505050509050565b82156131ff576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061320b8261454d565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715613321575f9761332b575b508361326261325b836132929a61522c565b50906149b7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715613321575f976132f0575b5061325b6132b691611a739861522c565b506132c18183613bd9565b156132e85750935b5f5260018252825f20905f528152815f20905f8052525f205490613cce565b9050936132c9565b96508387813d831161331a575b61330781836119f0565b810103126101825795519561325b6132a5565b503d6132fd565b85513d5f823e3d90fd5b96508387813d8311613353575b61334281836119f0565b810103126101825795519583613249565b503d613338565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f51148116156133b4575b836040521561339e57505050565b635274afe760e01b835216600482015260249150fd5b60018115166133ca57813b15153d151616613390565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613423575b836040525f6060521561339e57505050565b60018115166133ca57813b15153d151616613411565b9392919361344683613bb6565b612d61578461345a57612cd7939450612c10565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613ca4565b909291926134a48161423c565b936134ae81613bb6565b6134ee5784816001600160e01b036134cd9360e01d9116601b0b615077565b508092816134dc575050509190565b6001600160a01b03612c73931661335a565b604051632d1671a360e11b8152600490fd5b9161352b906060613520936001600160a01b039485916040880151612007565b515116940151612007565b51511614612a7457565b60405190613542826119b8565b606060c08361354f611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613581613535565b505f9260406136a6815192613595846119b8565b600684526020936135a7858201612229565b61366f6135b38b612b1a565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135ea86611faa565b526135f485611faa565b50875161360081611950565b6002815288368b83013761361386611fb7565b5261361d85611fb7565b5060ff896125118a8501936136598761363b81612491858a51612007565b9751168861364a848951612007565b515116856124d6858a51612007565b96613665828751612007565b5151169451612007565b61367882611fc7565b5261368281611fc7565b506125e7878b8d60ff896125118c8501936136598761363b81612491858a51612007565b946137265f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136de836119d4565b8683528951956136ed876119b8565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612ebe565b03915afa90815f915f93613800575b506137f3575050505f975b6002855110988915996137e0578284870151960151906137626126db89611fe7565b519061376e8284613bd9565b1590506137d85750925b61379a8685919060405192600284526020840152604083015260608201604052565b6137a388611fc7565b526137ad87611fc7565b5082519b6137ba8d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613778565b5050505050505050509150611a73613535565b9199985094509396613740565b90925061381791503d805f833e6129c681836119f0565b915f613735565b9495939592919261382d613535565b5060409687519061383d826119b8565b6006825260209361384f858401612229565b61385889612b1a565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261388a84611faa565b5261389483611faa565b5089516138a081611950565b600281528a36878301376138b384611fb7565b526138bd83611fb7565b508989019086818351906138d091612007565b5151166138dc9061454d565b86888c511689848651906138ef91612007565b515116828587519061390091612007565b5101519061390d926131ca565b92898186519061391c91612007565b51511694519061392b91612007565b5101519060ff16613963929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61396c83611fc7565b5261397682611fc7565b5060608801858782519061398991612007565b5151166139959061454d565b868a511687898451906139a791612007565b515116878a8551906139b891612007565b510151906139c5926131ca565b90868989818651906139d691612007565b5151169451906139e591612007565b5101519060ff16613a1d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a2683611fd7565b52613a3082611fd7565b50613a3a9161431b565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a6b836119d4565b5f83528c5196613a7a886119b8565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613ab99060048301612ebe565b03815a935f94fa91825f915f94613b98575b50613ada5788513d5f823e3d90fd5b97949596979194825196600288109788613b8157508183850151940151613b036126db87611fe7565b51613b0e8183613bd9565b15613b795750925b613b388585919060405192600284526020840152604083015260608201604052565b613b4187611fc7565b52613b4b86611fc7565b5082519a613b588c6119b8565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613b16565b602490835190630fbb8e5560e21b82526004820152fd5b909350613baf91503d805f833e6129c681836119f0565b925f613acb565b613bd5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1390565b90613bd5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b613c276001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461476e565b90637ffffff58213613c77575b90613c3e916149b7565b9290921580613c6f575b613c5157505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c48565b613c818282615657565b15613c3457604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614bbd565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d81565b613d52916080810182613d14613d0e8351611fe7565b51611fe7565b52613d4b613d456001600160a01b03809451511693613d3c613d368551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613439565b5050565b90608081019180613d6a613d0e8551611fd7565b526001600160a01b03809251511691613d86613d368551611fd7565b5116613d95613d458551611fd7565b519081613e3057613da583613bb6565b612d61579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a20955f5260209060018252613dfb604094855f20835f528452855f20855f528452855f2054613cce565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e62565b91613e61917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a2095612cb6565b5050613e15565b60c0810151908151915f92613fdc575b50613f1d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613ec5836119d4565b8683528c5193613ed4856119d4565b8785528d5196613ee3886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ebe565b03915afa948515613fd2578795613fb4575b508451613f40575b50505050505050565b81905101510151169051813b15613fb057918491849383613f75965180978195829463012c676d60e21b845260048401612f76565b03925af1908115613fa75750613f90575b8080808080613f37565b613f9a82916119a4565b613fa45780613f86565b80fd5b513d84823e3d90fd5b8480fd5b613fc99195503d8089833e6129c681836119f0565b9050935f613f2f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761401f925f928360405180968195829463012c676d60e21b845260048401612f76565b03925af1801561022c5715613e78576140399192506119a4565b5f905f613e78565b60808101614052613d458251611fd7565b5191821561405f57505050565b614079613d366001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166140b4575b505050505050565b6140d8955f9284845260018152828420868552815282842091845252812055613497565b5f8080806140ac565b81156140eb570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614147576020810151908051603f198101908111612c905760051c82116141335760016020920160051b010190565b5050604051614141816119d4565b5f815290565b50604051614141816119d4565b80511561416457602001515f1a90565b505f90565b905f8091602081519101845af480806141e7575b1561419d5750506040513d81523d5f602083013e60203d82010160405290565b156141c457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141d5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061417d5750813b151561417d565b6004111561420457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614238836141fa565b0152565b614244615745565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614312575f925f946142dd575b5061429a836141fa565b6001831415806142cb575b6142af5750505090565b5163ee07877f60e01b81529182916106df919060048401614218565b506142d5836141fa565b8215156142a5565b908094506143019293503d851161430b575b6142f981836119f0565b81019061504d565b919091925f614290565b503d6142ef565b513d5f823e3d90fd5b9080519161432883611ad4565b9161434360409461433b865195866119f0565b808552611ad4565b601f1994602091860136868401378351835190959080156145425760016143999101965b600197889101019761439061437b8a611ad4565b9961438886519b8c6119f0565b808b52611ad4565b01848901612245565b85805f96845160028152338782015230868201526060810186526143bc8b611faa565b526143c68a611faa565b505f925b6144fe575b50505083516143e2575b50505050505090565b858095989796929801816143f68289612007565b526144018188612007565b505f925b614414575b50859697506143d9565b84518310156144f9576001600160a01b0361448b816144338689612007565b51511686614441878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614482888b612007565b510151916151a3565b156144e157868098999a9281926144a2878a612007565b5151166144af8787612007565b520193856144bd8289612007565b5101516144ca868c612007565b526144d5858b612007565b50019290989796614405565b8951630a57f30960e31b815260048101859052602490fd5b61440a565b90919681518810156145395782809101976145198184612007565b516145248a8d612007565b5261452f898c612007565b50019190816143ca565b968291506143cf565b506143995f96614367565b614555615745565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614312575f925f946142dd575061429a836141fa565b9091939284158215175f146145c35750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146fa575b50506145e68161531c565b936145f08161531c565b946145fb868261533c565b909182156146eb575f9083986f0785ee10d5da46d900f436a0000000008086116146dd575b50670de0b6b3a7640000808b116146ce575b50633b9aca00808b116146bf575b50612710808b116146b1575b5098805b6146a0575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c17029161534f565b60019290920191600a900480614650565b60049a04998a93019261464c565b600991939a049901915f614640565b601291939a049901915f614632565b85049950602592505f614620565b509290506118f894955061534f565b5f82121561474e57808413614740575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145db579092506118f893949161525a565b9092506118f89394916152c1565b8084121561470a579092506118f893949161525a565b613c3e82826149b7565b92909180614794576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147a957505050505f905f90565b6147c2936147b691615409565b92919490938492615409565b90939192846147d08861531c565b916147da8661531c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614981575b030191600160ff1b98838a018112155f1461494e575050035b5f955f821280614945575b614927575b5f811280614915575b6148f75786820103966001600160ff1b03881490816148ed575b50806148e4575b806148db575b6148bd57509061487192916155b5565b915f8113614884575b506118f89361534f565b9091604c82136148b25761489b91600a0a906140e1565b9081156148a8575f61487a565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614861565b5082841461485b565b905088145f614854565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361483a565b955080870186131561493f5786818703015b95614831565b5f614939565b505f811361482c565b89985090920390506001600160ff1b03819003870182136149725701860194614821565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614808565b81156140eb570590565b8082601b82810b8314614bac577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b58575b8380820b03614b4757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614af8575b838060030b03614a7c575b808413614a605750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140eb576001600160e01b0391071592614a57565b92915f841315614acc575090614a928383615657565b614aae57637ffffffe1901600a0a810290637fffffff92614a42565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148b257614aeb91600a0a906149ad565b9182156148a85792614a42565b5f198401808060030b14614b0c5750614a37565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149ea565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b99576305f5e100600894058094819201955b9150506149ea565b620186a060059405809481920195614b91565b5082614a3757505050505f90600190565b919291600160ff1b8401614bd5576118f89350615670565b906118f8935f0391614d81565b919291600160ff1b9190801580614d6f575090614bfe91615409565b9490929091905f868585858282138015614d66575b614d49575b505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614d14575b505081019182821860ff1c1115614d0c57826001600160ff1b0314614cee57905f600192135f14614cbf57600a9004915b01925b81158117614c8357509190565b80614c9c575b508015614c94579190565b505f91508190565b9192614cb29203600160ff1b01600a0a906149ad565b600160ff1b91905f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c73565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c76565b8107614d21575b80614c42565b60ff1d600117015f614d1b565b505050919350614d3c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c18565b50835f12614c13565b15614d7a5750509190565b9350919050565b9392919384158115818117614ed257505090614d9c91615409565b9194908295614dad82958294615409565b8096929491969387868482138015614ec9575b614eb0575b5050505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614e96575b505081019182821860ff1c1115614e8e57826001600160ff1b0314614cee57905f600192135f14614e5f57600a9004915b01925b81158117614e3257509190565b80614e4257508015614c94579190565b600160ff1b93614e599291038401600a0a906149ad565b5f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e22565b509092614e25565b8107614ea3575b80614df1565b60ff1d600117015f614e9d565b929b5098509196509450925090505f8080808080614dc5565b50858412614dc0565b9395939092919015614ee8575050614c94579190565b945092915050565b6008815110614164576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f4e610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b94519301614f5d815186612be9565b614f65575050565b909350611a7391925051925183613c00565b92915f9060018184145f87128715171717614ff1575f92808213614fe3575b03604c81135f821217614fd757600a0a9084614fb583820293846149ad565b14614fca57505015614fc6575f9190565b5f90565b9093509015611a73579190565b505015614fc6575f9190565b5f9560019450925090614f96565b5050505f90565b93929190918083145f83125f87121883158715171717615047575f9280821361503a5703604c81135f821217614fd757600a0a9084614fb583820293846149ad565b9194600193509190614f96565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561509f576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836150b157505090505f90600190565b60ff8116820191808312615179575f8312156150e9575050604c198112614c94575f03600a0a916150e283826140e1565b9283021490565b909293915f81135f1461516f57604d811361514457600a0a9283156140eb57835f1904831161511b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151de576151b591926157ae565b506151bf816141fa565b1591826151cb57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b909392915f61526a9181846145a9565b9490945f84830191820194121590816152b7575b81156152ad575b5061528f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615285565b828112915061527e565b6152d693600160fe1b908101939201906145a9565b9081815f82121561530d575050604b198212612cd7576152fb915f03600a0a906149ad565b9081615305575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615335575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153e4576001600160ff1b0392838311156153ce57600160ff1b9383850361538457505050509190565b9091929350851461539e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c90575f039190565b90916001600160ff1b0380841115612c5857851461539e575050600a60019104920190565b91909180156155ab57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156154b9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8301106154aa575b83136154945791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615488565b6f4b3b4ca85a86c47a098a22400000000080840515615599575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615582575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000083051561556e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561555e5782051561554f575b5f61543d565b9290600a02905f190192615549565b939160640291600119019361551a565b93916402540be4000291600919019361551a565b9391678ac7230489e80000029160121901936154f5565b6025198301955092909202915f6154d3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615633571461562b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561566b575f036157e8565b6157e8565b909291600160ff1b9182810161570257508084146156f8578084139182156156f0578185035b604c8111156156df5750505f915b156156d057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140eb5704916156a4565b848203615696565b505090505f905f90565b9361570f92945f03614be2565b80939180928114615723575b50505f039190565b915092506001600160ff1b038314614cee57600a600191059201915f8061571b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615783575b61576b5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615764565b81519190604183036157de576157d79250602082015190606060408401519301515f1a90615877565b9192909190565b50505f9160029190565b90637ffffff581131561587157637ffffffe198101906043821361586a575f82121561583e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140eb577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158ee579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158e457905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615aeb908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b9261015761308d565b612551565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b919061027861308d565b60405192610285846119d4565b5f84523691611dfb565b90613581565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612535565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b3061435b565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f92919261308d565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6142f1565b614346565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b606082015260648401356080820152610571816130cf565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550613100565b8190838080808080610587565b6106486104af848b612121565b610651816150e2565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461308d565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184613190565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613aca565b6109de816130cf565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613b3c565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af1606082015160446004350135906131b3565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151613190565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613dcb565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b61479b565b90614956565b9d8e9260408d0151613e96565b60408c0152613ec0565b99613ec0565b98610c5a8484613eea565b610c648482613f48565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c015261405a565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b61479b565b60408a0151610dd98183613dcb565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613e96565b610e129085613df2565b610dfb565b905091610de1565b50610e2d6060820151613da8565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613dcb565b61101b5750508490610ed7856001600160a01b0360208701511633613a61565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f1692935116336131da565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614233565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151613190565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f61308d565b61111a84863361315c565b61112383613190565b1561126857611133848633613794565b61113d8185613dcb565b15611262575082935b61115285828833613a03565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613a61565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612519565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff91606435838111610182573660238201121561018257806004013593841161018257366024858301011161018257611351956020921693611313868587613924565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a4576113999350309161399d565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b60443591613794565b604051908152f35b3461018257611436366118b0565b8394939261144261308d565b61144d84863361315c565b61145681613190565b1561155c578061146a6114b99287336131da565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613280565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612519565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e61308d565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b6130cf565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1613100565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b9061218161163761217a8480611f4f565b3690611b81565b5f5260205f81526040926001845f20540361250e57916124039161220885855f6123886121b1836121c89a611f4f565b6121cd878501359182878701359c8d923690611b81565b613aca565b6121e56121da8580611f4f565b946060810190611ead565b96906122008751966121f6886119d4565b8688523690611b81565b973691611c14565b90612211613aff565b50612338865191612221836119b8565b600683526122308a8401612519565b8861223a816130cf565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261226d86611faa565b5261227785611faa565b50805161228381611950565b6002815281368e83013761229686611fb7565b526122a085611fb7565b50810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b51511661473f565b975116906122d4898851612007565b515116846122e38a8951612007565b51015191613794565b958d6122f9828751612007565b5151169451612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61234182611fc7565b5261234b81611fc7565b5061236f8b886060810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b61237882611fd7565b5261238281611fd7565b5061450d565b918385511693868601918b83519289818551169401511693878652308a528180872091510151908251926123bb846119d4565b87845251956123c9876119b8565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301613488565b03915afa95865f915f986124e8575b506124215788513d5f823e3d90fd5b95938651600281106124d15750888798998260c0979899015199015161244f61244985611fe7565b51611fd7565b5161245a8183613dcb565b156124c75750998a925b6124868b85919060405192600284526020840152604083015260608201604052565b61248f86611fc7565b5261249985611fc7565b508251966124a6886119b8565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612464565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061250791503d805f833e6124ff81836119f0565b810190613344565b965f612412565b505f92508291829150565b5f5b60c08110612527575050565b60608282015260200161251b565b5f5b82811061254357505050565b606082820152602001612537565b926001600160a01b038451166001600160a01b038351161461307b576001600160a01b03612586606086015160643590612007565b5151166001600160a01b036125a2604085015160843590612007565b5151161480159061303b575b610e32576001600160a01b036125cb604086015160443590612007565b5151166001600160a01b036125e66064356060880151612007565b51511614613029576125f7846130cf565b805f525f60205260405f205415612fd95750612612826130cf565b805f525f60205260405f205415612f895750612928907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061267561266761012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16128956001600160a01b0384511691604051926126c5846119d4565b5f84526126d0613aff565b50604051906126de826119b8565b600682526126ee60208301612519565b6126f7896130cf565b906001600160a01b038a5116604051926004845260208401526040830152606082015233608082015260a0810160405261273082611faa565b5261273a81611faa565b5060405161274781611950565b60028152604036602083013761275c82611fb7565b5261276681611fb7565b506127f46127856001600160a01b036122bd60443560408d0151612007565b6127c26001600160a01b038b51168b60206122e36001600160a01b036127b16044356040860151612007565b515116926040604435910151612007565b908a60ff60206123036001600160a01b036127e36044356040870151612007565b515116936040604435910151612007565b6127fd82611fc7565b5261280781611fc7565b5061236f6128266001600160a01b036122bd60643560608d0151612007565b6128636001600160a01b038b51168b60206122e36001600160a01b036128526064356060860151612007565b515116926060606435910151612007565b908a60ff60206123036001600160a01b036128846064356060870151612007565b515116936060606435910151612007565b905f6001600160a01b038751169160208801908151906001600160a01b03602081845116930151169285855230602052604080862091510151604051916128db836119d4565b868352604051956128eb876119b8565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b835260048301613488565b03915afa92835f915f95612f6b575b50612947576040513d5f823e3d90fd5b9291835160028110612f2d57506040602085015194015161296a61244983611fe7565b516129758183613dcb565b15612f635750935b61299f8186919060405192600284526020840152604083015260608201604052565b6129a883611fc7565b526129b282611fc7565b50604051946129c0866119b8565b888652606435602087015260408601526060850152608084015260a083015260c0820152612bc86001600160a01b038551169360405194612a00866119d4565b5f8652612a0b613aff565b5060405190612a19826119b8565b60068252612a2960208301612519565b612a32866130cf565b906001600160a01b03875116604051926004845260208401526040830152606082015233608082015260a08101604052612a6b82611faa565b52612a7581611faa565b50604051612a8281611950565b600281526040366020830137612a9782611fb7565b52612aa181611fb7565b50612b2b612ac06001600160a01b036122bd60843560408a0151612007565b612afb6001600160a01b038851166001600160a01b03612ae660843560408c0151612007565b51511660206122e360843560408d0151612007565b906001600160a01b03612b1460843560408b0151612007565b51511660ff602061230360843560408d0151612007565b612b3482611fc7565b52612b3e81611fc7565b5061236f612b5d6001600160a01b036122bd60a43560608a0151612007565b612b986001600160a01b038851166001600160a01b03612b8360a43560608c0151612007565b51511660206122e360a43560608d0151612007565b906001600160a01b03612bb160a43560608b0151612007565b51511660ff602061230360a43560608d0151612007565b92612c5e5f6001600160a01b038551169260208601908151906001600160a01b0360208184511693015116928685523060205260408086209151015160405191612c11836119d4565b86835260405195612c21876119b8565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93612f45575b50612c7d576040513d5f823e3d90fd5b90815160028110612f2d575060406020830151920151612c9f61244988611fe7565b51612caa8183613dcb565b15612f255750925b612cd48385919060405192600284526020840152604083015260608201604052565b612cdd88611fc7565b52612ce787611fc7565b5060405196612cf5886119b8565b86885260a43560208901526040880194855260608801938452608088015260a087015260c0860152612d2a6040840151613190565b15918215612f11575b508115612efc575b8115612eeb575b50612ed95760405191612d5483611988565b5f83525f60208401525f60408401525f6060840152612d738483615106565b84526040840152612d99612d878386615106565b60208601528060608601528451613e96565b94612dad6020850151604086015190613e96565b93612db787613da8565b8015612eca575b612eb857612e7f612eb1957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d94612e61612eb69a60a096612e008a8851613eea565b612e0e8c6020890151613eea565b612e1c8a6040890151613f48565b612e2a8c6060890151613f48565b612e338a614233565b612e3c8c614233565b6001600160a01b03612e5860c435926060606435910151612007565b51511633613280565b50506001600160a01b03612e5860e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161405a565b61405a565b565b604051630d86822160e01b8152600490fd5b50612ed485613da8565b612dbe565b6040516321badf1f60e01b8152600490fd5b612ef6915051613da8565b5f612d42565b9050612f0b6060830151613da8565b90612d3b565b612f1d91925051613190565b15905f612d33565b905092612cb2565b60249060405190630fbb8e5560e21b82526004820152fd5b909250612f5c91503d805f833e6124ff81836119f0565b915f612c6d565b90509361297d565b909450612f8291503d805f833e6124ff81836119f0565b935f612937565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612fd4565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03613055606084015160a43590612007565b5151166001600160a01b03613071604087015160443590612007565b51511614156125ae565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146130bd5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516130fa816130ec602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b612eb6929161312b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193613139856119b8565b6006855261314960208601612519565b61315285611faa565b5261124d84611faa565b909115613167575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6131af905f60e01d906001600160e01b038160e01d9116601b0b615169565b1290565b906131af916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b9291926131e68261442e565b936131f081613da8565b61326e5784816001600160e01b0361320f9360e01d9116601b0b615269565b9290809315613245575b50829081613229575b5050509190565b61323d926001600160a01b0330921661399d565b5f8181613222565b9092505f19811461325a57600101915f613219565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361328d83613da8565b61332b57846132a9576132a1939450613a61565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613ec0565b956132f087613da8565b613313575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261337f82611ad4565b9161338d60405193846119f0565b808352848084019160051b830101918683116101825785809101915b83831061341c5750505050948281015191821161018257019180601f840112156101825782516133d881611ad4565b936133e660405195866119f0565b818552838086019260051b820101928311610182578301905b82821061340d575050505090565b815181529083019083016133ff565b82518152918101918691016133a9565b90808251908181526020809101926020808460051b8301019501935f915b84831061345a5750505050505090565b9091929394958480613478600193601f198682030187528a516120ee565b980193019301919493929061344a565b91906020928381526001600160a01b03825116848201528382015160408201526134c2604083015160e060608401526101008301906118fc565b90606083015160808201526134e9608084015192601f1993848483030160a085015261342c565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061352c57505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101613508565b90604082019082526020606081936040838201528551809452019301915f5b82811061356d575050505090565b83518552938101939281019260010161355f565b919091604092835192613593846119b8565b600684526020946135a5868601612519565b5f5b84518110156135da57806135bd60019287612007565b516135c88289612007565b526135d38188612007565b50016135a7565b50925092939093335f52308252825f20918351956135f78761196c565b6135ff611ee3565b875260608281980152845190613614826119d4565b5f8252855190613623826119d4565b5f82525f3681375f5b8151811015613788578986886136428486612007565b51888151948d80870151908151613664575b505050505050505060010161362c565b905f92916001600160a01b03966136898887818d51169c01511699878901519061450d565b958251996136968b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b825281806136d1600498898301613488565b03915afa93841561377e579089915f95613760575b5084516136fc575b50899250808e8c938e613654565b5101511691823b156101825761372a925f92838d5180968195829463012c676d60e21b845233908401613540565b03925af18015613756579060019291613747575b819287826136ee565b613750906119a4565b5f61373e565b89513d5f823e3d90fd5b6137759195503d805f833e6124ff81836119f0565b9050935f6136e6565b8c513d5f823e3d90fd5b50505050505050509050565b82156137c9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506137d58261473f565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156138eb575f976138f5575b508361382c6138258361385c9a61541e565b5090614ba9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156138eb575f976138ba575b5061382561388091611a739861541e565b5061388b8183613dcb565b156138b25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ec0565b905093613893565b96508387813d83116138e4575b6138d181836119f0565b810103126101825795519561382561386f565b503d6138c7565b85513d5f823e3d90fd5b96508387813d831161391d575b61390c81836119f0565b810103126101825795519583613813565b503d613902565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561397e575b836040521561396857505050565b635274afe760e01b835216600482015260249150fd5b600181151661399457813b15153d15161661395a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156139ed575b836040525f6060521561396857505050565b600181151661399457813b15153d1516166139db565b93929193613a1083613da8565b61332b5784613a24576132a19394506131da565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613e96565b90929192613a6e8161442e565b93613a7881613da8565b613ab85784816001600160e01b03613a979360e01d9116601b0b615269565b50809281613aa6575050509190565b6001600160a01b0361323d9316613924565b604051632d1671a360e11b8152600490fd5b91613af5906060613aea936001600160a01b039485916040880151612007565b515116940151612007565b5151161461302957565b60405190613b0c826119b8565b606060c083613b19611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613b4b613aff565b50604092613c39845191613b5e836119b8565b60068352602092613b70848201612519565b613c03613b7c8a6130cf565b966001600160a01b0397888c51168a519160038352888301528a820152886060981688820152608081018a52613bb184611faa565b52613bbb83611faa565b508851613bc781611950565b60028152893688830137613bda84611fb7565b52613be483611fb7565b508a89810160ff886123036122ec8d806122c5816122bd8b8a51612007565b613c0c82611fc7565b52613c1681611fc7565b5061236f8a8a87810160ff886123036122ec8d806122c5816122bd8b8a51612007565b93613cb95f8589511697859685879b0191825191878184511693015116928b85523088528680862091510151875191613c71836119d4565b868352885195613c80876119b8565b8652898601528785015284898501528a608085015260a084015260c08301528451808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93613d8a575b50613d7e575b5050600284511097881598613d6c578183860151950151613cf161244988611fe7565b51613cfc8183613dcb565b15613d645750925b613d268685919060405192600284526020840152604083015260608201604052565b613d2f88611fc7565b52613d3987611fc7565b5082519b613d468d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613d04565b50505050505050509150611a73613aff565b90975093505f80613cce565b909250613da191503d805f833e6124ff81836119f0565b915f613cc8565b613dc7905f60e01d906001600160e01b038160e01d9116601b0b615169565b1390565b90613dc7916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b613e196001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614960565b90637ffffff58213613e69575b90613e3091614ba9565b9290921580613e61575b613e4357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613e3a565b613e738282615849565b15613e2657604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614daf565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614f73565b613f44916080810182613f06613f008351611fe7565b51611fe7565b52613f3d613f376001600160a01b03809451511693613f2e613f288551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613a03565b5050565b90608081019180613f5c613f008551611fd7565b526001600160a01b03809251511691613f78613f288551611fd7565b5116613f87613f378551611fd7565b51908161402257613f9783613da8565b61332b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd4955f5260209060018252613fed604094855f20835f528452855f20855f528452855f2054613ec0565b945f5260018252835f20905f528152825f20915f52525f20555b5160405191829133835260406020840152604083019061342c565b91614053917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd495613280565b5050614007565b60c0810151908151915f926141ce575b5061410f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916140b7836119d4565b8683528c51936140c6856119d4565b8785528d51966140d5886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301613488565b03915afa9485156141c45787956141a6575b508451614132575b50505050505050565b81905101510151169051813b156141a257918491849383614167965180978195829463012c676d60e21b845260048401613540565b03925af19081156141995750614182575b8080808080614129565b61418c82916119a4565b6141965780614178565b80fd5b513d84823e3d90fd5b8480fd5b6141bb9195503d8089833e6124ff81836119f0565b9050935f614121565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257614211925f928360405180968195829463012c676d60e21b845260048401613540565b03925af1801561022c571561406a5761422b9192506119a4565b5f905f61406a565b60808101614244613f378251611fd7565b5191821561425157505050565b61426b613f286001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166142a6575b505050505050565b6142ca955f9284845260018152828420868552815282842091845252812055613a61565b5f80808061429e565b81156142dd570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614339576020810151908051603f19810190811161325a5760051c82116143255760016020920160051b010190565b5050604051614333816119d4565b5f815290565b50604051614333816119d4565b80511561435657602001515f1a90565b505f90565b905f8091602081519101845af480806143d9575b1561438f5750506040513d81523d5f602083013e60203d82010160405290565b156143b657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156143c7576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061436f5750813b151561436f565b600411156143f657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261442a836143ec565b0152565b614436615937565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614504575f925f946144cf575b5061448c836143ec565b6001831415806144bd575b6144a15750505090565b5163ee07877f60e01b81529182916106df91906004840161440a565b506144c7836143ec565b821515614497565b908094506144f39293503d85116144fd575b6144eb81836119f0565b81019061523f565b919091925f614482565b503d6144e1565b513d5f823e3d90fd5b9080519161451a83611ad4565b9161453560409461452d865195866119f0565b808552611ad4565b601f19946020918601368684013783518351909590801561473457600161458b9101965b600197889101019761458261456d8a611ad4565b9961457a86519b8c6119f0565b808b52611ad4565b01848901612535565b85805f96845160028152338782015230868201526060810186526145ae8b611faa565b526145b88a611faa565b505f925b6146f0575b50505083516145d4575b50505050505090565b858095989796929801816145e88289612007565b526145f38188612007565b505f925b614606575b50859697506145cb565b84518310156146eb576001600160a01b0361467d816146258689612007565b51511686614633878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614674888b612007565b51015191615395565b156146d357868098999a928192614694878a612007565b5151166146a18787612007565b520193856146af8289612007565b5101516146bc868c612007565b526146c7858b612007565b500192909897966145f7565b8951630a57f30960e31b815260048101859052602490fd5b6145fc565b909196815188101561472b57828091019761470b8184612007565b516147168a8d612007565b52614721898c612007565b50019190816145bc565b968291506145c1565b5061458b5f96614559565b614747615937565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614504575f925f946144cf575061448c836143ec565b9091939284158215175f146147b55750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6148ec575b50506147d88161550e565b936147e28161550e565b946147ed868261552e565b909182156148dd575f9083986f0785ee10d5da46d900f436a0000000008086116148cf575b50670de0b6b3a7640000808b116148c0575b50633b9aca00808b116148b1575b50612710808b116148a3575b5098805b614892575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615541565b60019290920191600a900480614842565b60049a04998a93019261483e565b600991939a049901915f614832565b601291939a049901915f614824565b85049950602592505f614812565b509290506118f8949550615541565b5f82121561494057808413614932575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156147cd579092506118f893949161544c565b9092506118f89394916154b3565b808412156148fc579092506118f893949161544c565b613e308282614ba9565b92909180614986576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461499b57505050505f905f90565b6149b4936149a8916155fb565b929194909384926155fb565b90939192846149c28861550e565b916149cc8661550e565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614b73575b030191600160ff1b98838a018112155f14614b40575050035b5f955f821280614b37575b614b19575b5f811280614b07575b614ae95786820103966001600160ff1b0388149081614adf575b5080614ad6575b80614acd575b614aaf575090614a6392916157a7565b915f8113614a76575b506118f893615541565b9091604c8213614aa457614a8d91600a0a906142d3565b908115614a9a575f614a6c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614a53565b50828414614a4d565b905088145f614a46565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614a2c565b9550808701861315614b315786818703015b95614a23565b5f614b2b565b505f8113614a1e565b89985090920390506001600160ff1b0381900387018213614b645701860194614a13565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506149fa565b81156142dd570590565b8082601b82810b8314614d9e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614d4a575b8380820b03614d3957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614cea575b838060030b03614c6e575b808413614c525750506001600160e01b036001925b60e01b91161791565b8303600a0a80156142dd576001600160e01b0391071592614c49565b92915f841315614cbe575090614c848383615849565b614ca057637ffffffe1901600a0a810290637fffffff92614c34565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614aa457614cdd91600a0a90614b9f565b918215614a9a5792614c34565b5f198401808060030b14614cfe5750614c29565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614bdc565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614d8b576305f5e100600894058094819201955b915050614bdc565b620186a060059405809481920195614d83565b5082614c2957505050505f90600190565b919291600160ff1b8401614dc7576118f89350615862565b906118f8935f0391614f73565b919291600160ff1b9190801580614f61575090614df0916155fb565b9490929091905f868585858282138015614f58575b614f3b575b505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084614f06575b505081019182821860ff1c1115614efe57826001600160ff1b0314614ee057905f600192135f14614eb157600a9004915b01925b81158117614e7557509190565b80614e8e575b508015614e86579190565b505f91508190565b9192614ea49203600160ff1b01600a0a90614b9f565b600160ff1b91905f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e65565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614e68565b8107614f13575b80614e34565b60ff1d600117015f614f0d565b505050919350614f2e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614e0a565b50835f12614e05565b15614f6c5750509190565b9350919050565b93929193841581158181176150c457505090614f8e916155fb565b9194908295614f9f829582946155fb565b80969294919693878684821380156150bb575b6150a2575b5050505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084615088575b505081019182821860ff1c111561508057826001600160ff1b0314614ee057905f600192135f1461505157600a9004915b01925b8115811761502457509190565b8061503457508015614e86579190565b600160ff1b9361504b9291038401600a0a90614b9f565b5f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615014565b509092615017565b8107615095575b80614fe3565b60ff1d600117015f61508f565b929b5098509196509450925090505f8080808080614fb7565b50858412614fb2565b93959390929190156150da575050614e86579190565b945092915050565b6008815110614356576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040615140610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61479b565b9451930161514f8151866131b3565b615157575050565b909350611a7391925051925183613df2565b92915f9060018184145f871287151717176151e3575f928082136151d5575b03604c81135f8212176151c957600a0a90846151a78382029384614b9f565b146151bc575050156151b8575f9190565b5f90565b9093509015611a73579190565b5050156151b8575f9190565b5f9560019450925090615188565b5050505f90565b93929190918083145f83125f87121883158715171717615239575f9280821361522c5703604c81135f8212176151c957600a0a90846151a78382029384614b9f565b9194600193509190615188565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615291576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836152a357505090505f90600190565b60ff811682019180831261536b575f8312156152db575050604c198112614e86575f03600a0a916152d483826142d3565b9283021490565b909293915f81135f1461536157604d811361533657600a0a9283156142dd57835f1904831161530d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6153d0576153a791926159a0565b506153b1816143ec565b1591826153bd57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461544457600a6001818404940192061590565b909190600190565b909392915f61545c91818461479b565b9490945f84830191820194121590816154a9575b811561549f575b5061548157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615477565b8281129150615470565b6154c893600160fe1b9081019392019061479b565b9081815f8212156154ff575050604b1982126132a1576154ed915f03600a0a90614b9f565b90816154f7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615527575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156155d6576001600160ff1b0392838311156155c057600160ff1b9383850361557657505050509190565b90919293508514615590575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461325a575f039190565b90916001600160ff1b0380841115613222578514615590575050600a60019104920190565b919091801561579d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156156ab575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061569c575b83136156865791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f19019261567a565b6f4b3b4ca85a86c47a098a2240000000008084051561578b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615774575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615760575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561575057820515615741575b5f61562f565b9290600a02905f19019261573b565b939160640291600119019361570c565b93916402540be4000291600919019361570c565b9391678ac7230489e80000029160121901936156e7565b6025198301955092909202915f6156c5565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615825571461581d579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561585d575f036159da565b6159da565b909291600160ff1b918281016158f457508084146158ea578084139182156158e2578185035b604c8111156158d15750505f915b156158c257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156142dd570491615896565b848203615888565b505090505f905f90565b9361590192945f03614dd4565b80939180928114615915575b50505f039190565b915092506001600160ff1b038314614ee057600a600191059201915f8061590d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615975575b61595d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615956565b81519190604183036159d0576159c99250602082015190606060408401519301515f1a90615a69565b9192909190565b50505f9160029190565b90637ffffff5811315615a6357637ffffffe1981019060438213615a5c575f821215615a3057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156142dd577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615ae0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b03811615615ad657905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index dca7aedb11..7136cdcff6 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506127168061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd5565b60405161009d939291906124fd565b6040517fa18bcfb6026768fff923ba3f6d2ab7c37c7a6ab3f226e540ca92278af8d56f2c815260200161009d565b61011e610119366004612453565b610d19565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d51565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b6123c78152602001906001900390816102625790505090506116ee815f8151811061028f5761028f612581565b60200260200101906001600160401b031690816001600160401b03168152505061170b816001815181106102c5576102c5612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c78152602001906001900390816102f557905050905061171a815f8151811061032257610322612581565b60200260200101906001600160401b031690816001600160401b0316815250506117298160018151811061035857610358612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160028151811061038e5761038e612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103be579050509050611748815f815181106103eb576103eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042157610421612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610451579050509050611767815f8151811061047e5761047e612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b4576104b4612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104ea576104ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061052057610520612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055657610556612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105865790505090506117b5815f815181106105b3576105b3612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e9576105e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061f5761061f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065557610655612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068b5761068b612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106ba579050509050611803815f815181106106e7576106e7612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071657905050905061181c815f8151811061074357610743612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077657610776612581565b6020026020010181905250858860018151811061079557610795612581565b602002602001018190525084886002815181106107b4576107b4612581565b602002602001018190525083886003815181106107d3576107d3612581565b602002602001018190525082886004815181106107f2576107f2612581565b6020908102919091010152818861080b6006600161256e565b8151811061081b5761081b612581565b602090810291909101015280886108346006600161256e565b61083f90600161256e565b8151811061084f5761084f612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610871579050509050611868815f8151811061089e5761089e612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d4576108d4612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090a5761090a612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061094057610940612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097657610976612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ac576109ac612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109e0576109e0612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a035790505090506118c6815f81518110610a3057610a30612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6657610a66612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9c57610a9c612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad257610ad2612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0857610b08612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3e57610b3e612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7457610b74612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba857610ba8612581565b602090810291909101015289610bc5610bc082611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf587610be86119d8565b610bf06119f8565b611a18565b9250925092505f610c0b82610220015160200190565b90505f8261022001515182610c20919061256e565b90505f610c3e83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5786610240015184611ba5565b915091508115610cec575f610c6c8783611c7c565b90506123c75f610c7a611cab565b90505f60028251610c8b91906125a9565b9050808510610cbc576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd58c8c8686565b9e509e509e50505050505050505050505050610d12565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d41866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d606006600161256e565b610d6b90600161256e565b610d7690600161256e565b6001600160401b03811115610d8d57610d8d61243f565b604051908082528060200260200182016040528015610dc057816020015b6060815260200190600190039081610dab5790505b50604080516002808252606082019092529192505f9190816020015b6123c7815260200190600190039081610ddc579050509050611ccb815f81518110610e0957610e09612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e3f57610e3f612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c7815260200190600190039081610e6f579050509050611ccb815f81518110610e9c57610e9c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610ed257610ed2612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610f0857610f08612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f38579050509050611ccb815f81518110610f6557610f65612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9b57610f9b612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fcb579050509050611ccb815f81518110610ff857610ff8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102e5761102e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106457611064612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109a5761109a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110d0576110d0612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081611100579050509050611ccb815f8151811061112d5761112d612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116357611163612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119957611199612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cf576111cf612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120557611205612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611234579050509050611cf4815f8151811061126157611261612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611290579050509050611d90815f815181106112bd576112bd612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112f0576112f0612581565b6020026020010181905250858860018151811061130f5761130f612581565b6020026020010181905250848860028151811061132e5761132e612581565b6020026020010181905250838860038151811061134d5761134d612581565b6020026020010181905250828860048151811061136c5761136c612581565b602090810291909101015281886113856006600161256e565b8151811061139557611395612581565b602090810291909101015280886113ae6006600161256e565b6113b990600161256e565b815181106113c9576113c9612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113eb579050509050611ccb815f8151811061141857611418612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144e5761144e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148457611484612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114ba576114ba612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114f0576114f0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152657611526612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155a5761155a612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157d579050509050611ccb815f815181106115aa576115aa612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115e0576115e0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161657611616612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164c5761164c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168257611682612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b8576116b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7457610b74612581565b5f6060806116fc5f80611e48565b92509250925093509350939050565b5f6060806116fc5f6001611e48565b5f6060806116fc60015f611e48565b5f6060806116fc600180611e48565b5f6060806116fc60016002611e48565b5f6060806116fc60025f611e48565b5f6060806116fc60026001611e48565b5f6060806116fc60035f611e48565b5f6060806116fc60036001611e48565b5f6060806116fc60036002611e48565b5f6060806116fc600380611e48565b5f6060806116fc60036004611e48565b5f6060806116fc60045f611e48565b5f6060806116fc60046001611e48565b5f6060806116fc60046002611e48565b5f6060806116fc60046003611e48565b5f6060806116fc600480611e48565b5f6060806116fc6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fc600580611e48565b5f6060806116fc60055f611e48565b5f6060806116fc60056001611e48565b5f6060806116fc60056002611e48565b5f6060806116fc60056003611e48565b5f6060806116fc60056004611e48565b5f6060806116fc600680611e48565b5f6060806116fc60065f611e48565b5f6060806116fc60066001611e48565b5f6060806116fc60066002611e48565b5f6060806116fc60066003611e48565b5f6060806116fc60066004611e48565b5f6060806116fc60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b60606040518060600160405280604081526020016125f460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb39160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b606060405180606001604052806040815260200161263460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb3565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb3565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb3565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d9016ee170b171a1729173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb02e0f14716565589", + "object": "0x6080604052348015600e575f80fd5b5061279a8061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c36600461244d565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124a9565b6100ce6100c93660046124cf565b610c0b565b60405161009d93929190612579565b6040517f8336a7fad53960ed41ca79692ce772de758261a38ddecfa23983c3b89d00aaba815260200161009d565b61011e6101193660046124cf565b610d4f565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d87565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600660016125ea565b6101f19060016125ea565b6101fc9060016125ea565b6001600160401b03811115610213576102136124bb565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61244381526020019060019003908161026257905050905061175a815f8151811061028f5761028f6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611777816001815181106102c5576102c56125fd565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6124438152602001906001900390816102f5579050509050611786815f81518110610322576103226125fd565b60200260200101906001600160401b031690816001600160401b03168152505061179581600181518110610358576103586125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117a48160028151811061038e5761038e6125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117b4816003815181106103c4576103c46125fd565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124438152602001906001900390816103f45790505090506117c4815f81518110610421576104216125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117d381600181518110610457576104576125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124438152602001906001900390816104875790505090506117e3815f815181106104b4576104b46125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117f2816001815181106104ea576104ea6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061180281600281518110610520576105206125fd565b60200260200101906001600160401b031690816001600160401b03168152505061181281600381518110610556576105566125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118218160048151811061058c5761058c6125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124438152602001906001900390816105bc579050509050611831815f815181106105e9576105e96125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118408160018151811061061f5761061f6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061185081600281518110610655576106556125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118608160038151811061068b5761068b6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611870816004815181106106c1576106c16125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816106f057905050905061187f815f8151811061071d5761071d6125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61244381526020019060019003908161074c579050509050611898815f81518110610779576107796125fd565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107ac576107ac6125fd565b602002602001018190525085886001815181106107cb576107cb6125fd565b602002602001018190525084886002815181106107ea576107ea6125fd565b60200260200101819052508388600381518110610809576108096125fd565b60200260200101819052508288600481518110610828576108286125fd565b60209081029190910101528188610841600660016125ea565b81518110610851576108516125fd565b6020908102919091010152808861086a600660016125ea565b6108759060016125ea565b81518110610885576108856125fd565b602090810291909101015260408051600680825260e082019092525f91816020015b6124438152602001906001900390816108a75790505090506118e4815f815181106108d4576108d46125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118f38160018151811061090a5761090a6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061190281600281518110610940576109406125fd565b60200260200101906001600160401b031690816001600160401b03168152505061191281600381518110610976576109766125fd565b60200260200101906001600160401b031690816001600160401b031681525050611922816004815181106109ac576109ac6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611932816005815181106109e2576109e26125fd565b60200260200101906001600160401b031690816001600160401b0316815250508089600581518110610a1657610a166125fd565b602090810291909101015260408051600780825261010082019092525f91816020015b612443815260200190600190039081610a39579050509050611942815f81518110610a6657610a666125fd565b60200260200101906001600160401b031690816001600160401b03168152505061195181600181518110610a9c57610a9c6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061196081600281518110610ad257610ad26125fd565b60200260200101906001600160401b031690816001600160401b03168152505061197081600381518110610b0857610b086125fd565b60200260200101906001600160401b031690816001600160401b03168152505061198081600481518110610b3e57610b3e6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061199081600581518110610b7457610b746125fd565b60200260200101906001600160401b031690816001600160401b0316815250506119a081600681518110610baa57610baa6125fd565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610bde57610bde6125fd565b602090810291909101015289610bfb610bf6826119b0565b6119c5565b9b50505050505050505050505090565b5f6060805f805f610c2b87610c1e611a54565b610c26611a74565b611a94565b9250925092505f610c4182610220015160200190565b90505f8261022001515182610c5691906125ea565b90505f610c7483836f07fffffe0000000003ff200000000000611b85565b80925081945050505f80610c8d86610240015184611c21565b915091508115610d22575f610ca28783611cf8565b90506124435f610cb0611d27565b90505f60028251610cc19190612625565b9050808510610cf2576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d0b8c8c8686565b9e509e509e50505050505050505050505050610d48565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d77866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d96600660016125ea565b610da19060016125ea565b610dac9060016125ea565b6001600160401b03811115610dc357610dc36124bb565b604051908082528060200260200182016040528015610df657816020015b6060815260200190600190039081610de15790505b50604080516002808252606082019092529192505f9190816020015b612443815260200190600190039081610e12579050509050611d47815f81518110610e3f57610e3f6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110610e7557610e756125fd565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612443815260200190600190039081610ea5579050509050611d47815f81518110610ed257610ed26125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110610f0857610f086125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110610f3e57610f3e6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110610f7457610f746125fd565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612443815260200190600190039081610fa4579050509050611d47815f81518110610fd157610fd16125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110611007576110076125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612443815260200190600190039081611037579050509050611d47815f81518110611064576110646125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160018151811061109a5761109a6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816002815181106110d0576110d06125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110611106576111066125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160048151811061113c5761113c6125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61244381526020019060019003908161116c579050509050611d47815f81518110611199576111996125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816001815181106111cf576111cf6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110611205576112056125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160038151811061123b5761123b6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600481518110611271576112716125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816112a0579050509050611d70815f815181106112cd576112cd6125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816112fc579050509050611e0c815f81518110611329576113296125fd565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061135c5761135c6125fd565b6020026020010181905250858860018151811061137b5761137b6125fd565b6020026020010181905250848860028151811061139a5761139a6125fd565b602002602001018190525083886003815181106113b9576113b96125fd565b602002602001018190525082886004815181106113d8576113d86125fd565b602090810291909101015281886113f1600660016125ea565b81518110611401576114016125fd565b6020908102919091010152808861141a600660016125ea565b6114259060016125ea565b81518110611435576114356125fd565b602090810291909101015260408051600680825260e082019092525f91816020015b612443815260200190600190039081611457579050509050611d47815f81518110611484576114846125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816001815181106114ba576114ba6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816002815181106114f0576114f06125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110611526576115266125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160048151811061155c5761155c6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600581518110611592576115926125fd565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115c6576115c66125fd565b602090810291909101015260408051600780825261010082019092525f91816020015b6124438152602001906001900390816115e9579050509050611d47815f81518110611616576116166125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160018151811061164c5761164c6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110611682576116826125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816003815181106116b8576116b86125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816004815181106116ee576116ee6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600581518110611724576117246125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600681518110610baa57610baa6125fd565b5f6060806117685f80611ec4565b92509250925093509350939050565b5f6060806117685f6001611ec4565b5f60608061176860015f611ec4565b5f606080611768600180611ec4565b5f60608061176860016002611ec4565b5f60608061176860016003611ec4565b5f60608061176860025f611ec4565b5f60608061176860026001611ec4565b5f60608061176860035f611ec4565b5f60608061176860036001611ec4565b5f60608061176860036002611ec4565b5f606080611768600380611ec4565b5f60608061176860036004611ec4565b5f60608061176860045f611ec4565b5f60608061176860046001611ec4565b5f60608061176860046002611ec4565b5f60608061176860046003611ec4565b5f606080611768600480611ec4565b5f606080611768611892600660016125ea565b85611ec4565b5f60608060ff80851690600886901c166118d3826118b8600660016125ea565b6118c39060016125ea565b6118cd91906125ea565b82611ec4565b945094509450505093509350939050565b5f606080611768600580611ec4565b5f60608061176860055f611ec4565b5f60608061176860056001611ec4565b5f60608061176860056002611ec4565b5f60608061176860056003611ec4565b5f60608061176860056004611ec4565b5f606080611768600680611ec4565b5f60608061176860065f611ec4565b5f60608061176860066001611ec4565b5f60608061176860066002611ec4565b5f60608061176860066003611ec4565b5f60608061176860066004611ec4565b5f60608061176860066005611ec4565b6060815f6119bd82611f46565b949350505050565b60605f82516002026001600160401b038111156119e4576119e46124bb565b6040519080825280601f01601f191660200182016040528015611a0e576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a4857805183518616908516178152602090920191600201611a26565b50939695505050505050565b60606040518060e0016040528060a681526020016126b260a69139905090565b606060405180608001604052806042815260200161275860429139905090565b5f80611b236040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611b6f87878760405180602001604052805f815250611fb4565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b9c5780611b9f565b60205b915050875192505b8519600184841a1b16158183101615611bc557600182019150611ba7565b9681019660208290036008810293841c90931b92611c105760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ce9916004016124a9565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611ce65760018301516021909301805190935f90819060ff168180611c6b838e612165565b915091508186165f03611c8d575f809b509b5050505050505050505050611cf1565b5f87611c9d600185038916612190565b016004028b015195505062ffffff9081169350841683039150611cd19050575060019750601c1a9550611cf1945050505050565b611cda83612190565b84019350505050611c42565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d1e9083565b95945050505050565b606060405180608001604052806042815260200161267060429139905090565b5f81515f14611d69576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611dcd575060208101516001600160e01b038116601b0b60e082901d5f611d9e838383612249565b905061ffff811115611dc357604051631e4e01d760e21b815260040160405180910390fd5b9250611e07915050565b81515f03611dee57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ea157602082015160408301516001600160e01b038216601b0b60e083901d5f611e3e838383612249565b6001600160e01b038516601b0b935060e085901d925090505f611e62848483612249565b905060ff821180611e73575060ff81115b15611e9157604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e079350505050565b600282511015611dee57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611ed7575060ff84115b15611eff57604051639b0f326160e01b81526004810186905260248101859052604401610ce9565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f528361228b565b90505f611f60826020612644565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fa857602083515102806020855101835e6020939093019201611f85565b50919695505050505050565b6120416040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120c6576120c66124bb565b6040519080825280602002602001820160405280156120ef578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d1e565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611cf1575060019250929050565b5f5f1982036121a25750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122578686866122d4565b91509150806122825760405162bc8ecf60e31b81526004810187905260248101869052604401610ce9565b50949350505050565b5f60208201602083510281015b808210156122cd5781515192830192808410156122c157634e487b715f5260116020526024601cfd5b50602082019150612298565b5050919050565b5f805f85121561230157604051634a7d166b60e01b81526004810186905260248101859052604401610ce9565b845f0361231357505f90506001611c19565b8460ff841685018581121561234e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ce9565b5f805f83121561239a57604c19831215612371575f809550955050505050611c19565b825f03600a0a915081848161238857612388612611565b0495505084029091149150611c199050565b5f83131561243357604d8313156123d75760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ce9565b82600a0a9150815f19816123ed576123ed612611565b048411156124215760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ce9565b5091909102925060019150611c199050565b8360019550955050505050611c19565b61244b61265b565b565b5f6020828403121561245d575f80fd5b81356001600160e01b031981168114612474575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f612474602083018461247b565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156124df575f80fd5b81356001600160401b03808211156124f5575f80fd5b818401915084601f830112612508575f80fd5b81358181111561251a5761251a6124bb565b604051601f8201601f19908116603f01168101908382118183101715612542576125426124bb565b8160405282815287602084870101111561255a575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f602060606020840152612595606084018661247b565b8381036040850152845180825260208087019201905f5b818110156125c8578351835292840192918401916001016125ac565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16125d6565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261263f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16125d6565b634e487b7160e01b5f52605160045260245ffdfe175a17771786179517a417b417c417d317e317f21802181218211831184018501860187018e418f3190219121922193219421951196019701980199019a0187f18980101180010a00082000100010480300038412a001810000010020004200004002038038ff54905cc66c61ef3dcab071659220a895f0b15fec9301a02e0920d5bfe561c21609201e959460c19742710844db209bcd3bf1d9893761f1049db12b93430190ae9a00bf82a7806c138f40e28083f0842ef2104d561fd1315a13316716a6118d260cc117b9bfc0fec7ade14cba28900a422961b6b14a520792bdb02e0f147175655891d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d701e0c", "linkReferences": {} } } diff --git a/meta/RaindexV6SubParser.rain.meta b/meta/RaindexV6SubParser.rain.meta index 17d9b479ae..87b36b23c5 100644 Binary files a/meta/RaindexV6SubParser.rain.meta and b/meta/RaindexV6SubParser.rain.meta differ diff --git a/meta/RaindexV6SubParserAuthoringMeta.rain.meta b/meta/RaindexV6SubParserAuthoringMeta.rain.meta index 315939efd2..64f53b541b 100644 Binary files a/meta/RaindexV6SubParserAuthoringMeta.rain.meta and b/meta/RaindexV6SubParserAuthoringMeta.rain.meta differ diff --git a/src/concrete/parser/RaindexV6SubParser.sol b/src/concrete/parser/RaindexV6SubParser.sol index 39ed6187b7..6da586a4e9 100644 --- a/src/concrete/parser/RaindexV6SubParser.sol +++ b/src/concrete/parser/RaindexV6SubParser.sol @@ -51,6 +51,7 @@ import { CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT, CONTEXT_CALCULATIONS_ROWS, CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY, + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, CONTEXT_DEPOSIT_COLUMN, CONTEXT_WITHDRAW_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER, @@ -121,6 +122,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextCallingContextHandlers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER] = LibParseOperand.handleOperandDisallowed; contextCallingContextHandlers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY] = LibParseOperand.handleOperandDisallowed; + contextCallingContextHandlers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = + LibParseOperand.handleOperandDisallowed; function(bytes32[] memory) internal pure returns (OperandV2)[] memory contextCalculationsHandlers = new function(bytes32[] memory) internal pure returns (OperandV2)[](CONTEXT_CALCULATIONS_ROWS); @@ -216,6 +219,8 @@ contract RaindexV6SubParser is BaseRainlangSubParser { contextCallingContextParsers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER] = LibRaindexSubParser.subParserOrderOwner; contextCallingContextParsers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY] = LibRaindexSubParser.subParserOrderCounterparty; + contextCallingContextParsers[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = + LibRaindexSubParser.subParserOrderClearer; function(uint256, uint256, OperandV2) internal view returns (bool, bytes memory, bytes32[] memory)[] memory contextCalculationsParsers = diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index 3e146460fa..b3b0a2d399 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -64,7 +64,6 @@ import { } from "../../lib/LibRaindex.sol"; import {RaindexV6FlashLender} from "../../abstract/RaindexV6FlashLender.sol"; import {LibBytes32Array} from "rain-solmem-0.1.28/src/lib/LibBytes32Array.sol"; -import {LibBytes32Matrix} from "rain-solmem-0.1.28/src/lib/LibBytes32Matrix.sol"; import {LibFormatDecimalFloat} from "rain-math-float-0.3.10/src/lib/format/LibFormatDecimalFloat.sol"; import { @@ -319,7 +318,10 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex /// with a context of the order hash and the caller. function _doOrderPost(bytes32 orderHash, TaskV2[] calldata post) internal { LibRaindex.doPost( - LibBytes32Matrix.matrixFrom(LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender))))), + LibRaindex.callingContextColumn( + CONTEXT_CALLING_CONTEXT_COLUMN, + LibBytes32Array.arrayFrom(orderHash, bytes32(uint256(uint160(msg.sender)))) + ), post ); } @@ -351,6 +353,7 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex msg.sender, quoteConfig.signedContext, new bytes32[](0), + false, false ); // true is quote2's "order is live" result required by IRaindexV6. @@ -441,7 +444,8 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex msg.sender, takeOrderConfig.signedContext, new bytes32[](0), - true + true, + false ); // Skip orders that are too expensive rather than revert as we have @@ -635,7 +639,8 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex bobOrder.owner, bobSignedContext, new bytes32[](0), - false + false, + true ); (, OrderIOCalculationV4 memory bobOrderIOCalculation) = calculateOrderIO( bobOrder, @@ -644,7 +649,8 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex aliceOrder.owner, aliceSignedContext, new bytes32[](0), - false + false, + true ); // Each side must be one `takeOrders4` would take. Given this, each @@ -720,6 +726,8 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex /// single-order callers (`quote`, `clear3`). /// @param skipFailure If true, a reverting calculate eval or a stack shorter /// than `CALCULATE_ORDER_MIN_OUTPUTS` returns false instead of reverting. + /// @param clearing Whether the order column includes the clearer row; true + /// only for `clear3`. /// @return False if `skipFailure` caught a failure, in which case the /// calculation is zeroed and MUST NOT be used. /// @return The order IO calculation. @@ -730,15 +738,23 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex address counterparty, SignedContextV1[] memory signedContext, bytes32[] memory stateOverlay, - bool skipFailure + bool skipFailure, + bool clearing ) internal view returns (bool, OrderIOCalculationV4 memory) { unchecked { bytes32[][] memory context; { bytes32[][] memory callingContext = new bytes32[][](CALLING_CONTEXT_COLUMNS); - callingContext[CONTEXT_CALLING_CONTEXT_COLUMN - 1] = LibBytes32Array.arrayFrom( - order.hash(), bytes32(uint256(uint160(order.owner))), bytes32(uint256(uint160(counterparty))) - ); + callingContext[CONTEXT_CALLING_CONTEXT_COLUMN - 1] = clearing + ? LibBytes32Array.arrayFrom( + order.hash(), + bytes32(uint256(uint160(order.owner))), + bytes32(uint256(uint160(counterparty))), + bytes32(uint256(uint160(msg.sender))) + ) + : LibBytes32Array.arrayFrom( + order.hash(), bytes32(uint256(uint160(order.owner))), bytes32(uint256(uint160(counterparty))) + ); // The calculations column holds the calculated max output and IO // ratio, which only become known after the calculate eval below. diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index dc07d99044..4bf5a855d5 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xabceaad67b2bfb22234dced976036095d341129762d317512657852774711ece); +bytes32 constant BYTECODE_HASH = bytes32(0xbb26d1e20a8360e1508cbc0938a2ed1ad7af70827261928c041de84987ca731e); /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xa18bcfb6026768fff923ba3f6d2ab7c37c7a6ab3f226e540ca92278af8d56f2c); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x8336a7fad53960ed41ca79692ce772de758261a38ddecfa23983c3b89d00aaba); /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -27,7 +27,7 @@ bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xa18bcfb6026768fff923ba3f6d2a /// bit count of the previous bloom filter. If we reach the end of the bloom /// filters then we have a miss. bytes constant PARSE_META = - hex"0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb02e0f14716565589"; + hex"0101180010a00082000100010480300038412a001810000010020004200004002038038ff54905cc66c61ef3dcab071659220a895f0b15fec9301a02e0920d5bfe561c21609201e959460c19742710844db209bcd3bf1d9893761f1049db12b93430190ae9a00bf82a7806c138f40e28083f0842ef2104d561fd1315a13316716a6118d260cc117b9bfc0fec7ade14cba28900a422961b6b14a520792bdb02e0f14717565589"; /// @dev The build depth of the parser meta. @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"16ee170b171a1729173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c"; + hex"175a17771786179517a417b417c417d317e317f21802181218211831184018501860187018e418f3190219121922193219421951196019701980199019a0187f1898"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d90"; + hex"1d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d701e0c"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index cbcbba529a..71536061c2 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xa088203b422b62929604975e9beb83d3f206346c16baa7db9be307c2e6e2595a); +bytes32 constant BYTECODE_HASH = bytes32(0x5f8ff7b5df3dbfc90dea13d5885222913cea5d98fc94594e2dd268a326a0e73a); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xCe7e82b8b5f7188405Faaa9022e9cEb963f2a477); +address constant DEPLOYED_ADDRESS = address(0x0D05DD5A9970239b6010558eDaE03B4f2E7E4DF1); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612413806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673cf305dd5de53b94dfbf55d560a51f602d9802370146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373cf305dd5de53b94dfbf55d560a51f602d980237014155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612413806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316738b501ada8bf1a4c132bdd023eccb481df0a0c722146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033738b501ada8bf1a4c132bdd023eccb481df0a0c72214155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673cf305dd5de53b94dfbf55d560a51f602d9802370146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373cf305dd5de53b94dfbf55d560a51f602d980237014155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316738b501ada8bf1a4c132bdd023eccb481df0a0c722146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033738b501ada8bf1a4c132bdd023eccb481df0a0c72214155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000059a0000000000000000000000000cf305dd5de53b94dfbf55d560a51f602d9802370000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000058f96080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b92610157612ad8565b612261565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b9190610278612ad8565b60405192610285846119d4565b5f84523691611dfb565b90612fb7565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612245565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b30614169565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f929192612ad8565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6140ff565b614154565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b60608201526064840135608082015261057181612b1a565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550612b4b565b8190838080808080610587565b6106486104af848b612121565b61065181614ef0565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c0906004353603011261018257610764612ad8565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184612bc6565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613500565b6109de81612b1a565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613572565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af160608201516044600435013590612be9565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151612bc6565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613bd9565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145a9565b90614764565b9d8e9260408d0151613ca4565b60408c0152613cce565b99613cce565b98610c5a8484613cf8565b610c648482613d56565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c0152613e68565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145a9565b60408a0151610dd98183613bd9565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613ca4565b610e129085613c00565b610dfb565b905091610de1565b50610e2d6060820151613bb6565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613bd9565b61101b5750508490610ed7856001600160a01b0360208701511633613497565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f169293511633612c10565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614041565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151612bc6565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f612ad8565b61111a848633612b92565b61112383612bc6565b15611268576111338486336131ca565b61113d8185613bd9565b15611262575082935b61115285828833613439565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613497565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612229565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761135195602092169361131386858761335a565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a457611399935030916133d3565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b604435916131ca565b604051908152f35b3461018257611436366118b0565b83949392611442612ad8565b61144d848633612b92565b61145681612bc6565b1561155c578061146a6114b9928733612c10565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612cb6565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612229565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e612ad8565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b612b1a565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1612b4b565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121806116376121798380611f4f565b3690611b81565b5f525f602052600160405f20540361222057806121a08161220c93611f4f565b6122046121bf6121c46020850135938460408701359384923690611b81565b613500565b6121dc6121d18580611f4f565b946060810190611ead565b92906121fc604051966121ee886119d4565b5f88525f3681373690611b81565b933691611c14565b92339261381e565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60c08110612237575050565b60608282015260200161222b565b5f5b82811061225357505050565b606082820152602001612247565b91926001600160a01b038351166001600160a01b0383511614612ac6576001600160a01b03612297606085015160643590612007565b5151166001600160a01b036122b3604085015160843590612007565b51511614801590612a86575b610e32576001600160a01b036122dc604085015160443590612007565b5151166001600160a01b036122f76064356060870151612007565b51511614612a745761230883612b1a565b805f525f60205260405f205415612a25575061232382612b1a565b805f525f60205260405f2054156129d5575061269392937f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061238761237961012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16126006001600160a01b0384511692604051936123d7856119d4565b5f85526123e2613535565b50604051906123f0826119b8565b6006825261240060208301612229565b61240989612b1a565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261243c82611faa565b5261244681611faa565b5060405161245381611950565b60028152604036602083013761246882611fb7565b5261247281611fb7565b506125466124996001600160a01b0361249160443560408d0151612007565b51511661454d565b6124df6001600160a01b038b51168b60206124d66001600160a01b036124c56044356040860151612007565b515116926040604435910151612007565b510151916131ca565b908a60ff60206125116001600160a01b036125006044356040870151612007565b515116936040604435910151612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61254f82611fc7565b5261255981611fc7565b506125e76125786001600160a01b0361249160643560608d0151612007565b6125b56001600160a01b038b51168b60206124d66001600160a01b036125a46064356060860151612007565b515116926060606435910151612007565b908a60ff60206125116001600160a01b036125d66064356060870151612007565b515116936060606435910151612007565b6125f082611fd7565b526125fa81611fd7565b5061431b565b915f6001600160a01b038751169160208801908151906001600160a01b0360208184511693015116928585523060205260408086209151015160405191612646836119d4565b86835260405195612656876119b8565b86526020860152604085015284606085015287608085015260a084015260c0830152604051808099819463d04dfe2360e01b835260048301612ebe565b03915afa94855f915f976129af575b506126b2576040513d5f823e3d90fd5b94908551600281106129975750906127859291604060208801519701516126e16126db87611fe7565b51611fd7565b516126ec8183613bd9565b1561298f5750945b6127168887919060405192600284526020840152604083015260608201604052565b61271f82611fc7565b5261272981611fc7565b5060405195612737876119b8565b8987526064356020880152604087015260608601978852608086015260a085015260c08401526001600160a01b038651169060405191612776836119d4565b5f835260a4356084358761381e565b9390506127956040830151612bc6565b15908115612979575b8115612968575b508015612955575b61294357604051916127be83611988565b5f83525f60208401525f60408401525f60608401526127dd8483614f14565b845260408401526128036127f18386614f14565b60208601528060608601528451613ca4565b946128176020850151604086015190613ca4565b9361282187613bb6565b8015612934575b612922576128e961291b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128cb6129209a60a09661286a8a8851613cf8565b6128788c6020890151613cf8565b6128868a6040890151613d56565b6128948c6060890151613d56565b61289d8a614041565b6128a68c614041565b6001600160a01b036128c260c435926060606435910151612007565b51511633612cb6565b50506001600160a01b036128c260e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e68565b613e68565b565b604051630d86822160e01b8152600490fd5b5061293e85613bb6565b612828565b6040516321badf1f60e01b8152600490fd5b506129636060840151613bb6565b6127ad565b612973915051613bb6565b5f6127a5565b90506129886040850151612bc6565b159061279e565b9050946126f4565b60249060405190630fbb8e5560e21b82526004820152fd5b9096506129ce91503d805f833e6129c681836119f0565b810190612d7a565b955f6126a2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9251604080513381526001600160a01b039092166020830152810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3925081905060608101612a20565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612aa0606084015160a43590612007565b5151166001600160a01b03612abc604086015160443590612007565b51511614156122bf565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b085760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b4581612b37602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b6129209291612b7661028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611dfb565b909115612b9d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612be5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1290565b90612be5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b929192612c1c8261423c565b93612c2681613bb6565b612ca45784816001600160e01b03612c459360e01d9116601b0b615077565b9290809315612c7b575b50829081612c5f575b5050509190565b612c73926001600160a01b033092166133d3565b5f8181612c58565b9092505f198114612c9057600101915f612c4f565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612cc383613bb6565b612d615784612cdf57612cd7939450613497565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613cce565b95612d2687613bb6565b612d49575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612db582611ad4565b91612dc360405193846119f0565b808352848084019160051b830101918683116101825785809101915b838310612e525750505050948281015191821161018257019180601f84011215610182578251612e0e81611ad4565b93612e1c60405195866119f0565b818552838086019260051b820101928311610182578301905b828210612e43575050505090565b81518152908301908301612e35565b8251815291810191869101612ddf565b90808251908181526020809101926020808460051b8301019501935f915b848310612e905750505050505090565b9091929394958480612eae600193601f198682030187528a516120ee565b9801930193019194939290612e80565b91906020928381526001600160a01b0382511684820152838201516040820152612ef8604083015160e060608401526101008301906118fc565b9060608301516080820152612f1f608084015192601f1993848483030160a0850152612e62565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f6257505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101612f3e565b90604082019082526020606081936040838201528551809452019301915f5b828110612fa3575050505090565b835185529381019392810192600101612f95565b919091604092835192612fc9846119b8565b60068452602094612fdb868601612229565b5f5b84518110156130105780612ff360019287612007565b51612ffe8289612007565b526130098188612007565b5001612fdd565b50925092939093335f52308252825f209183519561302d8761196c565b613035611ee3565b87526060828198015284519061304a826119d4565b5f8252855190613059826119d4565b5f82525f3681375f5b81518110156131be578986886130788486612007565b51888151948d8087015190815161309a575b5050505050505050600101613062565b905f92916001600160a01b03966130bf8887818d51169c01511699878901519061431b565b958251996130cc8b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180613107600498898301612ebe565b03915afa9384156131b4579089915f95613196575b508451613132575b50899250808e8c938e61308a565b5101511691823b1561018257613160925f92838d5180968195829463012c676d60e21b845233908401612f76565b03925af1801561318c57906001929161317d575b81928782613124565b613186906119a4565b5f613174565b89513d5f823e3d90fd5b6131ab9195503d805f833e6129c681836119f0565b9050935f61311c565b8c513d5f823e3d90fd5b50505050505050509050565b82156131ff576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061320b8261454d565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715613321575f9761332b575b508361326261325b836132929a61522c565b50906149b7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715613321575f976132f0575b5061325b6132b691611a739861522c565b506132c18183613bd9565b156132e85750935b5f5260018252825f20905f528152815f20905f8052525f205490613cce565b9050936132c9565b96508387813d831161331a575b61330781836119f0565b810103126101825795519561325b6132a5565b503d6132fd565b85513d5f823e3d90fd5b96508387813d8311613353575b61334281836119f0565b810103126101825795519583613249565b503d613338565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f51148116156133b4575b836040521561339e57505050565b635274afe760e01b835216600482015260249150fd5b60018115166133ca57813b15153d151616613390565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613423575b836040525f6060521561339e57505050565b60018115166133ca57813b15153d151616613411565b9392919361344683613bb6565b612d61578461345a57612cd7939450612c10565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613ca4565b909291926134a48161423c565b936134ae81613bb6565b6134ee5784816001600160e01b036134cd9360e01d9116601b0b615077565b508092816134dc575050509190565b6001600160a01b03612c73931661335a565b604051632d1671a360e11b8152600490fd5b9161352b906060613520936001600160a01b039485916040880151612007565b515116940151612007565b51511614612a7457565b60405190613542826119b8565b606060c08361354f611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613581613535565b505f9260406136a6815192613595846119b8565b600684526020936135a7858201612229565b61366f6135b38b612b1a565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135ea86611faa565b526135f485611faa565b50875161360081611950565b6002815288368b83013761361386611fb7565b5261361d85611fb7565b5060ff896125118a8501936136598761363b81612491858a51612007565b9751168861364a848951612007565b515116856124d6858a51612007565b96613665828751612007565b5151169451612007565b61367882611fc7565b5261368281611fc7565b506125e7878b8d60ff896125118c8501936136598761363b81612491858a51612007565b946137265f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136de836119d4565b8683528951956136ed876119b8565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612ebe565b03915afa90815f915f93613800575b506137f3575050505f975b6002855110988915996137e0578284870151960151906137626126db89611fe7565b519061376e8284613bd9565b1590506137d85750925b61379a8685919060405192600284526020840152604083015260608201604052565b6137a388611fc7565b526137ad87611fc7565b5082519b6137ba8d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613778565b5050505050505050509150611a73613535565b9199985094509396613740565b90925061381791503d805f833e6129c681836119f0565b915f613735565b9495939592919261382d613535565b5060409687519061383d826119b8565b6006825260209361384f858401612229565b61385889612b1a565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261388a84611faa565b5261389483611faa565b5089516138a081611950565b600281528a36878301376138b384611fb7565b526138bd83611fb7565b508989019086818351906138d091612007565b5151166138dc9061454d565b86888c511689848651906138ef91612007565b515116828587519061390091612007565b5101519061390d926131ca565b92898186519061391c91612007565b51511694519061392b91612007565b5101519060ff16613963929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61396c83611fc7565b5261397682611fc7565b5060608801858782519061398991612007565b5151166139959061454d565b868a511687898451906139a791612007565b515116878a8551906139b891612007565b510151906139c5926131ca565b90868989818651906139d691612007565b5151169451906139e591612007565b5101519060ff16613a1d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a2683611fd7565b52613a3082611fd7565b50613a3a9161431b565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a6b836119d4565b5f83528c5196613a7a886119b8565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613ab99060048301612ebe565b03815a935f94fa91825f915f94613b98575b50613ada5788513d5f823e3d90fd5b97949596979194825196600288109788613b8157508183850151940151613b036126db87611fe7565b51613b0e8183613bd9565b15613b795750925b613b388585919060405192600284526020840152604083015260608201604052565b613b4187611fc7565b52613b4b86611fc7565b5082519a613b588c6119b8565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613b16565b602490835190630fbb8e5560e21b82526004820152fd5b909350613baf91503d805f833e6129c681836119f0565b925f613acb565b613bd5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1390565b90613bd5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b613c276001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461476e565b90637ffffff58213613c77575b90613c3e916149b7565b9290921580613c6f575b613c5157505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c48565b613c818282615657565b15613c3457604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614bbd565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d81565b613d52916080810182613d14613d0e8351611fe7565b51611fe7565b52613d4b613d456001600160a01b03809451511693613d3c613d368551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613439565b5050565b90608081019180613d6a613d0e8551611fd7565b526001600160a01b03809251511691613d86613d368551611fd7565b5116613d95613d458551611fd7565b519081613e3057613da583613bb6565b612d61579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a20955f5260209060018252613dfb604094855f20835f528452855f20855f528452855f2054613cce565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e62565b91613e61917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a2095612cb6565b5050613e15565b60c0810151908151915f92613fdc575b50613f1d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613ec5836119d4565b8683528c5193613ed4856119d4565b8785528d5196613ee3886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ebe565b03915afa948515613fd2578795613fb4575b508451613f40575b50505050505050565b81905101510151169051813b15613fb057918491849383613f75965180978195829463012c676d60e21b845260048401612f76565b03925af1908115613fa75750613f90575b8080808080613f37565b613f9a82916119a4565b613fa45780613f86565b80fd5b513d84823e3d90fd5b8480fd5b613fc99195503d8089833e6129c681836119f0565b9050935f613f2f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761401f925f928360405180968195829463012c676d60e21b845260048401612f76565b03925af1801561022c5715613e78576140399192506119a4565b5f905f613e78565b60808101614052613d458251611fd7565b5191821561405f57505050565b614079613d366001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166140b4575b505050505050565b6140d8955f9284845260018152828420868552815282842091845252812055613497565b5f8080806140ac565b81156140eb570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614147576020810151908051603f198101908111612c905760051c82116141335760016020920160051b010190565b5050604051614141816119d4565b5f815290565b50604051614141816119d4565b80511561416457602001515f1a90565b505f90565b905f8091602081519101845af480806141e7575b1561419d5750506040513d81523d5f602083013e60203d82010160405290565b156141c457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141d5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061417d5750813b151561417d565b6004111561420457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614238836141fa565b0152565b614244615745565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614312575f925f946142dd575b5061429a836141fa565b6001831415806142cb575b6142af5750505090565b5163ee07877f60e01b81529182916106df919060048401614218565b506142d5836141fa565b8215156142a5565b908094506143019293503d851161430b575b6142f981836119f0565b81019061504d565b919091925f614290565b503d6142ef565b513d5f823e3d90fd5b9080519161432883611ad4565b9161434360409461433b865195866119f0565b808552611ad4565b601f1994602091860136868401378351835190959080156145425760016143999101965b600197889101019761439061437b8a611ad4565b9961438886519b8c6119f0565b808b52611ad4565b01848901612245565b85805f96845160028152338782015230868201526060810186526143bc8b611faa565b526143c68a611faa565b505f925b6144fe575b50505083516143e2575b50505050505090565b858095989796929801816143f68289612007565b526144018188612007565b505f925b614414575b50859697506143d9565b84518310156144f9576001600160a01b0361448b816144338689612007565b51511686614441878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614482888b612007565b510151916151a3565b156144e157868098999a9281926144a2878a612007565b5151166144af8787612007565b520193856144bd8289612007565b5101516144ca868c612007565b526144d5858b612007565b50019290989796614405565b8951630a57f30960e31b815260048101859052602490fd5b61440a565b90919681518810156145395782809101976145198184612007565b516145248a8d612007565b5261452f898c612007565b50019190816143ca565b968291506143cf565b506143995f96614367565b614555615745565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614312575f925f946142dd575061429a836141fa565b9091939284158215175f146145c35750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146fa575b50506145e68161531c565b936145f08161531c565b946145fb868261533c565b909182156146eb575f9083986f0785ee10d5da46d900f436a0000000008086116146dd575b50670de0b6b3a7640000808b116146ce575b50633b9aca00808b116146bf575b50612710808b116146b1575b5098805b6146a0575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c17029161534f565b60019290920191600a900480614650565b60049a04998a93019261464c565b600991939a049901915f614640565b601291939a049901915f614632565b85049950602592505f614620565b509290506118f894955061534f565b5f82121561474e57808413614740575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145db579092506118f893949161525a565b9092506118f89394916152c1565b8084121561470a579092506118f893949161525a565b613c3e82826149b7565b92909180614794576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147a957505050505f905f90565b6147c2936147b691615409565b92919490938492615409565b90939192846147d08861531c565b916147da8661531c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614981575b030191600160ff1b98838a018112155f1461494e575050035b5f955f821280614945575b614927575b5f811280614915575b6148f75786820103966001600160ff1b03881490816148ed575b50806148e4575b806148db575b6148bd57509061487192916155b5565b915f8113614884575b506118f89361534f565b9091604c82136148b25761489b91600a0a906140e1565b9081156148a8575f61487a565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614861565b5082841461485b565b905088145f614854565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361483a565b955080870186131561493f5786818703015b95614831565b5f614939565b505f811361482c565b89985090920390506001600160ff1b03819003870182136149725701860194614821565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614808565b81156140eb570590565b8082601b82810b8314614bac577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b58575b8380820b03614b4757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614af8575b838060030b03614a7c575b808413614a605750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140eb576001600160e01b0391071592614a57565b92915f841315614acc575090614a928383615657565b614aae57637ffffffe1901600a0a810290637fffffff92614a42565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148b257614aeb91600a0a906149ad565b9182156148a85792614a42565b5f198401808060030b14614b0c5750614a37565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149ea565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b99576305f5e100600894058094819201955b9150506149ea565b620186a060059405809481920195614b91565b5082614a3757505050505f90600190565b919291600160ff1b8401614bd5576118f89350615670565b906118f8935f0391614d81565b919291600160ff1b9190801580614d6f575090614bfe91615409565b9490929091905f868585858282138015614d66575b614d49575b505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614d14575b505081019182821860ff1c1115614d0c57826001600160ff1b0314614cee57905f600192135f14614cbf57600a9004915b01925b81158117614c8357509190565b80614c9c575b508015614c94579190565b505f91508190565b9192614cb29203600160ff1b01600a0a906149ad565b600160ff1b91905f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c73565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c76565b8107614d21575b80614c42565b60ff1d600117015f614d1b565b505050919350614d3c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c18565b50835f12614c13565b15614d7a5750509190565b9350919050565b9392919384158115818117614ed257505090614d9c91615409565b9194908295614dad82958294615409565b8096929491969387868482138015614ec9575b614eb0575b5050505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614e96575b505081019182821860ff1c1115614e8e57826001600160ff1b0314614cee57905f600192135f14614e5f57600a9004915b01925b81158117614e3257509190565b80614e4257508015614c94579190565b600160ff1b93614e599291038401600a0a906149ad565b5f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e22565b509092614e25565b8107614ea3575b80614df1565b60ff1d600117015f614e9d565b929b5098509196509450925090505f8080808080614dc5565b50858412614dc0565b9395939092919015614ee8575050614c94579190565b945092915050565b6008815110614164576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f4e610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b94519301614f5d815186612be9565b614f65575050565b909350611a7391925051925183613c00565b92915f9060018184145f87128715171717614ff1575f92808213614fe3575b03604c81135f821217614fd757600a0a9084614fb583820293846149ad565b14614fca57505015614fc6575f9190565b5f90565b9093509015611a73579190565b505015614fc6575f9190565b5f9560019450925090614f96565b5050505f90565b93929190918083145f83125f87121883158715171717615047575f9280821361503a5703604c81135f821217614fd757600a0a9084614fb583820293846149ad565b9194600193509190614f96565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561509f576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836150b157505090505f90600190565b60ff8116820191808312615179575f8312156150e9575050604c198112614c94575f03600a0a916150e283826140e1565b9283021490565b909293915f81135f1461516f57604d811361514457600a0a9283156140eb57835f1904831161511b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151de576151b591926157ae565b506151bf816141fa565b1591826151cb57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b909392915f61526a9181846145a9565b9490945f84830191820194121590816152b7575b81156152ad575b5061528f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615285565b828112915061527e565b6152d693600160fe1b908101939201906145a9565b9081815f82121561530d575050604b198212612cd7576152fb915f03600a0a906149ad565b9081615305575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615335575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153e4576001600160ff1b0392838311156153ce57600160ff1b9383850361538457505050509190565b9091929350851461539e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c90575f039190565b90916001600160ff1b0380841115612c5857851461539e575050600a60019104920190565b91909180156155ab57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156154b9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8301106154aa575b83136154945791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615488565b6f4b3b4ca85a86c47a098a22400000000080840515615599575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615582575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000083051561556e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561555e5782051561554f575b5f61543d565b9290600a02905f190192615549565b939160640291600119019361551a565b93916402540be4000291600919019361551a565b9391678ac7230489e80000029160121901936154f5565b6025198301955092909202915f6154d3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615633571461562b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561566b575f036157e8565b6157e8565b909291600160ff1b9182810161570257508084146156f8578084139182156156f0578185035b604c8111156156df5750505f915b156156d057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140eb5704916156a4565b848203615696565b505090505f905f90565b9361570f92945f03614be2565b80939180928114615723575b50505f039190565b915092506001600160ff1b038314614cee57600a600191059201915f8061571b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615783575b61576b5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615764565b81519190604183036157de576157d79250602082015190606060408401519301515f1a90615877565b9192909190565b50505f9160029190565b90637ffffff581131561587157637ffffffe198101906043821361586a575f82121561583e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140eb577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158ee579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158e457905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000008b501ada8bf1a4c132bdd023eccb481df0a0c72200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005aeb6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b9261015761308d565b612551565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b919061027861308d565b60405192610285846119d4565b5f84523691611dfb565b90613581565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612535565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b3061435b565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f92919261308d565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6142f1565b614346565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b606082015260648401356080820152610571816130cf565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550613100565b8190838080808080610587565b6106486104af848b612121565b610651816150e2565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461308d565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184613190565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613aca565b6109de816130cf565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613b3c565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af1606082015160446004350135906131b3565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151613190565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613dcb565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b61479b565b90614956565b9d8e9260408d0151613e96565b60408c0152613ec0565b99613ec0565b98610c5a8484613eea565b610c648482613f48565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c015261405a565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b61479b565b60408a0151610dd98183613dcb565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613e96565b610e129085613df2565b610dfb565b905091610de1565b50610e2d6060820151613da8565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613dcb565b61101b5750508490610ed7856001600160a01b0360208701511633613a61565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f1692935116336131da565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614233565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151613190565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f61308d565b61111a84863361315c565b61112383613190565b1561126857611133848633613794565b61113d8185613dcb565b15611262575082935b61115285828833613a03565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613a61565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612519565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff91606435838111610182573660238201121561018257806004013593841161018257366024858301011161018257611351956020921693611313868587613924565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a4576113999350309161399d565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b60443591613794565b604051908152f35b3461018257611436366118b0565b8394939261144261308d565b61144d84863361315c565b61145681613190565b1561155c578061146a6114b99287336131da565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613280565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612519565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e61308d565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b6130cf565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1613100565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b9061218161163761217a8480611f4f565b3690611b81565b5f5260205f81526040926001845f20540361250e57916124039161220885855f6123886121b1836121c89a611f4f565b6121cd878501359182878701359c8d923690611b81565b613aca565b6121e56121da8580611f4f565b946060810190611ead565b96906122008751966121f6886119d4565b8688523690611b81565b973691611c14565b90612211613aff565b50612338865191612221836119b8565b600683526122308a8401612519565b8861223a816130cf565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261226d86611faa565b5261227785611faa565b50805161228381611950565b6002815281368e83013761229686611fb7565b526122a085611fb7565b50810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b51511661473f565b975116906122d4898851612007565b515116846122e38a8951612007565b51015191613794565b958d6122f9828751612007565b5151169451612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61234182611fc7565b5261234b81611fc7565b5061236f8b886060810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b61237882611fd7565b5261238281611fd7565b5061450d565b918385511693868601918b83519289818551169401511693878652308a528180872091510151908251926123bb846119d4565b87845251956123c9876119b8565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301613488565b03915afa95865f915f986124e8575b506124215788513d5f823e3d90fd5b95938651600281106124d15750888798998260c0979899015199015161244f61244985611fe7565b51611fd7565b5161245a8183613dcb565b156124c75750998a925b6124868b85919060405192600284526020840152604083015260608201604052565b61248f86611fc7565b5261249985611fc7565b508251966124a6886119b8565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612464565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061250791503d805f833e6124ff81836119f0565b810190613344565b965f612412565b505f92508291829150565b5f5b60c08110612527575050565b60608282015260200161251b565b5f5b82811061254357505050565b606082820152602001612537565b926001600160a01b038451166001600160a01b038351161461307b576001600160a01b03612586606086015160643590612007565b5151166001600160a01b036125a2604085015160843590612007565b5151161480159061303b575b610e32576001600160a01b036125cb604086015160443590612007565b5151166001600160a01b036125e66064356060880151612007565b51511614613029576125f7846130cf565b805f525f60205260405f205415612fd95750612612826130cf565b805f525f60205260405f205415612f895750612928907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061267561266761012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16128956001600160a01b0384511691604051926126c5846119d4565b5f84526126d0613aff565b50604051906126de826119b8565b600682526126ee60208301612519565b6126f7896130cf565b906001600160a01b038a5116604051926004845260208401526040830152606082015233608082015260a0810160405261273082611faa565b5261273a81611faa565b5060405161274781611950565b60028152604036602083013761275c82611fb7565b5261276681611fb7565b506127f46127856001600160a01b036122bd60443560408d0151612007565b6127c26001600160a01b038b51168b60206122e36001600160a01b036127b16044356040860151612007565b515116926040604435910151612007565b908a60ff60206123036001600160a01b036127e36044356040870151612007565b515116936040604435910151612007565b6127fd82611fc7565b5261280781611fc7565b5061236f6128266001600160a01b036122bd60643560608d0151612007565b6128636001600160a01b038b51168b60206122e36001600160a01b036128526064356060860151612007565b515116926060606435910151612007565b908a60ff60206123036001600160a01b036128846064356060870151612007565b515116936060606435910151612007565b905f6001600160a01b038751169160208801908151906001600160a01b03602081845116930151169285855230602052604080862091510151604051916128db836119d4565b868352604051956128eb876119b8565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b835260048301613488565b03915afa92835f915f95612f6b575b50612947576040513d5f823e3d90fd5b9291835160028110612f2d57506040602085015194015161296a61244983611fe7565b516129758183613dcb565b15612f635750935b61299f8186919060405192600284526020840152604083015260608201604052565b6129a883611fc7565b526129b282611fc7565b50604051946129c0866119b8565b888652606435602087015260408601526060850152608084015260a083015260c0820152612bc86001600160a01b038551169360405194612a00866119d4565b5f8652612a0b613aff565b5060405190612a19826119b8565b60068252612a2960208301612519565b612a32866130cf565b906001600160a01b03875116604051926004845260208401526040830152606082015233608082015260a08101604052612a6b82611faa565b52612a7581611faa565b50604051612a8281611950565b600281526040366020830137612a9782611fb7565b52612aa181611fb7565b50612b2b612ac06001600160a01b036122bd60843560408a0151612007565b612afb6001600160a01b038851166001600160a01b03612ae660843560408c0151612007565b51511660206122e360843560408d0151612007565b906001600160a01b03612b1460843560408b0151612007565b51511660ff602061230360843560408d0151612007565b612b3482611fc7565b52612b3e81611fc7565b5061236f612b5d6001600160a01b036122bd60a43560608a0151612007565b612b986001600160a01b038851166001600160a01b03612b8360a43560608c0151612007565b51511660206122e360a43560608d0151612007565b906001600160a01b03612bb160a43560608b0151612007565b51511660ff602061230360a43560608d0151612007565b92612c5e5f6001600160a01b038551169260208601908151906001600160a01b0360208184511693015116928685523060205260408086209151015160405191612c11836119d4565b86835260405195612c21876119b8565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93612f45575b50612c7d576040513d5f823e3d90fd5b90815160028110612f2d575060406020830151920151612c9f61244988611fe7565b51612caa8183613dcb565b15612f255750925b612cd48385919060405192600284526020840152604083015260608201604052565b612cdd88611fc7565b52612ce787611fc7565b5060405196612cf5886119b8565b86885260a43560208901526040880194855260608801938452608088015260a087015260c0860152612d2a6040840151613190565b15918215612f11575b508115612efc575b8115612eeb575b50612ed95760405191612d5483611988565b5f83525f60208401525f60408401525f6060840152612d738483615106565b84526040840152612d99612d878386615106565b60208601528060608601528451613e96565b94612dad6020850151604086015190613e96565b93612db787613da8565b8015612eca575b612eb857612e7f612eb1957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d94612e61612eb69a60a096612e008a8851613eea565b612e0e8c6020890151613eea565b612e1c8a6040890151613f48565b612e2a8c6060890151613f48565b612e338a614233565b612e3c8c614233565b6001600160a01b03612e5860c435926060606435910151612007565b51511633613280565b50506001600160a01b03612e5860e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161405a565b61405a565b565b604051630d86822160e01b8152600490fd5b50612ed485613da8565b612dbe565b6040516321badf1f60e01b8152600490fd5b612ef6915051613da8565b5f612d42565b9050612f0b6060830151613da8565b90612d3b565b612f1d91925051613190565b15905f612d33565b905092612cb2565b60249060405190630fbb8e5560e21b82526004820152fd5b909250612f5c91503d805f833e6124ff81836119f0565b915f612c6d565b90509361297d565b909450612f8291503d805f833e6124ff81836119f0565b935f612937565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612fd4565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03613055606084015160a43590612007565b5151166001600160a01b03613071604087015160443590612007565b51511614156125ae565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146130bd5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516130fa816130ec602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b612eb6929161312b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193613139856119b8565b6006855261314960208601612519565b61315285611faa565b5261124d84611faa565b909115613167575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6131af905f60e01d906001600160e01b038160e01d9116601b0b615169565b1290565b906131af916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b9291926131e68261442e565b936131f081613da8565b61326e5784816001600160e01b0361320f9360e01d9116601b0b615269565b9290809315613245575b50829081613229575b5050509190565b61323d926001600160a01b0330921661399d565b5f8181613222565b9092505f19811461325a57600101915f613219565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361328d83613da8565b61332b57846132a9576132a1939450613a61565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613ec0565b956132f087613da8565b613313575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261337f82611ad4565b9161338d60405193846119f0565b808352848084019160051b830101918683116101825785809101915b83831061341c5750505050948281015191821161018257019180601f840112156101825782516133d881611ad4565b936133e660405195866119f0565b818552838086019260051b820101928311610182578301905b82821061340d575050505090565b815181529083019083016133ff565b82518152918101918691016133a9565b90808251908181526020809101926020808460051b8301019501935f915b84831061345a5750505050505090565b9091929394958480613478600193601f198682030187528a516120ee565b980193019301919493929061344a565b91906020928381526001600160a01b03825116848201528382015160408201526134c2604083015160e060608401526101008301906118fc565b90606083015160808201526134e9608084015192601f1993848483030160a085015261342c565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061352c57505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101613508565b90604082019082526020606081936040838201528551809452019301915f5b82811061356d575050505090565b83518552938101939281019260010161355f565b919091604092835192613593846119b8565b600684526020946135a5868601612519565b5f5b84518110156135da57806135bd60019287612007565b516135c88289612007565b526135d38188612007565b50016135a7565b50925092939093335f52308252825f20918351956135f78761196c565b6135ff611ee3565b875260608281980152845190613614826119d4565b5f8252855190613623826119d4565b5f82525f3681375f5b8151811015613788578986886136428486612007565b51888151948d80870151908151613664575b505050505050505060010161362c565b905f92916001600160a01b03966136898887818d51169c01511699878901519061450d565b958251996136968b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b825281806136d1600498898301613488565b03915afa93841561377e579089915f95613760575b5084516136fc575b50899250808e8c938e613654565b5101511691823b156101825761372a925f92838d5180968195829463012c676d60e21b845233908401613540565b03925af18015613756579060019291613747575b819287826136ee565b613750906119a4565b5f61373e565b89513d5f823e3d90fd5b6137759195503d805f833e6124ff81836119f0565b9050935f6136e6565b8c513d5f823e3d90fd5b50505050505050509050565b82156137c9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506137d58261473f565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156138eb575f976138f5575b508361382c6138258361385c9a61541e565b5090614ba9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156138eb575f976138ba575b5061382561388091611a739861541e565b5061388b8183613dcb565b156138b25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ec0565b905093613893565b96508387813d83116138e4575b6138d181836119f0565b810103126101825795519561382561386f565b503d6138c7565b85513d5f823e3d90fd5b96508387813d831161391d575b61390c81836119f0565b810103126101825795519583613813565b503d613902565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561397e575b836040521561396857505050565b635274afe760e01b835216600482015260249150fd5b600181151661399457813b15153d15161661395a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156139ed575b836040525f6060521561396857505050565b600181151661399457813b15153d1516166139db565b93929193613a1083613da8565b61332b5784613a24576132a19394506131da565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613e96565b90929192613a6e8161442e565b93613a7881613da8565b613ab85784816001600160e01b03613a979360e01d9116601b0b615269565b50809281613aa6575050509190565b6001600160a01b0361323d9316613924565b604051632d1671a360e11b8152600490fd5b91613af5906060613aea936001600160a01b039485916040880151612007565b515116940151612007565b5151161461302957565b60405190613b0c826119b8565b606060c083613b19611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613b4b613aff565b50604092613c39845191613b5e836119b8565b60068352602092613b70848201612519565b613c03613b7c8a6130cf565b966001600160a01b0397888c51168a519160038352888301528a820152886060981688820152608081018a52613bb184611faa565b52613bbb83611faa565b508851613bc781611950565b60028152893688830137613bda84611fb7565b52613be483611fb7565b508a89810160ff886123036122ec8d806122c5816122bd8b8a51612007565b613c0c82611fc7565b52613c1681611fc7565b5061236f8a8a87810160ff886123036122ec8d806122c5816122bd8b8a51612007565b93613cb95f8589511697859685879b0191825191878184511693015116928b85523088528680862091510151875191613c71836119d4565b868352885195613c80876119b8565b8652898601528785015284898501528a608085015260a084015260c08301528451808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93613d8a575b50613d7e575b5050600284511097881598613d6c578183860151950151613cf161244988611fe7565b51613cfc8183613dcb565b15613d645750925b613d268685919060405192600284526020840152604083015260608201604052565b613d2f88611fc7565b52613d3987611fc7565b5082519b613d468d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613d04565b50505050505050509150611a73613aff565b90975093505f80613cce565b909250613da191503d805f833e6124ff81836119f0565b915f613cc8565b613dc7905f60e01d906001600160e01b038160e01d9116601b0b615169565b1390565b90613dc7916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b613e196001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614960565b90637ffffff58213613e69575b90613e3091614ba9565b9290921580613e61575b613e4357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613e3a565b613e738282615849565b15613e2657604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614daf565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614f73565b613f44916080810182613f06613f008351611fe7565b51611fe7565b52613f3d613f376001600160a01b03809451511693613f2e613f288551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613a03565b5050565b90608081019180613f5c613f008551611fd7565b526001600160a01b03809251511691613f78613f288551611fd7565b5116613f87613f378551611fd7565b51908161402257613f9783613da8565b61332b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd4955f5260209060018252613fed604094855f20835f528452855f20855f528452855f2054613ec0565b945f5260018252835f20905f528152825f20915f52525f20555b5160405191829133835260406020840152604083019061342c565b91614053917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd495613280565b5050614007565b60c0810151908151915f926141ce575b5061410f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916140b7836119d4565b8683528c51936140c6856119d4565b8785528d51966140d5886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301613488565b03915afa9485156141c45787956141a6575b508451614132575b50505050505050565b81905101510151169051813b156141a257918491849383614167965180978195829463012c676d60e21b845260048401613540565b03925af19081156141995750614182575b8080808080614129565b61418c82916119a4565b6141965780614178565b80fd5b513d84823e3d90fd5b8480fd5b6141bb9195503d8089833e6124ff81836119f0565b9050935f614121565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257614211925f928360405180968195829463012c676d60e21b845260048401613540565b03925af1801561022c571561406a5761422b9192506119a4565b5f905f61406a565b60808101614244613f378251611fd7565b5191821561425157505050565b61426b613f286001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166142a6575b505050505050565b6142ca955f9284845260018152828420868552815282842091845252812055613a61565b5f80808061429e565b81156142dd570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614339576020810151908051603f19810190811161325a5760051c82116143255760016020920160051b010190565b5050604051614333816119d4565b5f815290565b50604051614333816119d4565b80511561435657602001515f1a90565b505f90565b905f8091602081519101845af480806143d9575b1561438f5750506040513d81523d5f602083013e60203d82010160405290565b156143b657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156143c7576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061436f5750813b151561436f565b600411156143f657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261442a836143ec565b0152565b614436615937565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614504575f925f946144cf575b5061448c836143ec565b6001831415806144bd575b6144a15750505090565b5163ee07877f60e01b81529182916106df91906004840161440a565b506144c7836143ec565b821515614497565b908094506144f39293503d85116144fd575b6144eb81836119f0565b81019061523f565b919091925f614482565b503d6144e1565b513d5f823e3d90fd5b9080519161451a83611ad4565b9161453560409461452d865195866119f0565b808552611ad4565b601f19946020918601368684013783518351909590801561473457600161458b9101965b600197889101019761458261456d8a611ad4565b9961457a86519b8c6119f0565b808b52611ad4565b01848901612535565b85805f96845160028152338782015230868201526060810186526145ae8b611faa565b526145b88a611faa565b505f925b6146f0575b50505083516145d4575b50505050505090565b858095989796929801816145e88289612007565b526145f38188612007565b505f925b614606575b50859697506145cb565b84518310156146eb576001600160a01b0361467d816146258689612007565b51511686614633878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614674888b612007565b51015191615395565b156146d357868098999a928192614694878a612007565b5151166146a18787612007565b520193856146af8289612007565b5101516146bc868c612007565b526146c7858b612007565b500192909897966145f7565b8951630a57f30960e31b815260048101859052602490fd5b6145fc565b909196815188101561472b57828091019761470b8184612007565b516147168a8d612007565b52614721898c612007565b50019190816145bc565b968291506145c1565b5061458b5f96614559565b614747615937565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614504575f925f946144cf575061448c836143ec565b9091939284158215175f146147b55750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6148ec575b50506147d88161550e565b936147e28161550e565b946147ed868261552e565b909182156148dd575f9083986f0785ee10d5da46d900f436a0000000008086116148cf575b50670de0b6b3a7640000808b116148c0575b50633b9aca00808b116148b1575b50612710808b116148a3575b5098805b614892575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615541565b60019290920191600a900480614842565b60049a04998a93019261483e565b600991939a049901915f614832565b601291939a049901915f614824565b85049950602592505f614812565b509290506118f8949550615541565b5f82121561494057808413614932575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156147cd579092506118f893949161544c565b9092506118f89394916154b3565b808412156148fc579092506118f893949161544c565b613e308282614ba9565b92909180614986576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461499b57505050505f905f90565b6149b4936149a8916155fb565b929194909384926155fb565b90939192846149c28861550e565b916149cc8661550e565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614b73575b030191600160ff1b98838a018112155f14614b40575050035b5f955f821280614b37575b614b19575b5f811280614b07575b614ae95786820103966001600160ff1b0388149081614adf575b5080614ad6575b80614acd575b614aaf575090614a6392916157a7565b915f8113614a76575b506118f893615541565b9091604c8213614aa457614a8d91600a0a906142d3565b908115614a9a575f614a6c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614a53565b50828414614a4d565b905088145f614a46565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614a2c565b9550808701861315614b315786818703015b95614a23565b5f614b2b565b505f8113614a1e565b89985090920390506001600160ff1b0381900387018213614b645701860194614a13565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506149fa565b81156142dd570590565b8082601b82810b8314614d9e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614d4a575b8380820b03614d3957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614cea575b838060030b03614c6e575b808413614c525750506001600160e01b036001925b60e01b91161791565b8303600a0a80156142dd576001600160e01b0391071592614c49565b92915f841315614cbe575090614c848383615849565b614ca057637ffffffe1901600a0a810290637fffffff92614c34565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614aa457614cdd91600a0a90614b9f565b918215614a9a5792614c34565b5f198401808060030b14614cfe5750614c29565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614bdc565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614d8b576305f5e100600894058094819201955b915050614bdc565b620186a060059405809481920195614d83565b5082614c2957505050505f90600190565b919291600160ff1b8401614dc7576118f89350615862565b906118f8935f0391614f73565b919291600160ff1b9190801580614f61575090614df0916155fb565b9490929091905f868585858282138015614f58575b614f3b575b505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084614f06575b505081019182821860ff1c1115614efe57826001600160ff1b0314614ee057905f600192135f14614eb157600a9004915b01925b81158117614e7557509190565b80614e8e575b508015614e86579190565b505f91508190565b9192614ea49203600160ff1b01600a0a90614b9f565b600160ff1b91905f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e65565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614e68565b8107614f13575b80614e34565b60ff1d600117015f614f0d565b505050919350614f2e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614e0a565b50835f12614e05565b15614f6c5750509190565b9350919050565b93929193841581158181176150c457505090614f8e916155fb565b9194908295614f9f829582946155fb565b80969294919693878684821380156150bb575b6150a2575b5050505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084615088575b505081019182821860ff1c111561508057826001600160ff1b0314614ee057905f600192135f1461505157600a9004915b01925b8115811761502457509190565b8061503457508015614e86579190565b600160ff1b9361504b9291038401600a0a90614b9f565b5f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615014565b509092615017565b8107615095575b80614fe3565b60ff1d600117015f61508f565b929b5098509196509450925090505f8080808080614fb7565b50858412614fb2565b93959390929190156150da575050614e86579190565b945092915050565b6008815110614356576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040615140610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61479b565b9451930161514f8151866131b3565b615157575050565b909350611a7391925051925183613df2565b92915f9060018184145f871287151717176151e3575f928082136151d5575b03604c81135f8212176151c957600a0a90846151a78382029384614b9f565b146151bc575050156151b8575f9190565b5f90565b9093509015611a73579190565b5050156151b8575f9190565b5f9560019450925090615188565b5050505f90565b93929190918083145f83125f87121883158715171717615239575f9280821361522c5703604c81135f8212176151c957600a0a90846151a78382029384614b9f565b9194600193509190615188565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615291576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836152a357505090505f90600190565b60ff811682019180831261536b575f8312156152db575050604c198112614e86575f03600a0a916152d483826142d3565b9283021490565b909293915f81135f1461536157604d811361533657600a0a9283156142dd57835f1904831161530d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6153d0576153a791926159a0565b506153b1816143ec565b1591826153bd57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461544457600a6001818404940192061590565b909190600190565b909392915f61545c91818461479b565b9490945f84830191820194121590816154a9575b811561549f575b5061548157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615477565b8281129150615470565b6154c893600160fe1b9081019392019061479b565b9081815f8212156154ff575050604b1982126132a1576154ed915f03600a0a90614b9f565b90816154f7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615527575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156155d6576001600160ff1b0392838311156155c057600160ff1b9383850361557657505050509190565b90919293508514615590575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461325a575f039190565b90916001600160ff1b0380841115613222578514615590575050600a60019104920190565b919091801561579d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156156ab575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061569c575b83136156865791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f19019261567a565b6f4b3b4ca85a86c47a098a2240000000008084051561578b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615774575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615760575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561575057820515615741575b5f61562f565b9290600a02905f19019261573b565b939160640291600119019361570c565b93916402540be4000291600919019361570c565b9391678ac7230489e80000029160121901936156e7565b6025198301955092909202915f6156c5565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615825571461581d579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561585d575f036159da565b6159da565b909291600160ff1b918281016158f457508084146158ea578084139182156158e2578185035b604c8111156158d15750505f915b156158c257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156142dd570491615896565b848203615888565b505090505f905f90565b9361590192945f03614dd4565b80939180928114615915575b50505f039190565b915092506001600160ff1b038314614ee057600a600191059201915f8061590d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615975575b61595d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615956565b81519190604183036159d0576159c99250602082015190606060408401519301515f1a90615a69565b9192909190565b50505f9160029190565b90637ffffff5811315615a6357637ffffffe1981019060438213615a5c575f821215615a3057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156142dd577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615ae0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b03811615615ad657905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index 40012560e0..fe5088b36f 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xd987ab2252f55569cff4de1deef3bbe3cb998cb375f4de7bde21acf0d50f8f7e); +bytes32 constant BYTECODE_HASH = bytes32(0x48b3a47a240a5c408ed97b5ab762f0470a2136b61728772e56b5da1635612fbd); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x504319a2Ee9F0e50Fd11893BD9aC900D1d57dCdA); +address constant DEPLOYED_ADDRESS = address(0x69F73b83A43C7432A7e4fBa1332149830a808aAF); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612da7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373cf305dd5de53b94dfbf55d560a51f602d98023701461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673cf305dd5de53b94dfbf55d560a51f602d9802370146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612da7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33738b501ada8bf1a4c132bdd023eccb481df0a0c7221461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038516738b501ada8bf1a4c132bdd023eccb481df0a0c722146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373cf305dd5de53b94dfbf55d560a51f602d98023701461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673cf305dd5de53b94dfbf55d560a51f602d9802370146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33738b501ada8bf1a4c132bdd023eccb481df0a0c7221461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038516738b501ada8bf1a4c132bdd023eccb481df0a0c722146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000059a0000000000000000000000000cf305dd5de53b94dfbf55d560a51f602d9802370000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000058f96080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b92610157612ad8565b612261565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b9190610278612ad8565b60405192610285846119d4565b5f84523691611dfb565b90612fb7565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612245565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b30614169565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f929192612ad8565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6140ff565b614154565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b60608201526064840135608082015261057181612b1a565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550612b4b565b8190838080808080610587565b6106486104af848b612121565b61065181614ef0565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c0906004353603011261018257610764612ad8565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184612bc6565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613500565b6109de81612b1a565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613572565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af160608201516044600435013590612be9565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151612bc6565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613bd9565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145a9565b90614764565b9d8e9260408d0151613ca4565b60408c0152613cce565b99613cce565b98610c5a8484613cf8565b610c648482613d56565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c0152613e68565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145a9565b60408a0151610dd98183613bd9565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613ca4565b610e129085613c00565b610dfb565b905091610de1565b50610e2d6060820151613bb6565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613bd9565b61101b5750508490610ed7856001600160a01b0360208701511633613497565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f169293511633612c10565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614041565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151612bc6565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f612ad8565b61111a848633612b92565b61112383612bc6565b15611268576111338486336131ca565b61113d8185613bd9565b15611262575082935b61115285828833613439565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613497565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612229565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761135195602092169361131386858761335a565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a457611399935030916133d3565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b604435916131ca565b604051908152f35b3461018257611436366118b0565b83949392611442612ad8565b61144d848633612b92565b61145681612bc6565b1561155c578061146a6114b9928733612c10565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612cb6565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612229565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e612ad8565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b612b1a565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1612b4b565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121806116376121798380611f4f565b3690611b81565b5f525f602052600160405f20540361222057806121a08161220c93611f4f565b6122046121bf6121c46020850135938460408701359384923690611b81565b613500565b6121dc6121d18580611f4f565b946060810190611ead565b92906121fc604051966121ee886119d4565b5f88525f3681373690611b81565b933691611c14565b92339261381e565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60c08110612237575050565b60608282015260200161222b565b5f5b82811061225357505050565b606082820152602001612247565b91926001600160a01b038351166001600160a01b0383511614612ac6576001600160a01b03612297606085015160643590612007565b5151166001600160a01b036122b3604085015160843590612007565b51511614801590612a86575b610e32576001600160a01b036122dc604085015160443590612007565b5151166001600160a01b036122f76064356060870151612007565b51511614612a745761230883612b1a565b805f525f60205260405f205415612a25575061232382612b1a565b805f525f60205260405f2054156129d5575061269392937f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061238761237961012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16126006001600160a01b0384511692604051936123d7856119d4565b5f85526123e2613535565b50604051906123f0826119b8565b6006825261240060208301612229565b61240989612b1a565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261243c82611faa565b5261244681611faa565b5060405161245381611950565b60028152604036602083013761246882611fb7565b5261247281611fb7565b506125466124996001600160a01b0361249160443560408d0151612007565b51511661454d565b6124df6001600160a01b038b51168b60206124d66001600160a01b036124c56044356040860151612007565b515116926040604435910151612007565b510151916131ca565b908a60ff60206125116001600160a01b036125006044356040870151612007565b515116936040604435910151612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61254f82611fc7565b5261255981611fc7565b506125e76125786001600160a01b0361249160643560608d0151612007565b6125b56001600160a01b038b51168b60206124d66001600160a01b036125a46064356060860151612007565b515116926060606435910151612007565b908a60ff60206125116001600160a01b036125d66064356060870151612007565b515116936060606435910151612007565b6125f082611fd7565b526125fa81611fd7565b5061431b565b915f6001600160a01b038751169160208801908151906001600160a01b0360208184511693015116928585523060205260408086209151015160405191612646836119d4565b86835260405195612656876119b8565b86526020860152604085015284606085015287608085015260a084015260c0830152604051808099819463d04dfe2360e01b835260048301612ebe565b03915afa94855f915f976129af575b506126b2576040513d5f823e3d90fd5b94908551600281106129975750906127859291604060208801519701516126e16126db87611fe7565b51611fd7565b516126ec8183613bd9565b1561298f5750945b6127168887919060405192600284526020840152604083015260608201604052565b61271f82611fc7565b5261272981611fc7565b5060405195612737876119b8565b8987526064356020880152604087015260608601978852608086015260a085015260c08401526001600160a01b038651169060405191612776836119d4565b5f835260a4356084358761381e565b9390506127956040830151612bc6565b15908115612979575b8115612968575b508015612955575b61294357604051916127be83611988565b5f83525f60208401525f60408401525f60608401526127dd8483614f14565b845260408401526128036127f18386614f14565b60208601528060608601528451613ca4565b946128176020850151604086015190613ca4565b9361282187613bb6565b8015612934575b612922576128e961291b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128cb6129209a60a09661286a8a8851613cf8565b6128788c6020890151613cf8565b6128868a6040890151613d56565b6128948c6060890151613d56565b61289d8a614041565b6128a68c614041565b6001600160a01b036128c260c435926060606435910151612007565b51511633612cb6565b50506001600160a01b036128c260e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e68565b613e68565b565b604051630d86822160e01b8152600490fd5b5061293e85613bb6565b612828565b6040516321badf1f60e01b8152600490fd5b506129636060840151613bb6565b6127ad565b612973915051613bb6565b5f6127a5565b90506129886040850151612bc6565b159061279e565b9050946126f4565b60249060405190630fbb8e5560e21b82526004820152fd5b9096506129ce91503d805f833e6129c681836119f0565b810190612d7a565b955f6126a2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9251604080513381526001600160a01b039092166020830152810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3925081905060608101612a20565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612aa0606084015160a43590612007565b5151166001600160a01b03612abc604086015160443590612007565b51511614156122bf565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b085760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b4581612b37602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b6129209291612b7661028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611dfb565b909115612b9d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612be5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1290565b90612be5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b929192612c1c8261423c565b93612c2681613bb6565b612ca45784816001600160e01b03612c459360e01d9116601b0b615077565b9290809315612c7b575b50829081612c5f575b5050509190565b612c73926001600160a01b033092166133d3565b5f8181612c58565b9092505f198114612c9057600101915f612c4f565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612cc383613bb6565b612d615784612cdf57612cd7939450613497565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613cce565b95612d2687613bb6565b612d49575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612db582611ad4565b91612dc360405193846119f0565b808352848084019160051b830101918683116101825785809101915b838310612e525750505050948281015191821161018257019180601f84011215610182578251612e0e81611ad4565b93612e1c60405195866119f0565b818552838086019260051b820101928311610182578301905b828210612e43575050505090565b81518152908301908301612e35565b8251815291810191869101612ddf565b90808251908181526020809101926020808460051b8301019501935f915b848310612e905750505050505090565b9091929394958480612eae600193601f198682030187528a516120ee565b9801930193019194939290612e80565b91906020928381526001600160a01b0382511684820152838201516040820152612ef8604083015160e060608401526101008301906118fc565b9060608301516080820152612f1f608084015192601f1993848483030160a0850152612e62565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f6257505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101612f3e565b90604082019082526020606081936040838201528551809452019301915f5b828110612fa3575050505090565b835185529381019392810192600101612f95565b919091604092835192612fc9846119b8565b60068452602094612fdb868601612229565b5f5b84518110156130105780612ff360019287612007565b51612ffe8289612007565b526130098188612007565b5001612fdd565b50925092939093335f52308252825f209183519561302d8761196c565b613035611ee3565b87526060828198015284519061304a826119d4565b5f8252855190613059826119d4565b5f82525f3681375f5b81518110156131be578986886130788486612007565b51888151948d8087015190815161309a575b5050505050505050600101613062565b905f92916001600160a01b03966130bf8887818d51169c01511699878901519061431b565b958251996130cc8b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180613107600498898301612ebe565b03915afa9384156131b4579089915f95613196575b508451613132575b50899250808e8c938e61308a565b5101511691823b1561018257613160925f92838d5180968195829463012c676d60e21b845233908401612f76565b03925af1801561318c57906001929161317d575b81928782613124565b613186906119a4565b5f613174565b89513d5f823e3d90fd5b6131ab9195503d805f833e6129c681836119f0565b9050935f61311c565b8c513d5f823e3d90fd5b50505050505050509050565b82156131ff576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061320b8261454d565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715613321575f9761332b575b508361326261325b836132929a61522c565b50906149b7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715613321575f976132f0575b5061325b6132b691611a739861522c565b506132c18183613bd9565b156132e85750935b5f5260018252825f20905f528152815f20905f8052525f205490613cce565b9050936132c9565b96508387813d831161331a575b61330781836119f0565b810103126101825795519561325b6132a5565b503d6132fd565b85513d5f823e3d90fd5b96508387813d8311613353575b61334281836119f0565b810103126101825795519583613249565b503d613338565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f51148116156133b4575b836040521561339e57505050565b635274afe760e01b835216600482015260249150fd5b60018115166133ca57813b15153d151616613390565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613423575b836040525f6060521561339e57505050565b60018115166133ca57813b15153d151616613411565b9392919361344683613bb6565b612d61578461345a57612cd7939450612c10565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613ca4565b909291926134a48161423c565b936134ae81613bb6565b6134ee5784816001600160e01b036134cd9360e01d9116601b0b615077565b508092816134dc575050509190565b6001600160a01b03612c73931661335a565b604051632d1671a360e11b8152600490fd5b9161352b906060613520936001600160a01b039485916040880151612007565b515116940151612007565b51511614612a7457565b60405190613542826119b8565b606060c08361354f611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613581613535565b505f9260406136a6815192613595846119b8565b600684526020936135a7858201612229565b61366f6135b38b612b1a565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135ea86611faa565b526135f485611faa565b50875161360081611950565b6002815288368b83013761361386611fb7565b5261361d85611fb7565b5060ff896125118a8501936136598761363b81612491858a51612007565b9751168861364a848951612007565b515116856124d6858a51612007565b96613665828751612007565b5151169451612007565b61367882611fc7565b5261368281611fc7565b506125e7878b8d60ff896125118c8501936136598761363b81612491858a51612007565b946137265f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136de836119d4565b8683528951956136ed876119b8565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612ebe565b03915afa90815f915f93613800575b506137f3575050505f975b6002855110988915996137e0578284870151960151906137626126db89611fe7565b519061376e8284613bd9565b1590506137d85750925b61379a8685919060405192600284526020840152604083015260608201604052565b6137a388611fc7565b526137ad87611fc7565b5082519b6137ba8d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613778565b5050505050505050509150611a73613535565b9199985094509396613740565b90925061381791503d805f833e6129c681836119f0565b915f613735565b9495939592919261382d613535565b5060409687519061383d826119b8565b6006825260209361384f858401612229565b61385889612b1a565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261388a84611faa565b5261389483611faa565b5089516138a081611950565b600281528a36878301376138b384611fb7565b526138bd83611fb7565b508989019086818351906138d091612007565b5151166138dc9061454d565b86888c511689848651906138ef91612007565b515116828587519061390091612007565b5101519061390d926131ca565b92898186519061391c91612007565b51511694519061392b91612007565b5101519060ff16613963929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61396c83611fc7565b5261397682611fc7565b5060608801858782519061398991612007565b5151166139959061454d565b868a511687898451906139a791612007565b515116878a8551906139b891612007565b510151906139c5926131ca565b90868989818651906139d691612007565b5151169451906139e591612007565b5101519060ff16613a1d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a2683611fd7565b52613a3082611fd7565b50613a3a9161431b565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a6b836119d4565b5f83528c5196613a7a886119b8565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613ab99060048301612ebe565b03815a935f94fa91825f915f94613b98575b50613ada5788513d5f823e3d90fd5b97949596979194825196600288109788613b8157508183850151940151613b036126db87611fe7565b51613b0e8183613bd9565b15613b795750925b613b388585919060405192600284526020840152604083015260608201604052565b613b4187611fc7565b52613b4b86611fc7565b5082519a613b588c6119b8565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613b16565b602490835190630fbb8e5560e21b82526004820152fd5b909350613baf91503d805f833e6129c681836119f0565b925f613acb565b613bd5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1390565b90613bd5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b613c276001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461476e565b90637ffffff58213613c77575b90613c3e916149b7565b9290921580613c6f575b613c5157505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c48565b613c818282615657565b15613c3457604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614bbd565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d81565b613d52916080810182613d14613d0e8351611fe7565b51611fe7565b52613d4b613d456001600160a01b03809451511693613d3c613d368551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613439565b5050565b90608081019180613d6a613d0e8551611fd7565b526001600160a01b03809251511691613d86613d368551611fd7565b5116613d95613d458551611fd7565b519081613e3057613da583613bb6565b612d61579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a20955f5260209060018252613dfb604094855f20835f528452855f20855f528452855f2054613cce565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e62565b91613e61917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a2095612cb6565b5050613e15565b60c0810151908151915f92613fdc575b50613f1d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613ec5836119d4565b8683528c5193613ed4856119d4565b8785528d5196613ee3886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ebe565b03915afa948515613fd2578795613fb4575b508451613f40575b50505050505050565b81905101510151169051813b15613fb057918491849383613f75965180978195829463012c676d60e21b845260048401612f76565b03925af1908115613fa75750613f90575b8080808080613f37565b613f9a82916119a4565b613fa45780613f86565b80fd5b513d84823e3d90fd5b8480fd5b613fc99195503d8089833e6129c681836119f0565b9050935f613f2f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761401f925f928360405180968195829463012c676d60e21b845260048401612f76565b03925af1801561022c5715613e78576140399192506119a4565b5f905f613e78565b60808101614052613d458251611fd7565b5191821561405f57505050565b614079613d366001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166140b4575b505050505050565b6140d8955f9284845260018152828420868552815282842091845252812055613497565b5f8080806140ac565b81156140eb570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614147576020810151908051603f198101908111612c905760051c82116141335760016020920160051b010190565b5050604051614141816119d4565b5f815290565b50604051614141816119d4565b80511561416457602001515f1a90565b505f90565b905f8091602081519101845af480806141e7575b1561419d5750506040513d81523d5f602083013e60203d82010160405290565b156141c457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141d5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061417d5750813b151561417d565b6004111561420457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614238836141fa565b0152565b614244615745565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614312575f925f946142dd575b5061429a836141fa565b6001831415806142cb575b6142af5750505090565b5163ee07877f60e01b81529182916106df919060048401614218565b506142d5836141fa565b8215156142a5565b908094506143019293503d851161430b575b6142f981836119f0565b81019061504d565b919091925f614290565b503d6142ef565b513d5f823e3d90fd5b9080519161432883611ad4565b9161434360409461433b865195866119f0565b808552611ad4565b601f1994602091860136868401378351835190959080156145425760016143999101965b600197889101019761439061437b8a611ad4565b9961438886519b8c6119f0565b808b52611ad4565b01848901612245565b85805f96845160028152338782015230868201526060810186526143bc8b611faa565b526143c68a611faa565b505f925b6144fe575b50505083516143e2575b50505050505090565b858095989796929801816143f68289612007565b526144018188612007565b505f925b614414575b50859697506143d9565b84518310156144f9576001600160a01b0361448b816144338689612007565b51511686614441878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614482888b612007565b510151916151a3565b156144e157868098999a9281926144a2878a612007565b5151166144af8787612007565b520193856144bd8289612007565b5101516144ca868c612007565b526144d5858b612007565b50019290989796614405565b8951630a57f30960e31b815260048101859052602490fd5b61440a565b90919681518810156145395782809101976145198184612007565b516145248a8d612007565b5261452f898c612007565b50019190816143ca565b968291506143cf565b506143995f96614367565b614555615745565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614312575f925f946142dd575061429a836141fa565b9091939284158215175f146145c35750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146fa575b50506145e68161531c565b936145f08161531c565b946145fb868261533c565b909182156146eb575f9083986f0785ee10d5da46d900f436a0000000008086116146dd575b50670de0b6b3a7640000808b116146ce575b50633b9aca00808b116146bf575b50612710808b116146b1575b5098805b6146a0575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c17029161534f565b60019290920191600a900480614650565b60049a04998a93019261464c565b600991939a049901915f614640565b601291939a049901915f614632565b85049950602592505f614620565b509290506118f894955061534f565b5f82121561474e57808413614740575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145db579092506118f893949161525a565b9092506118f89394916152c1565b8084121561470a579092506118f893949161525a565b613c3e82826149b7565b92909180614794576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147a957505050505f905f90565b6147c2936147b691615409565b92919490938492615409565b90939192846147d08861531c565b916147da8661531c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614981575b030191600160ff1b98838a018112155f1461494e575050035b5f955f821280614945575b614927575b5f811280614915575b6148f75786820103966001600160ff1b03881490816148ed575b50806148e4575b806148db575b6148bd57509061487192916155b5565b915f8113614884575b506118f89361534f565b9091604c82136148b25761489b91600a0a906140e1565b9081156148a8575f61487a565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614861565b5082841461485b565b905088145f614854565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361483a565b955080870186131561493f5786818703015b95614831565b5f614939565b505f811361482c565b89985090920390506001600160ff1b03819003870182136149725701860194614821565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614808565b81156140eb570590565b8082601b82810b8314614bac577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b58575b8380820b03614b4757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614af8575b838060030b03614a7c575b808413614a605750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140eb576001600160e01b0391071592614a57565b92915f841315614acc575090614a928383615657565b614aae57637ffffffe1901600a0a810290637fffffff92614a42565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148b257614aeb91600a0a906149ad565b9182156148a85792614a42565b5f198401808060030b14614b0c5750614a37565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149ea565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b99576305f5e100600894058094819201955b9150506149ea565b620186a060059405809481920195614b91565b5082614a3757505050505f90600190565b919291600160ff1b8401614bd5576118f89350615670565b906118f8935f0391614d81565b919291600160ff1b9190801580614d6f575090614bfe91615409565b9490929091905f868585858282138015614d66575b614d49575b505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614d14575b505081019182821860ff1c1115614d0c57826001600160ff1b0314614cee57905f600192135f14614cbf57600a9004915b01925b81158117614c8357509190565b80614c9c575b508015614c94579190565b505f91508190565b9192614cb29203600160ff1b01600a0a906149ad565b600160ff1b91905f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c73565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c76565b8107614d21575b80614c42565b60ff1d600117015f614d1b565b505050919350614d3c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c18565b50835f12614c13565b15614d7a5750509190565b9350919050565b9392919384158115818117614ed257505090614d9c91615409565b9194908295614dad82958294615409565b8096929491969387868482138015614ec9575b614eb0575b5050505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614e96575b505081019182821860ff1c1115614e8e57826001600160ff1b0314614cee57905f600192135f14614e5f57600a9004915b01925b81158117614e3257509190565b80614e4257508015614c94579190565b600160ff1b93614e599291038401600a0a906149ad565b5f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e22565b509092614e25565b8107614ea3575b80614df1565b60ff1d600117015f614e9d565b929b5098509196509450925090505f8080808080614dc5565b50858412614dc0565b9395939092919015614ee8575050614c94579190565b945092915050565b6008815110614164576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f4e610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b94519301614f5d815186612be9565b614f65575050565b909350611a7391925051925183613c00565b92915f9060018184145f87128715171717614ff1575f92808213614fe3575b03604c81135f821217614fd757600a0a9084614fb583820293846149ad565b14614fca57505015614fc6575f9190565b5f90565b9093509015611a73579190565b505015614fc6575f9190565b5f9560019450925090614f96565b5050505f90565b93929190918083145f83125f87121883158715171717615047575f9280821361503a5703604c81135f821217614fd757600a0a9084614fb583820293846149ad565b9194600193509190614f96565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561509f576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836150b157505090505f90600190565b60ff8116820191808312615179575f8312156150e9575050604c198112614c94575f03600a0a916150e283826140e1565b9283021490565b909293915f81135f1461516f57604d811361514457600a0a9283156140eb57835f1904831161511b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151de576151b591926157ae565b506151bf816141fa565b1591826151cb57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b909392915f61526a9181846145a9565b9490945f84830191820194121590816152b7575b81156152ad575b5061528f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615285565b828112915061527e565b6152d693600160fe1b908101939201906145a9565b9081815f82121561530d575050604b198212612cd7576152fb915f03600a0a906149ad565b9081615305575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615335575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153e4576001600160ff1b0392838311156153ce57600160ff1b9383850361538457505050509190565b9091929350851461539e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c90575f039190565b90916001600160ff1b0380841115612c5857851461539e575050600a60019104920190565b91909180156155ab57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156154b9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8301106154aa575b83136154945791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615488565b6f4b3b4ca85a86c47a098a22400000000080840515615599575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615582575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000083051561556e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561555e5782051561554f575b5f61543d565b9290600a02905f190192615549565b939160640291600119019361551a565b93916402540be4000291600919019361551a565b9391678ac7230489e80000029160121901936154f5565b6025198301955092909202915f6154d3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615633571461562b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561566b575f036157e8565b6157e8565b909291600160ff1b9182810161570257508084146156f8578084139182156156f0578185035b604c8111156156df5750505f915b156156d057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140eb5704916156a4565b848203615696565b505090505f905f90565b9361570f92945f03614be2565b80939180928114615723575b50505f039190565b915092506001600160ff1b038314614cee57600a600191059201915f8061571b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615783575b61576b5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615764565b81519190604183036157de576157d79250602082015190606060408401519301515f1a90615877565b9192909190565b50505f9160029190565b90637ffffff581131561587157637ffffffe198101906043821361586a575f82121561583e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140eb577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158ee579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158e457905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000008b501ada8bf1a4c132bdd023eccb481df0a0c72200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005aeb6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b9261015761308d565b612551565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b919061027861308d565b60405192610285846119d4565b5f84523691611dfb565b90613581565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612535565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b3061435b565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f92919261308d565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6142f1565b614346565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b606082015260648401356080820152610571816130cf565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550613100565b8190838080808080610587565b6106486104af848b612121565b610651816150e2565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461308d565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184613190565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613aca565b6109de816130cf565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613b3c565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af1606082015160446004350135906131b3565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151613190565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613dcb565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b61479b565b90614956565b9d8e9260408d0151613e96565b60408c0152613ec0565b99613ec0565b98610c5a8484613eea565b610c648482613f48565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c015261405a565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b61479b565b60408a0151610dd98183613dcb565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613e96565b610e129085613df2565b610dfb565b905091610de1565b50610e2d6060820151613da8565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613dcb565b61101b5750508490610ed7856001600160a01b0360208701511633613a61565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f1692935116336131da565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614233565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151613190565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f61308d565b61111a84863361315c565b61112383613190565b1561126857611133848633613794565b61113d8185613dcb565b15611262575082935b61115285828833613a03565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613a61565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612519565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff91606435838111610182573660238201121561018257806004013593841161018257366024858301011161018257611351956020921693611313868587613924565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a4576113999350309161399d565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b60443591613794565b604051908152f35b3461018257611436366118b0565b8394939261144261308d565b61144d84863361315c565b61145681613190565b1561155c578061146a6114b99287336131da565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613280565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612519565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e61308d565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b6130cf565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1613100565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b9061218161163761217a8480611f4f565b3690611b81565b5f5260205f81526040926001845f20540361250e57916124039161220885855f6123886121b1836121c89a611f4f565b6121cd878501359182878701359c8d923690611b81565b613aca565b6121e56121da8580611f4f565b946060810190611ead565b96906122008751966121f6886119d4565b8688523690611b81565b973691611c14565b90612211613aff565b50612338865191612221836119b8565b600683526122308a8401612519565b8861223a816130cf565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261226d86611faa565b5261227785611faa565b50805161228381611950565b6002815281368e83013761229686611fb7565b526122a085611fb7565b50810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b51511661473f565b975116906122d4898851612007565b515116846122e38a8951612007565b51015191613794565b958d6122f9828751612007565b5151169451612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61234182611fc7565b5261234b81611fc7565b5061236f8b886060810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b61237882611fd7565b5261238281611fd7565b5061450d565b918385511693868601918b83519289818551169401511693878652308a528180872091510151908251926123bb846119d4565b87845251956123c9876119b8565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301613488565b03915afa95865f915f986124e8575b506124215788513d5f823e3d90fd5b95938651600281106124d15750888798998260c0979899015199015161244f61244985611fe7565b51611fd7565b5161245a8183613dcb565b156124c75750998a925b6124868b85919060405192600284526020840152604083015260608201604052565b61248f86611fc7565b5261249985611fc7565b508251966124a6886119b8565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612464565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061250791503d805f833e6124ff81836119f0565b810190613344565b965f612412565b505f92508291829150565b5f5b60c08110612527575050565b60608282015260200161251b565b5f5b82811061254357505050565b606082820152602001612537565b926001600160a01b038451166001600160a01b038351161461307b576001600160a01b03612586606086015160643590612007565b5151166001600160a01b036125a2604085015160843590612007565b5151161480159061303b575b610e32576001600160a01b036125cb604086015160443590612007565b5151166001600160a01b036125e66064356060880151612007565b51511614613029576125f7846130cf565b805f525f60205260405f205415612fd95750612612826130cf565b805f525f60205260405f205415612f895750612928907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061267561266761012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16128956001600160a01b0384511691604051926126c5846119d4565b5f84526126d0613aff565b50604051906126de826119b8565b600682526126ee60208301612519565b6126f7896130cf565b906001600160a01b038a5116604051926004845260208401526040830152606082015233608082015260a0810160405261273082611faa565b5261273a81611faa565b5060405161274781611950565b60028152604036602083013761275c82611fb7565b5261276681611fb7565b506127f46127856001600160a01b036122bd60443560408d0151612007565b6127c26001600160a01b038b51168b60206122e36001600160a01b036127b16044356040860151612007565b515116926040604435910151612007565b908a60ff60206123036001600160a01b036127e36044356040870151612007565b515116936040604435910151612007565b6127fd82611fc7565b5261280781611fc7565b5061236f6128266001600160a01b036122bd60643560608d0151612007565b6128636001600160a01b038b51168b60206122e36001600160a01b036128526064356060860151612007565b515116926060606435910151612007565b908a60ff60206123036001600160a01b036128846064356060870151612007565b515116936060606435910151612007565b905f6001600160a01b038751169160208801908151906001600160a01b03602081845116930151169285855230602052604080862091510151604051916128db836119d4565b868352604051956128eb876119b8565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b835260048301613488565b03915afa92835f915f95612f6b575b50612947576040513d5f823e3d90fd5b9291835160028110612f2d57506040602085015194015161296a61244983611fe7565b516129758183613dcb565b15612f635750935b61299f8186919060405192600284526020840152604083015260608201604052565b6129a883611fc7565b526129b282611fc7565b50604051946129c0866119b8565b888652606435602087015260408601526060850152608084015260a083015260c0820152612bc86001600160a01b038551169360405194612a00866119d4565b5f8652612a0b613aff565b5060405190612a19826119b8565b60068252612a2960208301612519565b612a32866130cf565b906001600160a01b03875116604051926004845260208401526040830152606082015233608082015260a08101604052612a6b82611faa565b52612a7581611faa565b50604051612a8281611950565b600281526040366020830137612a9782611fb7565b52612aa181611fb7565b50612b2b612ac06001600160a01b036122bd60843560408a0151612007565b612afb6001600160a01b038851166001600160a01b03612ae660843560408c0151612007565b51511660206122e360843560408d0151612007565b906001600160a01b03612b1460843560408b0151612007565b51511660ff602061230360843560408d0151612007565b612b3482611fc7565b52612b3e81611fc7565b5061236f612b5d6001600160a01b036122bd60a43560608a0151612007565b612b986001600160a01b038851166001600160a01b03612b8360a43560608c0151612007565b51511660206122e360a43560608d0151612007565b906001600160a01b03612bb160a43560608b0151612007565b51511660ff602061230360a43560608d0151612007565b92612c5e5f6001600160a01b038551169260208601908151906001600160a01b0360208184511693015116928685523060205260408086209151015160405191612c11836119d4565b86835260405195612c21876119b8565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93612f45575b50612c7d576040513d5f823e3d90fd5b90815160028110612f2d575060406020830151920151612c9f61244988611fe7565b51612caa8183613dcb565b15612f255750925b612cd48385919060405192600284526020840152604083015260608201604052565b612cdd88611fc7565b52612ce787611fc7565b5060405196612cf5886119b8565b86885260a43560208901526040880194855260608801938452608088015260a087015260c0860152612d2a6040840151613190565b15918215612f11575b508115612efc575b8115612eeb575b50612ed95760405191612d5483611988565b5f83525f60208401525f60408401525f6060840152612d738483615106565b84526040840152612d99612d878386615106565b60208601528060608601528451613e96565b94612dad6020850151604086015190613e96565b93612db787613da8565b8015612eca575b612eb857612e7f612eb1957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d94612e61612eb69a60a096612e008a8851613eea565b612e0e8c6020890151613eea565b612e1c8a6040890151613f48565b612e2a8c6060890151613f48565b612e338a614233565b612e3c8c614233565b6001600160a01b03612e5860c435926060606435910151612007565b51511633613280565b50506001600160a01b03612e5860e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161405a565b61405a565b565b604051630d86822160e01b8152600490fd5b50612ed485613da8565b612dbe565b6040516321badf1f60e01b8152600490fd5b612ef6915051613da8565b5f612d42565b9050612f0b6060830151613da8565b90612d3b565b612f1d91925051613190565b15905f612d33565b905092612cb2565b60249060405190630fbb8e5560e21b82526004820152fd5b909250612f5c91503d805f833e6124ff81836119f0565b915f612c6d565b90509361297d565b909450612f8291503d805f833e6124ff81836119f0565b935f612937565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612fd4565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03613055606084015160a43590612007565b5151166001600160a01b03613071604087015160443590612007565b51511614156125ae565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146130bd5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516130fa816130ec602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b612eb6929161312b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193613139856119b8565b6006855261314960208601612519565b61315285611faa565b5261124d84611faa565b909115613167575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6131af905f60e01d906001600160e01b038160e01d9116601b0b615169565b1290565b906131af916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b9291926131e68261442e565b936131f081613da8565b61326e5784816001600160e01b0361320f9360e01d9116601b0b615269565b9290809315613245575b50829081613229575b5050509190565b61323d926001600160a01b0330921661399d565b5f8181613222565b9092505f19811461325a57600101915f613219565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361328d83613da8565b61332b57846132a9576132a1939450613a61565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613ec0565b956132f087613da8565b613313575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261337f82611ad4565b9161338d60405193846119f0565b808352848084019160051b830101918683116101825785809101915b83831061341c5750505050948281015191821161018257019180601f840112156101825782516133d881611ad4565b936133e660405195866119f0565b818552838086019260051b820101928311610182578301905b82821061340d575050505090565b815181529083019083016133ff565b82518152918101918691016133a9565b90808251908181526020809101926020808460051b8301019501935f915b84831061345a5750505050505090565b9091929394958480613478600193601f198682030187528a516120ee565b980193019301919493929061344a565b91906020928381526001600160a01b03825116848201528382015160408201526134c2604083015160e060608401526101008301906118fc565b90606083015160808201526134e9608084015192601f1993848483030160a085015261342c565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061352c57505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101613508565b90604082019082526020606081936040838201528551809452019301915f5b82811061356d575050505090565b83518552938101939281019260010161355f565b919091604092835192613593846119b8565b600684526020946135a5868601612519565b5f5b84518110156135da57806135bd60019287612007565b516135c88289612007565b526135d38188612007565b50016135a7565b50925092939093335f52308252825f20918351956135f78761196c565b6135ff611ee3565b875260608281980152845190613614826119d4565b5f8252855190613623826119d4565b5f82525f3681375f5b8151811015613788578986886136428486612007565b51888151948d80870151908151613664575b505050505050505060010161362c565b905f92916001600160a01b03966136898887818d51169c01511699878901519061450d565b958251996136968b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b825281806136d1600498898301613488565b03915afa93841561377e579089915f95613760575b5084516136fc575b50899250808e8c938e613654565b5101511691823b156101825761372a925f92838d5180968195829463012c676d60e21b845233908401613540565b03925af18015613756579060019291613747575b819287826136ee565b613750906119a4565b5f61373e565b89513d5f823e3d90fd5b6137759195503d805f833e6124ff81836119f0565b9050935f6136e6565b8c513d5f823e3d90fd5b50505050505050509050565b82156137c9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506137d58261473f565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156138eb575f976138f5575b508361382c6138258361385c9a61541e565b5090614ba9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156138eb575f976138ba575b5061382561388091611a739861541e565b5061388b8183613dcb565b156138b25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ec0565b905093613893565b96508387813d83116138e4575b6138d181836119f0565b810103126101825795519561382561386f565b503d6138c7565b85513d5f823e3d90fd5b96508387813d831161391d575b61390c81836119f0565b810103126101825795519583613813565b503d613902565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561397e575b836040521561396857505050565b635274afe760e01b835216600482015260249150fd5b600181151661399457813b15153d15161661395a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156139ed575b836040525f6060521561396857505050565b600181151661399457813b15153d1516166139db565b93929193613a1083613da8565b61332b5784613a24576132a19394506131da565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613e96565b90929192613a6e8161442e565b93613a7881613da8565b613ab85784816001600160e01b03613a979360e01d9116601b0b615269565b50809281613aa6575050509190565b6001600160a01b0361323d9316613924565b604051632d1671a360e11b8152600490fd5b91613af5906060613aea936001600160a01b039485916040880151612007565b515116940151612007565b5151161461302957565b60405190613b0c826119b8565b606060c083613b19611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613b4b613aff565b50604092613c39845191613b5e836119b8565b60068352602092613b70848201612519565b613c03613b7c8a6130cf565b966001600160a01b0397888c51168a519160038352888301528a820152886060981688820152608081018a52613bb184611faa565b52613bbb83611faa565b508851613bc781611950565b60028152893688830137613bda84611fb7565b52613be483611fb7565b508a89810160ff886123036122ec8d806122c5816122bd8b8a51612007565b613c0c82611fc7565b52613c1681611fc7565b5061236f8a8a87810160ff886123036122ec8d806122c5816122bd8b8a51612007565b93613cb95f8589511697859685879b0191825191878184511693015116928b85523088528680862091510151875191613c71836119d4565b868352885195613c80876119b8565b8652898601528785015284898501528a608085015260a084015260c08301528451808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93613d8a575b50613d7e575b5050600284511097881598613d6c578183860151950151613cf161244988611fe7565b51613cfc8183613dcb565b15613d645750925b613d268685919060405192600284526020840152604083015260608201604052565b613d2f88611fc7565b52613d3987611fc7565b5082519b613d468d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613d04565b50505050505050509150611a73613aff565b90975093505f80613cce565b909250613da191503d805f833e6124ff81836119f0565b915f613cc8565b613dc7905f60e01d906001600160e01b038160e01d9116601b0b615169565b1390565b90613dc7916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b613e196001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614960565b90637ffffff58213613e69575b90613e3091614ba9565b9290921580613e61575b613e4357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613e3a565b613e738282615849565b15613e2657604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614daf565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614f73565b613f44916080810182613f06613f008351611fe7565b51611fe7565b52613f3d613f376001600160a01b03809451511693613f2e613f288551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613a03565b5050565b90608081019180613f5c613f008551611fd7565b526001600160a01b03809251511691613f78613f288551611fd7565b5116613f87613f378551611fd7565b51908161402257613f9783613da8565b61332b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd4955f5260209060018252613fed604094855f20835f528452855f20855f528452855f2054613ec0565b945f5260018252835f20905f528152825f20915f52525f20555b5160405191829133835260406020840152604083019061342c565b91614053917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd495613280565b5050614007565b60c0810151908151915f926141ce575b5061410f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916140b7836119d4565b8683528c51936140c6856119d4565b8785528d51966140d5886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301613488565b03915afa9485156141c45787956141a6575b508451614132575b50505050505050565b81905101510151169051813b156141a257918491849383614167965180978195829463012c676d60e21b845260048401613540565b03925af19081156141995750614182575b8080808080614129565b61418c82916119a4565b6141965780614178565b80fd5b513d84823e3d90fd5b8480fd5b6141bb9195503d8089833e6124ff81836119f0565b9050935f614121565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257614211925f928360405180968195829463012c676d60e21b845260048401613540565b03925af1801561022c571561406a5761422b9192506119a4565b5f905f61406a565b60808101614244613f378251611fd7565b5191821561425157505050565b61426b613f286001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166142a6575b505050505050565b6142ca955f9284845260018152828420868552815282842091845252812055613a61565b5f80808061429e565b81156142dd570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614339576020810151908051603f19810190811161325a5760051c82116143255760016020920160051b010190565b5050604051614333816119d4565b5f815290565b50604051614333816119d4565b80511561435657602001515f1a90565b505f90565b905f8091602081519101845af480806143d9575b1561438f5750506040513d81523d5f602083013e60203d82010160405290565b156143b657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156143c7576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061436f5750813b151561436f565b600411156143f657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261442a836143ec565b0152565b614436615937565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614504575f925f946144cf575b5061448c836143ec565b6001831415806144bd575b6144a15750505090565b5163ee07877f60e01b81529182916106df91906004840161440a565b506144c7836143ec565b821515614497565b908094506144f39293503d85116144fd575b6144eb81836119f0565b81019061523f565b919091925f614482565b503d6144e1565b513d5f823e3d90fd5b9080519161451a83611ad4565b9161453560409461452d865195866119f0565b808552611ad4565b601f19946020918601368684013783518351909590801561473457600161458b9101965b600197889101019761458261456d8a611ad4565b9961457a86519b8c6119f0565b808b52611ad4565b01848901612535565b85805f96845160028152338782015230868201526060810186526145ae8b611faa565b526145b88a611faa565b505f925b6146f0575b50505083516145d4575b50505050505090565b858095989796929801816145e88289612007565b526145f38188612007565b505f925b614606575b50859697506145cb565b84518310156146eb576001600160a01b0361467d816146258689612007565b51511686614633878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614674888b612007565b51015191615395565b156146d357868098999a928192614694878a612007565b5151166146a18787612007565b520193856146af8289612007565b5101516146bc868c612007565b526146c7858b612007565b500192909897966145f7565b8951630a57f30960e31b815260048101859052602490fd5b6145fc565b909196815188101561472b57828091019761470b8184612007565b516147168a8d612007565b52614721898c612007565b50019190816145bc565b968291506145c1565b5061458b5f96614559565b614747615937565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614504575f925f946144cf575061448c836143ec565b9091939284158215175f146147b55750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6148ec575b50506147d88161550e565b936147e28161550e565b946147ed868261552e565b909182156148dd575f9083986f0785ee10d5da46d900f436a0000000008086116148cf575b50670de0b6b3a7640000808b116148c0575b50633b9aca00808b116148b1575b50612710808b116148a3575b5098805b614892575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615541565b60019290920191600a900480614842565b60049a04998a93019261483e565b600991939a049901915f614832565b601291939a049901915f614824565b85049950602592505f614812565b509290506118f8949550615541565b5f82121561494057808413614932575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156147cd579092506118f893949161544c565b9092506118f89394916154b3565b808412156148fc579092506118f893949161544c565b613e308282614ba9565b92909180614986576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461499b57505050505f905f90565b6149b4936149a8916155fb565b929194909384926155fb565b90939192846149c28861550e565b916149cc8661550e565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614b73575b030191600160ff1b98838a018112155f14614b40575050035b5f955f821280614b37575b614b19575b5f811280614b07575b614ae95786820103966001600160ff1b0388149081614adf575b5080614ad6575b80614acd575b614aaf575090614a6392916157a7565b915f8113614a76575b506118f893615541565b9091604c8213614aa457614a8d91600a0a906142d3565b908115614a9a575f614a6c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614a53565b50828414614a4d565b905088145f614a46565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614a2c565b9550808701861315614b315786818703015b95614a23565b5f614b2b565b505f8113614a1e565b89985090920390506001600160ff1b0381900387018213614b645701860194614a13565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506149fa565b81156142dd570590565b8082601b82810b8314614d9e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614d4a575b8380820b03614d3957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614cea575b838060030b03614c6e575b808413614c525750506001600160e01b036001925b60e01b91161791565b8303600a0a80156142dd576001600160e01b0391071592614c49565b92915f841315614cbe575090614c848383615849565b614ca057637ffffffe1901600a0a810290637fffffff92614c34565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614aa457614cdd91600a0a90614b9f565b918215614a9a5792614c34565b5f198401808060030b14614cfe5750614c29565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614bdc565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614d8b576305f5e100600894058094819201955b915050614bdc565b620186a060059405809481920195614d83565b5082614c2957505050505f90600190565b919291600160ff1b8401614dc7576118f89350615862565b906118f8935f0391614f73565b919291600160ff1b9190801580614f61575090614df0916155fb565b9490929091905f868585858282138015614f58575b614f3b575b505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084614f06575b505081019182821860ff1c1115614efe57826001600160ff1b0314614ee057905f600192135f14614eb157600a9004915b01925b81158117614e7557509190565b80614e8e575b508015614e86579190565b505f91508190565b9192614ea49203600160ff1b01600a0a90614b9f565b600160ff1b91905f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e65565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614e68565b8107614f13575b80614e34565b60ff1d600117015f614f0d565b505050919350614f2e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614e0a565b50835f12614e05565b15614f6c5750509190565b9350919050565b93929193841581158181176150c457505090614f8e916155fb565b9194908295614f9f829582946155fb565b80969294919693878684821380156150bb575b6150a2575b5050505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084615088575b505081019182821860ff1c111561508057826001600160ff1b0314614ee057905f600192135f1461505157600a9004915b01925b8115811761502457509190565b8061503457508015614e86579190565b600160ff1b9361504b9291038401600a0a90614b9f565b5f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615014565b509092615017565b8107615095575b80614fe3565b60ff1d600117015f61508f565b929b5098509196509450925090505f8080808080614fb7565b50858412614fb2565b93959390929190156150da575050614e86579190565b945092915050565b6008815110614356576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040615140610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61479b565b9451930161514f8151866131b3565b615157575050565b909350611a7391925051925183613df2565b92915f9060018184145f871287151717176151e3575f928082136151d5575b03604c81135f8212176151c957600a0a90846151a78382029384614b9f565b146151bc575050156151b8575f9190565b5f90565b9093509015611a73579190565b5050156151b8575f9190565b5f9560019450925090615188565b5050505f90565b93929190918083145f83125f87121883158715171717615239575f9280821361522c5703604c81135f8212176151c957600a0a90846151a78382029384614b9f565b9194600193509190615188565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615291576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836152a357505090505f90600190565b60ff811682019180831261536b575f8312156152db575050604c198112614e86575f03600a0a916152d483826142d3565b9283021490565b909293915f81135f1461536157604d811361533657600a0a9283156142dd57835f1904831161530d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6153d0576153a791926159a0565b506153b1816143ec565b1591826153bd57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461544457600a6001818404940192061590565b909190600190565b909392915f61545c91818461479b565b9490945f84830191820194121590816154a9575b811561549f575b5061548157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615477565b8281129150615470565b6154c893600160fe1b9081019392019061479b565b9081815f8212156154ff575050604b1982126132a1576154ed915f03600a0a90614b9f565b90816154f7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615527575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156155d6576001600160ff1b0392838311156155c057600160ff1b9383850361557657505050509190565b90919293508514615590575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461325a575f039190565b90916001600160ff1b0380841115613222578514615590575050600a60019104920190565b919091801561579d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156156ab575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061569c575b83136156865791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f19019261567a565b6f4b3b4ca85a86c47a098a2240000000008084051561578b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615774575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615760575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561575057820515615741575b5f61562f565b9290600a02905f19019261573b565b939160640291600119019361570c565b93916402540be4000291600919019361570c565b9391678ac7230489e80000029160121901936156e7565b6025198301955092909202915f6156c5565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615825571461581d579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561585d575f036159da565b6159da565b909291600160ff1b918281016158f457508084146158ea578084139182156158e2578185035b604c8111156158d15750505f915b156158c257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156142dd570491615896565b848203615888565b505090505f905f90565b9361590192945f03614dd4565b80939180928114615915575b50505f039190565b915092506001600160ff1b038314614ee057600a600191059201915f8061590d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615975575b61595d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615956565b81519190604183036159d0576159c99250602082015190606060408401519301515f1a90615a69565b9192909190565b50505f9160029190565b90637ffffff5811315615a6357637ffffffe1981019060438213615a5c575f821215615a3057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156142dd577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615ae0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b03811615615ad657905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index 2e38b0713b..80eb853c49 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x320175e477d28b54c64f11389694f592d65828a2d96e544f26163e0a045a6ba1); +bytes32 constant BYTECODE_HASH = bytes32(0xb839b0a415bfc23ab7b9494a5359ea449fdd2dbcb0b363c18d736e459cbda96a); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xCf305DD5DE53B94dfBF55d560A51F602D9802370); +address constant DEPLOYED_ADDRESS = address(0x8b501aDA8bf1a4c132bDd023ECCb481dF0a0C722); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556158f9908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b92610157612ad8565b612261565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b9190610278612ad8565b60405192610285846119d4565b5f84523691611dfb565b90612fb7565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612245565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b30614169565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f929192612ad8565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6140ff565b614154565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b60608201526064840135608082015261057181612b1a565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550612b4b565b8190838080808080610587565b6106486104af848b612121565b61065181614ef0565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c0906004353603011261018257610764612ad8565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184612bc6565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613500565b6109de81612b1a565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613572565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af160608201516044600435013590612be9565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151612bc6565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613bd9565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145a9565b90614764565b9d8e9260408d0151613ca4565b60408c0152613cce565b99613cce565b98610c5a8484613cf8565b610c648482613d56565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c0152613e68565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145a9565b60408a0151610dd98183613bd9565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613ca4565b610e129085613c00565b610dfb565b905091610de1565b50610e2d6060820151613bb6565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613bd9565b61101b5750508490610ed7856001600160a01b0360208701511633613497565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f169293511633612c10565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614041565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151612bc6565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f612ad8565b61111a848633612b92565b61112383612bc6565b15611268576111338486336131ca565b61113d8185613bd9565b15611262575082935b61115285828833613439565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613497565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612229565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761135195602092169361131386858761335a565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a457611399935030916133d3565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b604435916131ca565b604051908152f35b3461018257611436366118b0565b83949392611442612ad8565b61144d848633612b92565b61145681612bc6565b1561155c578061146a6114b9928733612c10565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612cb6565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612229565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e612ad8565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b612b1a565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1612b4b565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121806116376121798380611f4f565b3690611b81565b5f525f602052600160405f20540361222057806121a08161220c93611f4f565b6122046121bf6121c46020850135938460408701359384923690611b81565b613500565b6121dc6121d18580611f4f565b946060810190611ead565b92906121fc604051966121ee886119d4565b5f88525f3681373690611b81565b933691611c14565b92339261381e565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60c08110612237575050565b60608282015260200161222b565b5f5b82811061225357505050565b606082820152602001612247565b91926001600160a01b038351166001600160a01b0383511614612ac6576001600160a01b03612297606085015160643590612007565b5151166001600160a01b036122b3604085015160843590612007565b51511614801590612a86575b610e32576001600160a01b036122dc604085015160443590612007565b5151166001600160a01b036122f76064356060870151612007565b51511614612a745761230883612b1a565b805f525f60205260405f205415612a25575061232382612b1a565b805f525f60205260405f2054156129d5575061269392937f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061238761237961012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16126006001600160a01b0384511692604051936123d7856119d4565b5f85526123e2613535565b50604051906123f0826119b8565b6006825261240060208301612229565b61240989612b1a565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261243c82611faa565b5261244681611faa565b5060405161245381611950565b60028152604036602083013761246882611fb7565b5261247281611fb7565b506125466124996001600160a01b0361249160443560408d0151612007565b51511661454d565b6124df6001600160a01b038b51168b60206124d66001600160a01b036124c56044356040860151612007565b515116926040604435910151612007565b510151916131ca565b908a60ff60206125116001600160a01b036125006044356040870151612007565b515116936040604435910151612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61254f82611fc7565b5261255981611fc7565b506125e76125786001600160a01b0361249160643560608d0151612007565b6125b56001600160a01b038b51168b60206124d66001600160a01b036125a46064356060860151612007565b515116926060606435910151612007565b908a60ff60206125116001600160a01b036125d66064356060870151612007565b515116936060606435910151612007565b6125f082611fd7565b526125fa81611fd7565b5061431b565b915f6001600160a01b038751169160208801908151906001600160a01b0360208184511693015116928585523060205260408086209151015160405191612646836119d4565b86835260405195612656876119b8565b86526020860152604085015284606085015287608085015260a084015260c0830152604051808099819463d04dfe2360e01b835260048301612ebe565b03915afa94855f915f976129af575b506126b2576040513d5f823e3d90fd5b94908551600281106129975750906127859291604060208801519701516126e16126db87611fe7565b51611fd7565b516126ec8183613bd9565b1561298f5750945b6127168887919060405192600284526020840152604083015260608201604052565b61271f82611fc7565b5261272981611fc7565b5060405195612737876119b8565b8987526064356020880152604087015260608601978852608086015260a085015260c08401526001600160a01b038651169060405191612776836119d4565b5f835260a4356084358761381e565b9390506127956040830151612bc6565b15908115612979575b8115612968575b508015612955575b61294357604051916127be83611988565b5f83525f60208401525f60408401525f60608401526127dd8483614f14565b845260408401526128036127f18386614f14565b60208601528060608601528451613ca4565b946128176020850151604086015190613ca4565b9361282187613bb6565b8015612934575b612922576128e961291b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128cb6129209a60a09661286a8a8851613cf8565b6128788c6020890151613cf8565b6128868a6040890151613d56565b6128948c6060890151613d56565b61289d8a614041565b6128a68c614041565b6001600160a01b036128c260c435926060606435910151612007565b51511633612cb6565b50506001600160a01b036128c260e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e68565b613e68565b565b604051630d86822160e01b8152600490fd5b5061293e85613bb6565b612828565b6040516321badf1f60e01b8152600490fd5b506129636060840151613bb6565b6127ad565b612973915051613bb6565b5f6127a5565b90506129886040850151612bc6565b159061279e565b9050946126f4565b60249060405190630fbb8e5560e21b82526004820152fd5b9096506129ce91503d805f833e6129c681836119f0565b810190612d7a565b955f6126a2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9251604080513381526001600160a01b039092166020830152810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3925081905060608101612a20565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612aa0606084015160a43590612007565b5151166001600160a01b03612abc604086015160443590612007565b51511614156122bf565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b085760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b4581612b37602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b6129209291612b7661028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611dfb565b909115612b9d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612be5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1290565b90612be5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b929192612c1c8261423c565b93612c2681613bb6565b612ca45784816001600160e01b03612c459360e01d9116601b0b615077565b9290809315612c7b575b50829081612c5f575b5050509190565b612c73926001600160a01b033092166133d3565b5f8181612c58565b9092505f198114612c9057600101915f612c4f565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612cc383613bb6565b612d615784612cdf57612cd7939450613497565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613cce565b95612d2687613bb6565b612d49575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612db582611ad4565b91612dc360405193846119f0565b808352848084019160051b830101918683116101825785809101915b838310612e525750505050948281015191821161018257019180601f84011215610182578251612e0e81611ad4565b93612e1c60405195866119f0565b818552838086019260051b820101928311610182578301905b828210612e43575050505090565b81518152908301908301612e35565b8251815291810191869101612ddf565b90808251908181526020809101926020808460051b8301019501935f915b848310612e905750505050505090565b9091929394958480612eae600193601f198682030187528a516120ee565b9801930193019194939290612e80565b91906020928381526001600160a01b0382511684820152838201516040820152612ef8604083015160e060608401526101008301906118fc565b9060608301516080820152612f1f608084015192601f1993848483030160a0850152612e62565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f6257505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101612f3e565b90604082019082526020606081936040838201528551809452019301915f5b828110612fa3575050505090565b835185529381019392810192600101612f95565b919091604092835192612fc9846119b8565b60068452602094612fdb868601612229565b5f5b84518110156130105780612ff360019287612007565b51612ffe8289612007565b526130098188612007565b5001612fdd565b50925092939093335f52308252825f209183519561302d8761196c565b613035611ee3565b87526060828198015284519061304a826119d4565b5f8252855190613059826119d4565b5f82525f3681375f5b81518110156131be578986886130788486612007565b51888151948d8087015190815161309a575b5050505050505050600101613062565b905f92916001600160a01b03966130bf8887818d51169c01511699878901519061431b565b958251996130cc8b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180613107600498898301612ebe565b03915afa9384156131b4579089915f95613196575b508451613132575b50899250808e8c938e61308a565b5101511691823b1561018257613160925f92838d5180968195829463012c676d60e21b845233908401612f76565b03925af1801561318c57906001929161317d575b81928782613124565b613186906119a4565b5f613174565b89513d5f823e3d90fd5b6131ab9195503d805f833e6129c681836119f0565b9050935f61311c565b8c513d5f823e3d90fd5b50505050505050509050565b82156131ff576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061320b8261454d565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715613321575f9761332b575b508361326261325b836132929a61522c565b50906149b7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715613321575f976132f0575b5061325b6132b691611a739861522c565b506132c18183613bd9565b156132e85750935b5f5260018252825f20905f528152815f20905f8052525f205490613cce565b9050936132c9565b96508387813d831161331a575b61330781836119f0565b810103126101825795519561325b6132a5565b503d6132fd565b85513d5f823e3d90fd5b96508387813d8311613353575b61334281836119f0565b810103126101825795519583613249565b503d613338565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f51148116156133b4575b836040521561339e57505050565b635274afe760e01b835216600482015260249150fd5b60018115166133ca57813b15153d151616613390565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613423575b836040525f6060521561339e57505050565b60018115166133ca57813b15153d151616613411565b9392919361344683613bb6565b612d61578461345a57612cd7939450612c10565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613ca4565b909291926134a48161423c565b936134ae81613bb6565b6134ee5784816001600160e01b036134cd9360e01d9116601b0b615077565b508092816134dc575050509190565b6001600160a01b03612c73931661335a565b604051632d1671a360e11b8152600490fd5b9161352b906060613520936001600160a01b039485916040880151612007565b515116940151612007565b51511614612a7457565b60405190613542826119b8565b606060c08361354f611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613581613535565b505f9260406136a6815192613595846119b8565b600684526020936135a7858201612229565b61366f6135b38b612b1a565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135ea86611faa565b526135f485611faa565b50875161360081611950565b6002815288368b83013761361386611fb7565b5261361d85611fb7565b5060ff896125118a8501936136598761363b81612491858a51612007565b9751168861364a848951612007565b515116856124d6858a51612007565b96613665828751612007565b5151169451612007565b61367882611fc7565b5261368281611fc7565b506125e7878b8d60ff896125118c8501936136598761363b81612491858a51612007565b946137265f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136de836119d4565b8683528951956136ed876119b8565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612ebe565b03915afa90815f915f93613800575b506137f3575050505f975b6002855110988915996137e0578284870151960151906137626126db89611fe7565b519061376e8284613bd9565b1590506137d85750925b61379a8685919060405192600284526020840152604083015260608201604052565b6137a388611fc7565b526137ad87611fc7565b5082519b6137ba8d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613778565b5050505050505050509150611a73613535565b9199985094509396613740565b90925061381791503d805f833e6129c681836119f0565b915f613735565b9495939592919261382d613535565b5060409687519061383d826119b8565b6006825260209361384f858401612229565b61385889612b1a565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261388a84611faa565b5261389483611faa565b5089516138a081611950565b600281528a36878301376138b384611fb7565b526138bd83611fb7565b508989019086818351906138d091612007565b5151166138dc9061454d565b86888c511689848651906138ef91612007565b515116828587519061390091612007565b5101519061390d926131ca565b92898186519061391c91612007565b51511694519061392b91612007565b5101519060ff16613963929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61396c83611fc7565b5261397682611fc7565b5060608801858782519061398991612007565b5151166139959061454d565b868a511687898451906139a791612007565b515116878a8551906139b891612007565b510151906139c5926131ca565b90868989818651906139d691612007565b5151169451906139e591612007565b5101519060ff16613a1d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a2683611fd7565b52613a3082611fd7565b50613a3a9161431b565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a6b836119d4565b5f83528c5196613a7a886119b8565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613ab99060048301612ebe565b03815a935f94fa91825f915f94613b98575b50613ada5788513d5f823e3d90fd5b97949596979194825196600288109788613b8157508183850151940151613b036126db87611fe7565b51613b0e8183613bd9565b15613b795750925b613b388585919060405192600284526020840152604083015260608201604052565b613b4187611fc7565b52613b4b86611fc7565b5082519a613b588c6119b8565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613b16565b602490835190630fbb8e5560e21b82526004820152fd5b909350613baf91503d805f833e6129c681836119f0565b925f613acb565b613bd5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1390565b90613bd5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b613c276001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461476e565b90637ffffff58213613c77575b90613c3e916149b7565b9290921580613c6f575b613c5157505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c48565b613c818282615657565b15613c3457604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614bbd565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d81565b613d52916080810182613d14613d0e8351611fe7565b51611fe7565b52613d4b613d456001600160a01b03809451511693613d3c613d368551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613439565b5050565b90608081019180613d6a613d0e8551611fd7565b526001600160a01b03809251511691613d86613d368551611fd7565b5116613d95613d458551611fd7565b519081613e3057613da583613bb6565b612d61579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a20955f5260209060018252613dfb604094855f20835f528452855f20855f528452855f2054613cce565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e62565b91613e61917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a2095612cb6565b5050613e15565b60c0810151908151915f92613fdc575b50613f1d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613ec5836119d4565b8683528c5193613ed4856119d4565b8785528d5196613ee3886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ebe565b03915afa948515613fd2578795613fb4575b508451613f40575b50505050505050565b81905101510151169051813b15613fb057918491849383613f75965180978195829463012c676d60e21b845260048401612f76565b03925af1908115613fa75750613f90575b8080808080613f37565b613f9a82916119a4565b613fa45780613f86565b80fd5b513d84823e3d90fd5b8480fd5b613fc99195503d8089833e6129c681836119f0565b9050935f613f2f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761401f925f928360405180968195829463012c676d60e21b845260048401612f76565b03925af1801561022c5715613e78576140399192506119a4565b5f905f613e78565b60808101614052613d458251611fd7565b5191821561405f57505050565b614079613d366001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166140b4575b505050505050565b6140d8955f9284845260018152828420868552815282842091845252812055613497565b5f8080806140ac565b81156140eb570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614147576020810151908051603f198101908111612c905760051c82116141335760016020920160051b010190565b5050604051614141816119d4565b5f815290565b50604051614141816119d4565b80511561416457602001515f1a90565b505f90565b905f8091602081519101845af480806141e7575b1561419d5750506040513d81523d5f602083013e60203d82010160405290565b156141c457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141d5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061417d5750813b151561417d565b6004111561420457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614238836141fa565b0152565b614244615745565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614312575f925f946142dd575b5061429a836141fa565b6001831415806142cb575b6142af5750505090565b5163ee07877f60e01b81529182916106df919060048401614218565b506142d5836141fa565b8215156142a5565b908094506143019293503d851161430b575b6142f981836119f0565b81019061504d565b919091925f614290565b503d6142ef565b513d5f823e3d90fd5b9080519161432883611ad4565b9161434360409461433b865195866119f0565b808552611ad4565b601f1994602091860136868401378351835190959080156145425760016143999101965b600197889101019761439061437b8a611ad4565b9961438886519b8c6119f0565b808b52611ad4565b01848901612245565b85805f96845160028152338782015230868201526060810186526143bc8b611faa565b526143c68a611faa565b505f925b6144fe575b50505083516143e2575b50505050505090565b858095989796929801816143f68289612007565b526144018188612007565b505f925b614414575b50859697506143d9565b84518310156144f9576001600160a01b0361448b816144338689612007565b51511686614441878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614482888b612007565b510151916151a3565b156144e157868098999a9281926144a2878a612007565b5151166144af8787612007565b520193856144bd8289612007565b5101516144ca868c612007565b526144d5858b612007565b50019290989796614405565b8951630a57f30960e31b815260048101859052602490fd5b61440a565b90919681518810156145395782809101976145198184612007565b516145248a8d612007565b5261452f898c612007565b50019190816143ca565b968291506143cf565b506143995f96614367565b614555615745565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614312575f925f946142dd575061429a836141fa565b9091939284158215175f146145c35750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146fa575b50506145e68161531c565b936145f08161531c565b946145fb868261533c565b909182156146eb575f9083986f0785ee10d5da46d900f436a0000000008086116146dd575b50670de0b6b3a7640000808b116146ce575b50633b9aca00808b116146bf575b50612710808b116146b1575b5098805b6146a0575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c17029161534f565b60019290920191600a900480614650565b60049a04998a93019261464c565b600991939a049901915f614640565b601291939a049901915f614632565b85049950602592505f614620565b509290506118f894955061534f565b5f82121561474e57808413614740575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145db579092506118f893949161525a565b9092506118f89394916152c1565b8084121561470a579092506118f893949161525a565b613c3e82826149b7565b92909180614794576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147a957505050505f905f90565b6147c2936147b691615409565b92919490938492615409565b90939192846147d08861531c565b916147da8661531c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614981575b030191600160ff1b98838a018112155f1461494e575050035b5f955f821280614945575b614927575b5f811280614915575b6148f75786820103966001600160ff1b03881490816148ed575b50806148e4575b806148db575b6148bd57509061487192916155b5565b915f8113614884575b506118f89361534f565b9091604c82136148b25761489b91600a0a906140e1565b9081156148a8575f61487a565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614861565b5082841461485b565b905088145f614854565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361483a565b955080870186131561493f5786818703015b95614831565b5f614939565b505f811361482c565b89985090920390506001600160ff1b03819003870182136149725701860194614821565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614808565b81156140eb570590565b8082601b82810b8314614bac577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b58575b8380820b03614b4757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614af8575b838060030b03614a7c575b808413614a605750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140eb576001600160e01b0391071592614a57565b92915f841315614acc575090614a928383615657565b614aae57637ffffffe1901600a0a810290637fffffff92614a42565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148b257614aeb91600a0a906149ad565b9182156148a85792614a42565b5f198401808060030b14614b0c5750614a37565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149ea565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b99576305f5e100600894058094819201955b9150506149ea565b620186a060059405809481920195614b91565b5082614a3757505050505f90600190565b919291600160ff1b8401614bd5576118f89350615670565b906118f8935f0391614d81565b919291600160ff1b9190801580614d6f575090614bfe91615409565b9490929091905f868585858282138015614d66575b614d49575b505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614d14575b505081019182821860ff1c1115614d0c57826001600160ff1b0314614cee57905f600192135f14614cbf57600a9004915b01925b81158117614c8357509190565b80614c9c575b508015614c94579190565b505f91508190565b9192614cb29203600160ff1b01600a0a906149ad565b600160ff1b91905f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c73565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c76565b8107614d21575b80614c42565b60ff1d600117015f614d1b565b505050919350614d3c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c18565b50835f12614c13565b15614d7a5750509190565b9350919050565b9392919384158115818117614ed257505090614d9c91615409565b9194908295614dad82958294615409565b8096929491969387868482138015614ec9575b614eb0575b5050505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614e96575b505081019182821860ff1c1115614e8e57826001600160ff1b0314614cee57905f600192135f14614e5f57600a9004915b01925b81158117614e3257509190565b80614e4257508015614c94579190565b600160ff1b93614e599291038401600a0a906149ad565b5f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e22565b509092614e25565b8107614ea3575b80614df1565b60ff1d600117015f614e9d565b929b5098509196509450925090505f8080808080614dc5565b50858412614dc0565b9395939092919015614ee8575050614c94579190565b945092915050565b6008815110614164576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f4e610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b94519301614f5d815186612be9565b614f65575050565b909350611a7391925051925183613c00565b92915f9060018184145f87128715171717614ff1575f92808213614fe3575b03604c81135f821217614fd757600a0a9084614fb583820293846149ad565b14614fca57505015614fc6575f9190565b5f90565b9093509015611a73579190565b505015614fc6575f9190565b5f9560019450925090614f96565b5050505f90565b93929190918083145f83125f87121883158715171717615047575f9280821361503a5703604c81135f821217614fd757600a0a9084614fb583820293846149ad565b9194600193509190614f96565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561509f576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836150b157505090505f90600190565b60ff8116820191808312615179575f8312156150e9575050604c198112614c94575f03600a0a916150e283826140e1565b9283021490565b909293915f81135f1461516f57604d811361514457600a0a9283156140eb57835f1904831161511b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151de576151b591926157ae565b506151bf816141fa565b1591826151cb57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b909392915f61526a9181846145a9565b9490945f84830191820194121590816152b7575b81156152ad575b5061528f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615285565b828112915061527e565b6152d693600160fe1b908101939201906145a9565b9081815f82121561530d575050604b198212612cd7576152fb915f03600a0a906149ad565b9081615305575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615335575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153e4576001600160ff1b0392838311156153ce57600160ff1b9383850361538457505050509190565b9091929350851461539e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c90575f039190565b90916001600160ff1b0380841115612c5857851461539e575050600a60019104920190565b91909180156155ab57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156154b9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8301106154aa575b83136154945791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615488565b6f4b3b4ca85a86c47a098a22400000000080840515615599575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615582575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000083051561556e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561555e5782051561554f575b5f61543d565b9290600a02905f190192615549565b939160640291600119019361551a565b93916402540be4000291600919019361551a565b9391678ac7230489e80000029160121901936154f5565b6025198301955092909202915f6154d3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615633571461562b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561566b575f036157e8565b6157e8565b909291600160ff1b9182810161570257508084146156f8578084139182156156f0578185035b604c8111156156df5750505f915b156156d057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140eb5704916156a4565b848203615696565b505090505f905f90565b9361570f92945f03614be2565b80939180928114615723575b50505f039190565b915092506001600160ff1b038314614cee57600a600191059201915f8061571b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615783575b61576b5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615764565b81519190604183036157de576157d79250602082015190606060408401519301515f1a90615877565b9192909190565b50505f9160029190565b90637ffffff581131561587157637ffffffe198101906043821361586a575f82121561583e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140eb577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158ee579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158e457905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615aeb908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b9261015761308d565b612551565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b919061027861308d565b60405192610285846119d4565b5f84523691611dfb565b90613581565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612535565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b3061435b565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f92919261308d565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6142f1565b614346565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b606082015260648401356080820152610571816130cf565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550613100565b8190838080808080610587565b6106486104af848b612121565b610651816150e2565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461308d565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184613190565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613aca565b6109de816130cf565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613b3c565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af1606082015160446004350135906131b3565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151613190565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613dcb565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b61479b565b90614956565b9d8e9260408d0151613e96565b60408c0152613ec0565b99613ec0565b98610c5a8484613eea565b610c648482613f48565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c015261405a565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b61479b565b60408a0151610dd98183613dcb565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613e96565b610e129085613df2565b610dfb565b905091610de1565b50610e2d6060820151613da8565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613dcb565b61101b5750508490610ed7856001600160a01b0360208701511633613a61565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f1692935116336131da565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614233565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151613190565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f61308d565b61111a84863361315c565b61112383613190565b1561126857611133848633613794565b61113d8185613dcb565b15611262575082935b61115285828833613a03565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613a61565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612519565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff91606435838111610182573660238201121561018257806004013593841161018257366024858301011161018257611351956020921693611313868587613924565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a4576113999350309161399d565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b60443591613794565b604051908152f35b3461018257611436366118b0565b8394939261144261308d565b61144d84863361315c565b61145681613190565b1561155c578061146a6114b99287336131da565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613280565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612519565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e61308d565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b6130cf565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1613100565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b9061218161163761217a8480611f4f565b3690611b81565b5f5260205f81526040926001845f20540361250e57916124039161220885855f6123886121b1836121c89a611f4f565b6121cd878501359182878701359c8d923690611b81565b613aca565b6121e56121da8580611f4f565b946060810190611ead565b96906122008751966121f6886119d4565b8688523690611b81565b973691611c14565b90612211613aff565b50612338865191612221836119b8565b600683526122308a8401612519565b8861223a816130cf565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261226d86611faa565b5261227785611faa565b50805161228381611950565b6002815281368e83013761229686611fb7565b526122a085611fb7565b50810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b51511661473f565b975116906122d4898851612007565b515116846122e38a8951612007565b51015191613794565b958d6122f9828751612007565b5151169451612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61234182611fc7565b5261234b81611fc7565b5061236f8b886060810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b61237882611fd7565b5261238281611fd7565b5061450d565b918385511693868601918b83519289818551169401511693878652308a528180872091510151908251926123bb846119d4565b87845251956123c9876119b8565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301613488565b03915afa95865f915f986124e8575b506124215788513d5f823e3d90fd5b95938651600281106124d15750888798998260c0979899015199015161244f61244985611fe7565b51611fd7565b5161245a8183613dcb565b156124c75750998a925b6124868b85919060405192600284526020840152604083015260608201604052565b61248f86611fc7565b5261249985611fc7565b508251966124a6886119b8565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612464565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061250791503d805f833e6124ff81836119f0565b810190613344565b965f612412565b505f92508291829150565b5f5b60c08110612527575050565b60608282015260200161251b565b5f5b82811061254357505050565b606082820152602001612537565b926001600160a01b038451166001600160a01b038351161461307b576001600160a01b03612586606086015160643590612007565b5151166001600160a01b036125a2604085015160843590612007565b5151161480159061303b575b610e32576001600160a01b036125cb604086015160443590612007565b5151166001600160a01b036125e66064356060880151612007565b51511614613029576125f7846130cf565b805f525f60205260405f205415612fd95750612612826130cf565b805f525f60205260405f205415612f895750612928907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061267561266761012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16128956001600160a01b0384511691604051926126c5846119d4565b5f84526126d0613aff565b50604051906126de826119b8565b600682526126ee60208301612519565b6126f7896130cf565b906001600160a01b038a5116604051926004845260208401526040830152606082015233608082015260a0810160405261273082611faa565b5261273a81611faa565b5060405161274781611950565b60028152604036602083013761275c82611fb7565b5261276681611fb7565b506127f46127856001600160a01b036122bd60443560408d0151612007565b6127c26001600160a01b038b51168b60206122e36001600160a01b036127b16044356040860151612007565b515116926040604435910151612007565b908a60ff60206123036001600160a01b036127e36044356040870151612007565b515116936040604435910151612007565b6127fd82611fc7565b5261280781611fc7565b5061236f6128266001600160a01b036122bd60643560608d0151612007565b6128636001600160a01b038b51168b60206122e36001600160a01b036128526064356060860151612007565b515116926060606435910151612007565b908a60ff60206123036001600160a01b036128846064356060870151612007565b515116936060606435910151612007565b905f6001600160a01b038751169160208801908151906001600160a01b03602081845116930151169285855230602052604080862091510151604051916128db836119d4565b868352604051956128eb876119b8565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b835260048301613488565b03915afa92835f915f95612f6b575b50612947576040513d5f823e3d90fd5b9291835160028110612f2d57506040602085015194015161296a61244983611fe7565b516129758183613dcb565b15612f635750935b61299f8186919060405192600284526020840152604083015260608201604052565b6129a883611fc7565b526129b282611fc7565b50604051946129c0866119b8565b888652606435602087015260408601526060850152608084015260a083015260c0820152612bc86001600160a01b038551169360405194612a00866119d4565b5f8652612a0b613aff565b5060405190612a19826119b8565b60068252612a2960208301612519565b612a32866130cf565b906001600160a01b03875116604051926004845260208401526040830152606082015233608082015260a08101604052612a6b82611faa565b52612a7581611faa565b50604051612a8281611950565b600281526040366020830137612a9782611fb7565b52612aa181611fb7565b50612b2b612ac06001600160a01b036122bd60843560408a0151612007565b612afb6001600160a01b038851166001600160a01b03612ae660843560408c0151612007565b51511660206122e360843560408d0151612007565b906001600160a01b03612b1460843560408b0151612007565b51511660ff602061230360843560408d0151612007565b612b3482611fc7565b52612b3e81611fc7565b5061236f612b5d6001600160a01b036122bd60a43560608a0151612007565b612b986001600160a01b038851166001600160a01b03612b8360a43560608c0151612007565b51511660206122e360a43560608d0151612007565b906001600160a01b03612bb160a43560608b0151612007565b51511660ff602061230360a43560608d0151612007565b92612c5e5f6001600160a01b038551169260208601908151906001600160a01b0360208184511693015116928685523060205260408086209151015160405191612c11836119d4565b86835260405195612c21876119b8565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93612f45575b50612c7d576040513d5f823e3d90fd5b90815160028110612f2d575060406020830151920151612c9f61244988611fe7565b51612caa8183613dcb565b15612f255750925b612cd48385919060405192600284526020840152604083015260608201604052565b612cdd88611fc7565b52612ce787611fc7565b5060405196612cf5886119b8565b86885260a43560208901526040880194855260608801938452608088015260a087015260c0860152612d2a6040840151613190565b15918215612f11575b508115612efc575b8115612eeb575b50612ed95760405191612d5483611988565b5f83525f60208401525f60408401525f6060840152612d738483615106565b84526040840152612d99612d878386615106565b60208601528060608601528451613e96565b94612dad6020850151604086015190613e96565b93612db787613da8565b8015612eca575b612eb857612e7f612eb1957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d94612e61612eb69a60a096612e008a8851613eea565b612e0e8c6020890151613eea565b612e1c8a6040890151613f48565b612e2a8c6060890151613f48565b612e338a614233565b612e3c8c614233565b6001600160a01b03612e5860c435926060606435910151612007565b51511633613280565b50506001600160a01b03612e5860e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161405a565b61405a565b565b604051630d86822160e01b8152600490fd5b50612ed485613da8565b612dbe565b6040516321badf1f60e01b8152600490fd5b612ef6915051613da8565b5f612d42565b9050612f0b6060830151613da8565b90612d3b565b612f1d91925051613190565b15905f612d33565b905092612cb2565b60249060405190630fbb8e5560e21b82526004820152fd5b909250612f5c91503d805f833e6124ff81836119f0565b915f612c6d565b90509361297d565b909450612f8291503d805f833e6124ff81836119f0565b935f612937565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612fd4565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03613055606084015160a43590612007565b5151166001600160a01b03613071604087015160443590612007565b51511614156125ae565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146130bd5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516130fa816130ec602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b612eb6929161312b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193613139856119b8565b6006855261314960208601612519565b61315285611faa565b5261124d84611faa565b909115613167575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6131af905f60e01d906001600160e01b038160e01d9116601b0b615169565b1290565b906131af916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b9291926131e68261442e565b936131f081613da8565b61326e5784816001600160e01b0361320f9360e01d9116601b0b615269565b9290809315613245575b50829081613229575b5050509190565b61323d926001600160a01b0330921661399d565b5f8181613222565b9092505f19811461325a57600101915f613219565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361328d83613da8565b61332b57846132a9576132a1939450613a61565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613ec0565b956132f087613da8565b613313575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261337f82611ad4565b9161338d60405193846119f0565b808352848084019160051b830101918683116101825785809101915b83831061341c5750505050948281015191821161018257019180601f840112156101825782516133d881611ad4565b936133e660405195866119f0565b818552838086019260051b820101928311610182578301905b82821061340d575050505090565b815181529083019083016133ff565b82518152918101918691016133a9565b90808251908181526020809101926020808460051b8301019501935f915b84831061345a5750505050505090565b9091929394958480613478600193601f198682030187528a516120ee565b980193019301919493929061344a565b91906020928381526001600160a01b03825116848201528382015160408201526134c2604083015160e060608401526101008301906118fc565b90606083015160808201526134e9608084015192601f1993848483030160a085015261342c565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061352c57505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101613508565b90604082019082526020606081936040838201528551809452019301915f5b82811061356d575050505090565b83518552938101939281019260010161355f565b919091604092835192613593846119b8565b600684526020946135a5868601612519565b5f5b84518110156135da57806135bd60019287612007565b516135c88289612007565b526135d38188612007565b50016135a7565b50925092939093335f52308252825f20918351956135f78761196c565b6135ff611ee3565b875260608281980152845190613614826119d4565b5f8252855190613623826119d4565b5f82525f3681375f5b8151811015613788578986886136428486612007565b51888151948d80870151908151613664575b505050505050505060010161362c565b905f92916001600160a01b03966136898887818d51169c01511699878901519061450d565b958251996136968b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b825281806136d1600498898301613488565b03915afa93841561377e579089915f95613760575b5084516136fc575b50899250808e8c938e613654565b5101511691823b156101825761372a925f92838d5180968195829463012c676d60e21b845233908401613540565b03925af18015613756579060019291613747575b819287826136ee565b613750906119a4565b5f61373e565b89513d5f823e3d90fd5b6137759195503d805f833e6124ff81836119f0565b9050935f6136e6565b8c513d5f823e3d90fd5b50505050505050509050565b82156137c9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506137d58261473f565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156138eb575f976138f5575b508361382c6138258361385c9a61541e565b5090614ba9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156138eb575f976138ba575b5061382561388091611a739861541e565b5061388b8183613dcb565b156138b25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ec0565b905093613893565b96508387813d83116138e4575b6138d181836119f0565b810103126101825795519561382561386f565b503d6138c7565b85513d5f823e3d90fd5b96508387813d831161391d575b61390c81836119f0565b810103126101825795519583613813565b503d613902565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561397e575b836040521561396857505050565b635274afe760e01b835216600482015260249150fd5b600181151661399457813b15153d15161661395a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156139ed575b836040525f6060521561396857505050565b600181151661399457813b15153d1516166139db565b93929193613a1083613da8565b61332b5784613a24576132a19394506131da565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613e96565b90929192613a6e8161442e565b93613a7881613da8565b613ab85784816001600160e01b03613a979360e01d9116601b0b615269565b50809281613aa6575050509190565b6001600160a01b0361323d9316613924565b604051632d1671a360e11b8152600490fd5b91613af5906060613aea936001600160a01b039485916040880151612007565b515116940151612007565b5151161461302957565b60405190613b0c826119b8565b606060c083613b19611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613b4b613aff565b50604092613c39845191613b5e836119b8565b60068352602092613b70848201612519565b613c03613b7c8a6130cf565b966001600160a01b0397888c51168a519160038352888301528a820152886060981688820152608081018a52613bb184611faa565b52613bbb83611faa565b508851613bc781611950565b60028152893688830137613bda84611fb7565b52613be483611fb7565b508a89810160ff886123036122ec8d806122c5816122bd8b8a51612007565b613c0c82611fc7565b52613c1681611fc7565b5061236f8a8a87810160ff886123036122ec8d806122c5816122bd8b8a51612007565b93613cb95f8589511697859685879b0191825191878184511693015116928b85523088528680862091510151875191613c71836119d4565b868352885195613c80876119b8565b8652898601528785015284898501528a608085015260a084015260c08301528451808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93613d8a575b50613d7e575b5050600284511097881598613d6c578183860151950151613cf161244988611fe7565b51613cfc8183613dcb565b15613d645750925b613d268685919060405192600284526020840152604083015260608201604052565b613d2f88611fc7565b52613d3987611fc7565b5082519b613d468d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613d04565b50505050505050509150611a73613aff565b90975093505f80613cce565b909250613da191503d805f833e6124ff81836119f0565b915f613cc8565b613dc7905f60e01d906001600160e01b038160e01d9116601b0b615169565b1390565b90613dc7916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b613e196001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614960565b90637ffffff58213613e69575b90613e3091614ba9565b9290921580613e61575b613e4357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613e3a565b613e738282615849565b15613e2657604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614daf565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614f73565b613f44916080810182613f06613f008351611fe7565b51611fe7565b52613f3d613f376001600160a01b03809451511693613f2e613f288551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613a03565b5050565b90608081019180613f5c613f008551611fd7565b526001600160a01b03809251511691613f78613f288551611fd7565b5116613f87613f378551611fd7565b51908161402257613f9783613da8565b61332b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd4955f5260209060018252613fed604094855f20835f528452855f20855f528452855f2054613ec0565b945f5260018252835f20905f528152825f20915f52525f20555b5160405191829133835260406020840152604083019061342c565b91614053917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd495613280565b5050614007565b60c0810151908151915f926141ce575b5061410f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916140b7836119d4565b8683528c51936140c6856119d4565b8785528d51966140d5886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301613488565b03915afa9485156141c45787956141a6575b508451614132575b50505050505050565b81905101510151169051813b156141a257918491849383614167965180978195829463012c676d60e21b845260048401613540565b03925af19081156141995750614182575b8080808080614129565b61418c82916119a4565b6141965780614178565b80fd5b513d84823e3d90fd5b8480fd5b6141bb9195503d8089833e6124ff81836119f0565b9050935f614121565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257614211925f928360405180968195829463012c676d60e21b845260048401613540565b03925af1801561022c571561406a5761422b9192506119a4565b5f905f61406a565b60808101614244613f378251611fd7565b5191821561425157505050565b61426b613f286001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166142a6575b505050505050565b6142ca955f9284845260018152828420868552815282842091845252812055613a61565b5f80808061429e565b81156142dd570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614339576020810151908051603f19810190811161325a5760051c82116143255760016020920160051b010190565b5050604051614333816119d4565b5f815290565b50604051614333816119d4565b80511561435657602001515f1a90565b505f90565b905f8091602081519101845af480806143d9575b1561438f5750506040513d81523d5f602083013e60203d82010160405290565b156143b657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156143c7576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061436f5750813b151561436f565b600411156143f657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261442a836143ec565b0152565b614436615937565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614504575f925f946144cf575b5061448c836143ec565b6001831415806144bd575b6144a15750505090565b5163ee07877f60e01b81529182916106df91906004840161440a565b506144c7836143ec565b821515614497565b908094506144f39293503d85116144fd575b6144eb81836119f0565b81019061523f565b919091925f614482565b503d6144e1565b513d5f823e3d90fd5b9080519161451a83611ad4565b9161453560409461452d865195866119f0565b808552611ad4565b601f19946020918601368684013783518351909590801561473457600161458b9101965b600197889101019761458261456d8a611ad4565b9961457a86519b8c6119f0565b808b52611ad4565b01848901612535565b85805f96845160028152338782015230868201526060810186526145ae8b611faa565b526145b88a611faa565b505f925b6146f0575b50505083516145d4575b50505050505090565b858095989796929801816145e88289612007565b526145f38188612007565b505f925b614606575b50859697506145cb565b84518310156146eb576001600160a01b0361467d816146258689612007565b51511686614633878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614674888b612007565b51015191615395565b156146d357868098999a928192614694878a612007565b5151166146a18787612007565b520193856146af8289612007565b5101516146bc868c612007565b526146c7858b612007565b500192909897966145f7565b8951630a57f30960e31b815260048101859052602490fd5b6145fc565b909196815188101561472b57828091019761470b8184612007565b516147168a8d612007565b52614721898c612007565b50019190816145bc565b968291506145c1565b5061458b5f96614559565b614747615937565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614504575f925f946144cf575061448c836143ec565b9091939284158215175f146147b55750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6148ec575b50506147d88161550e565b936147e28161550e565b946147ed868261552e565b909182156148dd575f9083986f0785ee10d5da46d900f436a0000000008086116148cf575b50670de0b6b3a7640000808b116148c0575b50633b9aca00808b116148b1575b50612710808b116148a3575b5098805b614892575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615541565b60019290920191600a900480614842565b60049a04998a93019261483e565b600991939a049901915f614832565b601291939a049901915f614824565b85049950602592505f614812565b509290506118f8949550615541565b5f82121561494057808413614932575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156147cd579092506118f893949161544c565b9092506118f89394916154b3565b808412156148fc579092506118f893949161544c565b613e308282614ba9565b92909180614986576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461499b57505050505f905f90565b6149b4936149a8916155fb565b929194909384926155fb565b90939192846149c28861550e565b916149cc8661550e565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614b73575b030191600160ff1b98838a018112155f14614b40575050035b5f955f821280614b37575b614b19575b5f811280614b07575b614ae95786820103966001600160ff1b0388149081614adf575b5080614ad6575b80614acd575b614aaf575090614a6392916157a7565b915f8113614a76575b506118f893615541565b9091604c8213614aa457614a8d91600a0a906142d3565b908115614a9a575f614a6c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614a53565b50828414614a4d565b905088145f614a46565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614a2c565b9550808701861315614b315786818703015b95614a23565b5f614b2b565b505f8113614a1e565b89985090920390506001600160ff1b0381900387018213614b645701860194614a13565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506149fa565b81156142dd570590565b8082601b82810b8314614d9e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614d4a575b8380820b03614d3957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614cea575b838060030b03614c6e575b808413614c525750506001600160e01b036001925b60e01b91161791565b8303600a0a80156142dd576001600160e01b0391071592614c49565b92915f841315614cbe575090614c848383615849565b614ca057637ffffffe1901600a0a810290637fffffff92614c34565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614aa457614cdd91600a0a90614b9f565b918215614a9a5792614c34565b5f198401808060030b14614cfe5750614c29565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614bdc565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614d8b576305f5e100600894058094819201955b915050614bdc565b620186a060059405809481920195614d83565b5082614c2957505050505f90600190565b919291600160ff1b8401614dc7576118f89350615862565b906118f8935f0391614f73565b919291600160ff1b9190801580614f61575090614df0916155fb565b9490929091905f868585858282138015614f58575b614f3b575b505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084614f06575b505081019182821860ff1c1115614efe57826001600160ff1b0314614ee057905f600192135f14614eb157600a9004915b01925b81158117614e7557509190565b80614e8e575b508015614e86579190565b505f91508190565b9192614ea49203600160ff1b01600a0a90614b9f565b600160ff1b91905f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e65565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614e68565b8107614f13575b80614e34565b60ff1d600117015f614f0d565b505050919350614f2e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614e0a565b50835f12614e05565b15614f6c5750509190565b9350919050565b93929193841581158181176150c457505090614f8e916155fb565b9194908295614f9f829582946155fb565b80969294919693878684821380156150bb575b6150a2575b5050505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084615088575b505081019182821860ff1c111561508057826001600160ff1b0314614ee057905f600192135f1461505157600a9004915b01925b8115811761502457509190565b8061503457508015614e86579190565b600160ff1b9361504b9291038401600a0a90614b9f565b5f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615014565b509092615017565b8107615095575b80614fe3565b60ff1d600117015f61508f565b929b5098509196509450925090505f8080808080614fb7565b50858412614fb2565b93959390929190156150da575050614e86579190565b945092915050565b6008815110614356576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040615140610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61479b565b9451930161514f8151866131b3565b615157575050565b909350611a7391925051925183613df2565b92915f9060018184145f871287151717176151e3575f928082136151d5575b03604c81135f8212176151c957600a0a90846151a78382029384614b9f565b146151bc575050156151b8575f9190565b5f90565b9093509015611a73579190565b5050156151b8575f9190565b5f9560019450925090615188565b5050505f90565b93929190918083145f83125f87121883158715171717615239575f9280821361522c5703604c81135f8212176151c957600a0a90846151a78382029384614b9f565b9194600193509190615188565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615291576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836152a357505090505f90600190565b60ff811682019180831261536b575f8312156152db575050604c198112614e86575f03600a0a916152d483826142d3565b9283021490565b909293915f81135f1461536157604d811361533657600a0a9283156142dd57835f1904831161530d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6153d0576153a791926159a0565b506153b1816143ec565b1591826153bd57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461544457600a6001818404940192061590565b909190600190565b909392915f61545c91818461479b565b9490945f84830191820194121590816154a9575b811561549f575b5061548157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615477565b8281129150615470565b6154c893600160fe1b9081019392019061479b565b9081815f8212156154ff575050604b1982126132a1576154ed915f03600a0a90614b9f565b90816154f7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615527575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156155d6576001600160ff1b0392838311156155c057600160ff1b9383850361557657505050509190565b90919293508514615590575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461325a575f039190565b90916001600160ff1b0380841115613222578514615590575050600a60019104920190565b919091801561579d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156156ab575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061569c575b83136156865791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f19019261567a565b6f4b3b4ca85a86c47a098a2240000000008084051561578b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615774575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615760575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561575057820515615741575b5f61562f565b9290600a02905f19019261573b565b939160640291600119019361570c565b93916402540be4000291600919019361570c565b9391678ac7230489e80000029160121901936156e7565b6025198301955092909202915f6156c5565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615825571461581d579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561585d575f036159da565b6159da565b909291600160ff1b918281016158f457508084146158ea578084139182156158e2578185035b604c8111156158d15750505f915b156158c257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156142dd570491615896565b848203615888565b505090505f905f90565b9361590192945f03614dd4565b80939180928114615915575b50505f039190565b915092506001600160ff1b038314614ee057600a600191059201915f8061590d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615975575b61595d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615956565b81519190604183036159d0576159c99250602082015190606060408401519301515f1a90615a69565b9192909190565b50505f9160029190565b90637ffffff5811315615a6357637ffffffe1981019060438213615a5c575f821215615a3057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156142dd577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615ae0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b03811615615ad657905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b92610157612ad8565b612261565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b9190610278612ad8565b60405192610285846119d4565b5f84523691611dfb565b90612fb7565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612245565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b30614169565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f929192612ad8565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6140ff565b614154565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b60608201526064840135608082015261057181612b1a565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550612b4b565b8190838080808080610587565b6106486104af848b612121565b61065181614ef0565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c0906004353603011261018257610764612ad8565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184612bc6565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613500565b6109de81612b1a565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613572565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af160608201516044600435013590612be9565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151612bc6565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613bd9565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145a9565b90614764565b9d8e9260408d0151613ca4565b60408c0152613cce565b99613cce565b98610c5a8484613cf8565b610c648482613d56565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c0152613e68565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145a9565b60408a0151610dd98183613bd9565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613ca4565b610e129085613c00565b610dfb565b905091610de1565b50610e2d6060820151613bb6565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613bd9565b61101b5750508490610ed7856001600160a01b0360208701511633613497565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f169293511633612c10565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614041565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151612bc6565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f612ad8565b61111a848633612b92565b61112383612bc6565b15611268576111338486336131ca565b61113d8185613bd9565b15611262575082935b61115285828833613439565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613497565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612229565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761135195602092169361131386858761335a565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a457611399935030916133d3565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b604435916131ca565b604051908152f35b3461018257611436366118b0565b83949392611442612ad8565b61144d848633612b92565b61145681612bc6565b1561155c578061146a6114b9928733612c10565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612cb6565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612229565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e612ad8565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b612b1a565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1612b4b565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121806116376121798380611f4f565b3690611b81565b5f525f602052600160405f20540361222057806121a08161220c93611f4f565b6122046121bf6121c46020850135938460408701359384923690611b81565b613500565b6121dc6121d18580611f4f565b946060810190611ead565b92906121fc604051966121ee886119d4565b5f88525f3681373690611b81565b933691611c14565b92339261381e565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60c08110612237575050565b60608282015260200161222b565b5f5b82811061225357505050565b606082820152602001612247565b91926001600160a01b038351166001600160a01b0383511614612ac6576001600160a01b03612297606085015160643590612007565b5151166001600160a01b036122b3604085015160843590612007565b51511614801590612a86575b610e32576001600160a01b036122dc604085015160443590612007565b5151166001600160a01b036122f76064356060870151612007565b51511614612a745761230883612b1a565b805f525f60205260405f205415612a25575061232382612b1a565b805f525f60205260405f2054156129d5575061269392937f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061238761237961012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16126006001600160a01b0384511692604051936123d7856119d4565b5f85526123e2613535565b50604051906123f0826119b8565b6006825261240060208301612229565b61240989612b1a565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261243c82611faa565b5261244681611faa565b5060405161245381611950565b60028152604036602083013761246882611fb7565b5261247281611fb7565b506125466124996001600160a01b0361249160443560408d0151612007565b51511661454d565b6124df6001600160a01b038b51168b60206124d66001600160a01b036124c56044356040860151612007565b515116926040604435910151612007565b510151916131ca565b908a60ff60206125116001600160a01b036125006044356040870151612007565b515116936040604435910151612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61254f82611fc7565b5261255981611fc7565b506125e76125786001600160a01b0361249160643560608d0151612007565b6125b56001600160a01b038b51168b60206124d66001600160a01b036125a46064356060860151612007565b515116926060606435910151612007565b908a60ff60206125116001600160a01b036125d66064356060870151612007565b515116936060606435910151612007565b6125f082611fd7565b526125fa81611fd7565b5061431b565b915f6001600160a01b038751169160208801908151906001600160a01b0360208184511693015116928585523060205260408086209151015160405191612646836119d4565b86835260405195612656876119b8565b86526020860152604085015284606085015287608085015260a084015260c0830152604051808099819463d04dfe2360e01b835260048301612ebe565b03915afa94855f915f976129af575b506126b2576040513d5f823e3d90fd5b94908551600281106129975750906127859291604060208801519701516126e16126db87611fe7565b51611fd7565b516126ec8183613bd9565b1561298f5750945b6127168887919060405192600284526020840152604083015260608201604052565b61271f82611fc7565b5261272981611fc7565b5060405195612737876119b8565b8987526064356020880152604087015260608601978852608086015260a085015260c08401526001600160a01b038651169060405191612776836119d4565b5f835260a4356084358761381e565b9390506127956040830151612bc6565b15908115612979575b8115612968575b508015612955575b61294357604051916127be83611988565b5f83525f60208401525f60408401525f60608401526127dd8483614f14565b845260408401526128036127f18386614f14565b60208601528060608601528451613ca4565b946128176020850151604086015190613ca4565b9361282187613bb6565b8015612934575b612922576128e961291b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128cb6129209a60a09661286a8a8851613cf8565b6128788c6020890151613cf8565b6128868a6040890151613d56565b6128948c6060890151613d56565b61289d8a614041565b6128a68c614041565b6001600160a01b036128c260c435926060606435910151612007565b51511633612cb6565b50506001600160a01b036128c260e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e68565b613e68565b565b604051630d86822160e01b8152600490fd5b5061293e85613bb6565b612828565b6040516321badf1f60e01b8152600490fd5b506129636060840151613bb6565b6127ad565b612973915051613bb6565b5f6127a5565b90506129886040850151612bc6565b159061279e565b9050946126f4565b60249060405190630fbb8e5560e21b82526004820152fd5b9096506129ce91503d805f833e6129c681836119f0565b810190612d7a565b955f6126a2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9251604080513381526001600160a01b039092166020830152810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3925081905060608101612a20565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612aa0606084015160a43590612007565b5151166001600160a01b03612abc604086015160443590612007565b51511614156122bf565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b085760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b4581612b37602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b6129209291612b7661028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611dfb565b909115612b9d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612be5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1290565b90612be5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b929192612c1c8261423c565b93612c2681613bb6565b612ca45784816001600160e01b03612c459360e01d9116601b0b615077565b9290809315612c7b575b50829081612c5f575b5050509190565b612c73926001600160a01b033092166133d3565b5f8181612c58565b9092505f198114612c9057600101915f612c4f565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612cc383613bb6565b612d615784612cdf57612cd7939450613497565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613cce565b95612d2687613bb6565b612d49575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612db582611ad4565b91612dc360405193846119f0565b808352848084019160051b830101918683116101825785809101915b838310612e525750505050948281015191821161018257019180601f84011215610182578251612e0e81611ad4565b93612e1c60405195866119f0565b818552838086019260051b820101928311610182578301905b828210612e43575050505090565b81518152908301908301612e35565b8251815291810191869101612ddf565b90808251908181526020809101926020808460051b8301019501935f915b848310612e905750505050505090565b9091929394958480612eae600193601f198682030187528a516120ee565b9801930193019194939290612e80565b91906020928381526001600160a01b0382511684820152838201516040820152612ef8604083015160e060608401526101008301906118fc565b9060608301516080820152612f1f608084015192601f1993848483030160a0850152612e62565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f6257505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101612f3e565b90604082019082526020606081936040838201528551809452019301915f5b828110612fa3575050505090565b835185529381019392810192600101612f95565b919091604092835192612fc9846119b8565b60068452602094612fdb868601612229565b5f5b84518110156130105780612ff360019287612007565b51612ffe8289612007565b526130098188612007565b5001612fdd565b50925092939093335f52308252825f209183519561302d8761196c565b613035611ee3565b87526060828198015284519061304a826119d4565b5f8252855190613059826119d4565b5f82525f3681375f5b81518110156131be578986886130788486612007565b51888151948d8087015190815161309a575b5050505050505050600101613062565b905f92916001600160a01b03966130bf8887818d51169c01511699878901519061431b565b958251996130cc8b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180613107600498898301612ebe565b03915afa9384156131b4579089915f95613196575b508451613132575b50899250808e8c938e61308a565b5101511691823b1561018257613160925f92838d5180968195829463012c676d60e21b845233908401612f76565b03925af1801561318c57906001929161317d575b81928782613124565b613186906119a4565b5f613174565b89513d5f823e3d90fd5b6131ab9195503d805f833e6129c681836119f0565b9050935f61311c565b8c513d5f823e3d90fd5b50505050505050509050565b82156131ff576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061320b8261454d565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715613321575f9761332b575b508361326261325b836132929a61522c565b50906149b7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715613321575f976132f0575b5061325b6132b691611a739861522c565b506132c18183613bd9565b156132e85750935b5f5260018252825f20905f528152815f20905f8052525f205490613cce565b9050936132c9565b96508387813d831161331a575b61330781836119f0565b810103126101825795519561325b6132a5565b503d6132fd565b85513d5f823e3d90fd5b96508387813d8311613353575b61334281836119f0565b810103126101825795519583613249565b503d613338565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f51148116156133b4575b836040521561339e57505050565b635274afe760e01b835216600482015260249150fd5b60018115166133ca57813b15153d151616613390565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613423575b836040525f6060521561339e57505050565b60018115166133ca57813b15153d151616613411565b9392919361344683613bb6565b612d61578461345a57612cd7939450612c10565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613ca4565b909291926134a48161423c565b936134ae81613bb6565b6134ee5784816001600160e01b036134cd9360e01d9116601b0b615077565b508092816134dc575050509190565b6001600160a01b03612c73931661335a565b604051632d1671a360e11b8152600490fd5b9161352b906060613520936001600160a01b039485916040880151612007565b515116940151612007565b51511614612a7457565b60405190613542826119b8565b606060c08361354f611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613581613535565b505f9260406136a6815192613595846119b8565b600684526020936135a7858201612229565b61366f6135b38b612b1a565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135ea86611faa565b526135f485611faa565b50875161360081611950565b6002815288368b83013761361386611fb7565b5261361d85611fb7565b5060ff896125118a8501936136598761363b81612491858a51612007565b9751168861364a848951612007565b515116856124d6858a51612007565b96613665828751612007565b5151169451612007565b61367882611fc7565b5261368281611fc7565b506125e7878b8d60ff896125118c8501936136598761363b81612491858a51612007565b946137265f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136de836119d4565b8683528951956136ed876119b8565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612ebe565b03915afa90815f915f93613800575b506137f3575050505f975b6002855110988915996137e0578284870151960151906137626126db89611fe7565b519061376e8284613bd9565b1590506137d85750925b61379a8685919060405192600284526020840152604083015260608201604052565b6137a388611fc7565b526137ad87611fc7565b5082519b6137ba8d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613778565b5050505050505050509150611a73613535565b9199985094509396613740565b90925061381791503d805f833e6129c681836119f0565b915f613735565b9495939592919261382d613535565b5060409687519061383d826119b8565b6006825260209361384f858401612229565b61385889612b1a565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261388a84611faa565b5261389483611faa565b5089516138a081611950565b600281528a36878301376138b384611fb7565b526138bd83611fb7565b508989019086818351906138d091612007565b5151166138dc9061454d565b86888c511689848651906138ef91612007565b515116828587519061390091612007565b5101519061390d926131ca565b92898186519061391c91612007565b51511694519061392b91612007565b5101519060ff16613963929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61396c83611fc7565b5261397682611fc7565b5060608801858782519061398991612007565b5151166139959061454d565b868a511687898451906139a791612007565b515116878a8551906139b891612007565b510151906139c5926131ca565b90868989818651906139d691612007565b5151169451906139e591612007565b5101519060ff16613a1d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a2683611fd7565b52613a3082611fd7565b50613a3a9161431b565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a6b836119d4565b5f83528c5196613a7a886119b8565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613ab99060048301612ebe565b03815a935f94fa91825f915f94613b98575b50613ada5788513d5f823e3d90fd5b97949596979194825196600288109788613b8157508183850151940151613b036126db87611fe7565b51613b0e8183613bd9565b15613b795750925b613b388585919060405192600284526020840152604083015260608201604052565b613b4187611fc7565b52613b4b86611fc7565b5082519a613b588c6119b8565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613b16565b602490835190630fbb8e5560e21b82526004820152fd5b909350613baf91503d805f833e6129c681836119f0565b925f613acb565b613bd5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1390565b90613bd5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b613c276001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461476e565b90637ffffff58213613c77575b90613c3e916149b7565b9290921580613c6f575b613c5157505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c48565b613c818282615657565b15613c3457604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614bbd565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d81565b613d52916080810182613d14613d0e8351611fe7565b51611fe7565b52613d4b613d456001600160a01b03809451511693613d3c613d368551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613439565b5050565b90608081019180613d6a613d0e8551611fd7565b526001600160a01b03809251511691613d86613d368551611fd7565b5116613d95613d458551611fd7565b519081613e3057613da583613bb6565b612d61579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a20955f5260209060018252613dfb604094855f20835f528452855f20855f528452855f2054613cce565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e62565b91613e61917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a2095612cb6565b5050613e15565b60c0810151908151915f92613fdc575b50613f1d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613ec5836119d4565b8683528c5193613ed4856119d4565b8785528d5196613ee3886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ebe565b03915afa948515613fd2578795613fb4575b508451613f40575b50505050505050565b81905101510151169051813b15613fb057918491849383613f75965180978195829463012c676d60e21b845260048401612f76565b03925af1908115613fa75750613f90575b8080808080613f37565b613f9a82916119a4565b613fa45780613f86565b80fd5b513d84823e3d90fd5b8480fd5b613fc99195503d8089833e6129c681836119f0565b9050935f613f2f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761401f925f928360405180968195829463012c676d60e21b845260048401612f76565b03925af1801561022c5715613e78576140399192506119a4565b5f905f613e78565b60808101614052613d458251611fd7565b5191821561405f57505050565b614079613d366001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166140b4575b505050505050565b6140d8955f9284845260018152828420868552815282842091845252812055613497565b5f8080806140ac565b81156140eb570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614147576020810151908051603f198101908111612c905760051c82116141335760016020920160051b010190565b5050604051614141816119d4565b5f815290565b50604051614141816119d4565b80511561416457602001515f1a90565b505f90565b905f8091602081519101845af480806141e7575b1561419d5750506040513d81523d5f602083013e60203d82010160405290565b156141c457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141d5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061417d5750813b151561417d565b6004111561420457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614238836141fa565b0152565b614244615745565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614312575f925f946142dd575b5061429a836141fa565b6001831415806142cb575b6142af5750505090565b5163ee07877f60e01b81529182916106df919060048401614218565b506142d5836141fa565b8215156142a5565b908094506143019293503d851161430b575b6142f981836119f0565b81019061504d565b919091925f614290565b503d6142ef565b513d5f823e3d90fd5b9080519161432883611ad4565b9161434360409461433b865195866119f0565b808552611ad4565b601f1994602091860136868401378351835190959080156145425760016143999101965b600197889101019761439061437b8a611ad4565b9961438886519b8c6119f0565b808b52611ad4565b01848901612245565b85805f96845160028152338782015230868201526060810186526143bc8b611faa565b526143c68a611faa565b505f925b6144fe575b50505083516143e2575b50505050505090565b858095989796929801816143f68289612007565b526144018188612007565b505f925b614414575b50859697506143d9565b84518310156144f9576001600160a01b0361448b816144338689612007565b51511686614441878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614482888b612007565b510151916151a3565b156144e157868098999a9281926144a2878a612007565b5151166144af8787612007565b520193856144bd8289612007565b5101516144ca868c612007565b526144d5858b612007565b50019290989796614405565b8951630a57f30960e31b815260048101859052602490fd5b61440a565b90919681518810156145395782809101976145198184612007565b516145248a8d612007565b5261452f898c612007565b50019190816143ca565b968291506143cf565b506143995f96614367565b614555615745565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614312575f925f946142dd575061429a836141fa565b9091939284158215175f146145c35750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146fa575b50506145e68161531c565b936145f08161531c565b946145fb868261533c565b909182156146eb575f9083986f0785ee10d5da46d900f436a0000000008086116146dd575b50670de0b6b3a7640000808b116146ce575b50633b9aca00808b116146bf575b50612710808b116146b1575b5098805b6146a0575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c17029161534f565b60019290920191600a900480614650565b60049a04998a93019261464c565b600991939a049901915f614640565b601291939a049901915f614632565b85049950602592505f614620565b509290506118f894955061534f565b5f82121561474e57808413614740575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145db579092506118f893949161525a565b9092506118f89394916152c1565b8084121561470a579092506118f893949161525a565b613c3e82826149b7565b92909180614794576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147a957505050505f905f90565b6147c2936147b691615409565b92919490938492615409565b90939192846147d08861531c565b916147da8661531c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614981575b030191600160ff1b98838a018112155f1461494e575050035b5f955f821280614945575b614927575b5f811280614915575b6148f75786820103966001600160ff1b03881490816148ed575b50806148e4575b806148db575b6148bd57509061487192916155b5565b915f8113614884575b506118f89361534f565b9091604c82136148b25761489b91600a0a906140e1565b9081156148a8575f61487a565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614861565b5082841461485b565b905088145f614854565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361483a565b955080870186131561493f5786818703015b95614831565b5f614939565b505f811361482c565b89985090920390506001600160ff1b03819003870182136149725701860194614821565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614808565b81156140eb570590565b8082601b82810b8314614bac577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b58575b8380820b03614b4757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614af8575b838060030b03614a7c575b808413614a605750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140eb576001600160e01b0391071592614a57565b92915f841315614acc575090614a928383615657565b614aae57637ffffffe1901600a0a810290637fffffff92614a42565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148b257614aeb91600a0a906149ad565b9182156148a85792614a42565b5f198401808060030b14614b0c5750614a37565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149ea565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b99576305f5e100600894058094819201955b9150506149ea565b620186a060059405809481920195614b91565b5082614a3757505050505f90600190565b919291600160ff1b8401614bd5576118f89350615670565b906118f8935f0391614d81565b919291600160ff1b9190801580614d6f575090614bfe91615409565b9490929091905f868585858282138015614d66575b614d49575b505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614d14575b505081019182821860ff1c1115614d0c57826001600160ff1b0314614cee57905f600192135f14614cbf57600a9004915b01925b81158117614c8357509190565b80614c9c575b508015614c94579190565b505f91508190565b9192614cb29203600160ff1b01600a0a906149ad565b600160ff1b91905f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c73565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c76565b8107614d21575b80614c42565b60ff1d600117015f614d1b565b505050919350614d3c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c18565b50835f12614c13565b15614d7a5750509190565b9350919050565b9392919384158115818117614ed257505090614d9c91615409565b9194908295614dad82958294615409565b8096929491969387868482138015614ec9575b614eb0575b5050505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614e96575b505081019182821860ff1c1115614e8e57826001600160ff1b0314614cee57905f600192135f14614e5f57600a9004915b01925b81158117614e3257509190565b80614e4257508015614c94579190565b600160ff1b93614e599291038401600a0a906149ad565b5f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e22565b509092614e25565b8107614ea3575b80614df1565b60ff1d600117015f614e9d565b929b5098509196509450925090505f8080808080614dc5565b50858412614dc0565b9395939092919015614ee8575050614c94579190565b945092915050565b6008815110614164576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f4e610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b94519301614f5d815186612be9565b614f65575050565b909350611a7391925051925183613c00565b92915f9060018184145f87128715171717614ff1575f92808213614fe3575b03604c81135f821217614fd757600a0a9084614fb583820293846149ad565b14614fca57505015614fc6575f9190565b5f90565b9093509015611a73579190565b505015614fc6575f9190565b5f9560019450925090614f96565b5050505f90565b93929190918083145f83125f87121883158715171717615047575f9280821361503a5703604c81135f821217614fd757600a0a9084614fb583820293846149ad565b9194600193509190614f96565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561509f576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836150b157505090505f90600190565b60ff8116820191808312615179575f8312156150e9575050604c198112614c94575f03600a0a916150e283826140e1565b9283021490565b909293915f81135f1461516f57604d811361514457600a0a9283156140eb57835f1904831161511b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151de576151b591926157ae565b506151bf816141fa565b1591826151cb57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b909392915f61526a9181846145a9565b9490945f84830191820194121590816152b7575b81156152ad575b5061528f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615285565b828112915061527e565b6152d693600160fe1b908101939201906145a9565b9081815f82121561530d575050604b198212612cd7576152fb915f03600a0a906149ad565b9081615305575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615335575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153e4576001600160ff1b0392838311156153ce57600160ff1b9383850361538457505050509190565b9091929350851461539e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c90575f039190565b90916001600160ff1b0380841115612c5857851461539e575050600a60019104920190565b91909180156155ab57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156154b9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8301106154aa575b83136154945791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615488565b6f4b3b4ca85a86c47a098a22400000000080840515615599575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615582575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000083051561556e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561555e5782051561554f575b5f61543d565b9290600a02905f190192615549565b939160640291600119019361551a565b93916402540be4000291600919019361551a565b9391678ac7230489e80000029160121901936154f5565b6025198301955092909202915f6154d3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615633571461562b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561566b575f036157e8565b6157e8565b909291600160ff1b9182810161570257508084146156f8578084139182156156f0578185035b604c8111156156df5750505f915b156156d057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140eb5704916156a4565b848203615696565b505090505f905f90565b9361570f92945f03614be2565b80939180928114615723575b50505f039190565b915092506001600160ff1b038314614cee57600a600191059201915f8061571b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615783575b61576b5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615764565b81519190604183036157de576157d79250602082015190606060408401519301515f1a90615877565b9192909190565b50505f9160029190565b90637ffffff581131561587157637ffffffe198101906043821361586a575f82121561583e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140eb577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158ee579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158e457905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b9261015761308d565b612551565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b919061027861308d565b60405192610285846119d4565b5f84523691611dfb565b90613581565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612535565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b3061435b565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f92919261308d565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6142f1565b614346565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b606082015260648401356080820152610571816130cf565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550613100565b8190838080808080610587565b6106486104af848b612121565b610651816150e2565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461308d565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184613190565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613aca565b6109de816130cf565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613b3c565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af1606082015160446004350135906131b3565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151613190565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613dcb565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b61479b565b90614956565b9d8e9260408d0151613e96565b60408c0152613ec0565b99613ec0565b98610c5a8484613eea565b610c648482613f48565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c015261405a565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b61479b565b60408a0151610dd98183613dcb565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613e96565b610e129085613df2565b610dfb565b905091610de1565b50610e2d6060820151613da8565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613dcb565b61101b5750508490610ed7856001600160a01b0360208701511633613a61565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f1692935116336131da565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614233565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151613190565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f61308d565b61111a84863361315c565b61112383613190565b1561126857611133848633613794565b61113d8185613dcb565b15611262575082935b61115285828833613a03565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613a61565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612519565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff91606435838111610182573660238201121561018257806004013593841161018257366024858301011161018257611351956020921693611313868587613924565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a4576113999350309161399d565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b60443591613794565b604051908152f35b3461018257611436366118b0565b8394939261144261308d565b61144d84863361315c565b61145681613190565b1561155c578061146a6114b99287336131da565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613280565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612519565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e61308d565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b6130cf565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1613100565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b9061218161163761217a8480611f4f565b3690611b81565b5f5260205f81526040926001845f20540361250e57916124039161220885855f6123886121b1836121c89a611f4f565b6121cd878501359182878701359c8d923690611b81565b613aca565b6121e56121da8580611f4f565b946060810190611ead565b96906122008751966121f6886119d4565b8688523690611b81565b973691611c14565b90612211613aff565b50612338865191612221836119b8565b600683526122308a8401612519565b8861223a816130cf565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261226d86611faa565b5261227785611faa565b50805161228381611950565b6002815281368e83013761229686611fb7565b526122a085611fb7565b50810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b51511661473f565b975116906122d4898851612007565b515116846122e38a8951612007565b51015191613794565b958d6122f9828751612007565b5151169451612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61234182611fc7565b5261234b81611fc7565b5061236f8b886060810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b61237882611fd7565b5261238281611fd7565b5061450d565b918385511693868601918b83519289818551169401511693878652308a528180872091510151908251926123bb846119d4565b87845251956123c9876119b8565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301613488565b03915afa95865f915f986124e8575b506124215788513d5f823e3d90fd5b95938651600281106124d15750888798998260c0979899015199015161244f61244985611fe7565b51611fd7565b5161245a8183613dcb565b156124c75750998a925b6124868b85919060405192600284526020840152604083015260608201604052565b61248f86611fc7565b5261249985611fc7565b508251966124a6886119b8565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612464565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061250791503d805f833e6124ff81836119f0565b810190613344565b965f612412565b505f92508291829150565b5f5b60c08110612527575050565b60608282015260200161251b565b5f5b82811061254357505050565b606082820152602001612537565b926001600160a01b038451166001600160a01b038351161461307b576001600160a01b03612586606086015160643590612007565b5151166001600160a01b036125a2604085015160843590612007565b5151161480159061303b575b610e32576001600160a01b036125cb604086015160443590612007565b5151166001600160a01b036125e66064356060880151612007565b51511614613029576125f7846130cf565b805f525f60205260405f205415612fd95750612612826130cf565b805f525f60205260405f205415612f895750612928907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061267561266761012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16128956001600160a01b0384511691604051926126c5846119d4565b5f84526126d0613aff565b50604051906126de826119b8565b600682526126ee60208301612519565b6126f7896130cf565b906001600160a01b038a5116604051926004845260208401526040830152606082015233608082015260a0810160405261273082611faa565b5261273a81611faa565b5060405161274781611950565b60028152604036602083013761275c82611fb7565b5261276681611fb7565b506127f46127856001600160a01b036122bd60443560408d0151612007565b6127c26001600160a01b038b51168b60206122e36001600160a01b036127b16044356040860151612007565b515116926040604435910151612007565b908a60ff60206123036001600160a01b036127e36044356040870151612007565b515116936040604435910151612007565b6127fd82611fc7565b5261280781611fc7565b5061236f6128266001600160a01b036122bd60643560608d0151612007565b6128636001600160a01b038b51168b60206122e36001600160a01b036128526064356060860151612007565b515116926060606435910151612007565b908a60ff60206123036001600160a01b036128846064356060870151612007565b515116936060606435910151612007565b905f6001600160a01b038751169160208801908151906001600160a01b03602081845116930151169285855230602052604080862091510151604051916128db836119d4565b868352604051956128eb876119b8565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b835260048301613488565b03915afa92835f915f95612f6b575b50612947576040513d5f823e3d90fd5b9291835160028110612f2d57506040602085015194015161296a61244983611fe7565b516129758183613dcb565b15612f635750935b61299f8186919060405192600284526020840152604083015260608201604052565b6129a883611fc7565b526129b282611fc7565b50604051946129c0866119b8565b888652606435602087015260408601526060850152608084015260a083015260c0820152612bc86001600160a01b038551169360405194612a00866119d4565b5f8652612a0b613aff565b5060405190612a19826119b8565b60068252612a2960208301612519565b612a32866130cf565b906001600160a01b03875116604051926004845260208401526040830152606082015233608082015260a08101604052612a6b82611faa565b52612a7581611faa565b50604051612a8281611950565b600281526040366020830137612a9782611fb7565b52612aa181611fb7565b50612b2b612ac06001600160a01b036122bd60843560408a0151612007565b612afb6001600160a01b038851166001600160a01b03612ae660843560408c0151612007565b51511660206122e360843560408d0151612007565b906001600160a01b03612b1460843560408b0151612007565b51511660ff602061230360843560408d0151612007565b612b3482611fc7565b52612b3e81611fc7565b5061236f612b5d6001600160a01b036122bd60a43560608a0151612007565b612b986001600160a01b038851166001600160a01b03612b8360a43560608c0151612007565b51511660206122e360a43560608d0151612007565b906001600160a01b03612bb160a43560608b0151612007565b51511660ff602061230360a43560608d0151612007565b92612c5e5f6001600160a01b038551169260208601908151906001600160a01b0360208184511693015116928685523060205260408086209151015160405191612c11836119d4565b86835260405195612c21876119b8565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93612f45575b50612c7d576040513d5f823e3d90fd5b90815160028110612f2d575060406020830151920151612c9f61244988611fe7565b51612caa8183613dcb565b15612f255750925b612cd48385919060405192600284526020840152604083015260608201604052565b612cdd88611fc7565b52612ce787611fc7565b5060405196612cf5886119b8565b86885260a43560208901526040880194855260608801938452608088015260a087015260c0860152612d2a6040840151613190565b15918215612f11575b508115612efc575b8115612eeb575b50612ed95760405191612d5483611988565b5f83525f60208401525f60408401525f6060840152612d738483615106565b84526040840152612d99612d878386615106565b60208601528060608601528451613e96565b94612dad6020850151604086015190613e96565b93612db787613da8565b8015612eca575b612eb857612e7f612eb1957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d94612e61612eb69a60a096612e008a8851613eea565b612e0e8c6020890151613eea565b612e1c8a6040890151613f48565b612e2a8c6060890151613f48565b612e338a614233565b612e3c8c614233565b6001600160a01b03612e5860c435926060606435910151612007565b51511633613280565b50506001600160a01b03612e5860e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161405a565b61405a565b565b604051630d86822160e01b8152600490fd5b50612ed485613da8565b612dbe565b6040516321badf1f60e01b8152600490fd5b612ef6915051613da8565b5f612d42565b9050612f0b6060830151613da8565b90612d3b565b612f1d91925051613190565b15905f612d33565b905092612cb2565b60249060405190630fbb8e5560e21b82526004820152fd5b909250612f5c91503d805f833e6124ff81836119f0565b915f612c6d565b90509361297d565b909450612f8291503d805f833e6124ff81836119f0565b935f612937565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612fd4565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03613055606084015160a43590612007565b5151166001600160a01b03613071604087015160443590612007565b51511614156125ae565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146130bd5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516130fa816130ec602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b612eb6929161312b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193613139856119b8565b6006855261314960208601612519565b61315285611faa565b5261124d84611faa565b909115613167575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6131af905f60e01d906001600160e01b038160e01d9116601b0b615169565b1290565b906131af916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b9291926131e68261442e565b936131f081613da8565b61326e5784816001600160e01b0361320f9360e01d9116601b0b615269565b9290809315613245575b50829081613229575b5050509190565b61323d926001600160a01b0330921661399d565b5f8181613222565b9092505f19811461325a57600101915f613219565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361328d83613da8565b61332b57846132a9576132a1939450613a61565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613ec0565b956132f087613da8565b613313575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261337f82611ad4565b9161338d60405193846119f0565b808352848084019160051b830101918683116101825785809101915b83831061341c5750505050948281015191821161018257019180601f840112156101825782516133d881611ad4565b936133e660405195866119f0565b818552838086019260051b820101928311610182578301905b82821061340d575050505090565b815181529083019083016133ff565b82518152918101918691016133a9565b90808251908181526020809101926020808460051b8301019501935f915b84831061345a5750505050505090565b9091929394958480613478600193601f198682030187528a516120ee565b980193019301919493929061344a565b91906020928381526001600160a01b03825116848201528382015160408201526134c2604083015160e060608401526101008301906118fc565b90606083015160808201526134e9608084015192601f1993848483030160a085015261342c565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061352c57505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101613508565b90604082019082526020606081936040838201528551809452019301915f5b82811061356d575050505090565b83518552938101939281019260010161355f565b919091604092835192613593846119b8565b600684526020946135a5868601612519565b5f5b84518110156135da57806135bd60019287612007565b516135c88289612007565b526135d38188612007565b50016135a7565b50925092939093335f52308252825f20918351956135f78761196c565b6135ff611ee3565b875260608281980152845190613614826119d4565b5f8252855190613623826119d4565b5f82525f3681375f5b8151811015613788578986886136428486612007565b51888151948d80870151908151613664575b505050505050505060010161362c565b905f92916001600160a01b03966136898887818d51169c01511699878901519061450d565b958251996136968b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b825281806136d1600498898301613488565b03915afa93841561377e579089915f95613760575b5084516136fc575b50899250808e8c938e613654565b5101511691823b156101825761372a925f92838d5180968195829463012c676d60e21b845233908401613540565b03925af18015613756579060019291613747575b819287826136ee565b613750906119a4565b5f61373e565b89513d5f823e3d90fd5b6137759195503d805f833e6124ff81836119f0565b9050935f6136e6565b8c513d5f823e3d90fd5b50505050505050509050565b82156137c9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506137d58261473f565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156138eb575f976138f5575b508361382c6138258361385c9a61541e565b5090614ba9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156138eb575f976138ba575b5061382561388091611a739861541e565b5061388b8183613dcb565b156138b25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ec0565b905093613893565b96508387813d83116138e4575b6138d181836119f0565b810103126101825795519561382561386f565b503d6138c7565b85513d5f823e3d90fd5b96508387813d831161391d575b61390c81836119f0565b810103126101825795519583613813565b503d613902565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561397e575b836040521561396857505050565b635274afe760e01b835216600482015260249150fd5b600181151661399457813b15153d15161661395a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156139ed575b836040525f6060521561396857505050565b600181151661399457813b15153d1516166139db565b93929193613a1083613da8565b61332b5784613a24576132a19394506131da565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613e96565b90929192613a6e8161442e565b93613a7881613da8565b613ab85784816001600160e01b03613a979360e01d9116601b0b615269565b50809281613aa6575050509190565b6001600160a01b0361323d9316613924565b604051632d1671a360e11b8152600490fd5b91613af5906060613aea936001600160a01b039485916040880151612007565b515116940151612007565b5151161461302957565b60405190613b0c826119b8565b606060c083613b19611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613b4b613aff565b50604092613c39845191613b5e836119b8565b60068352602092613b70848201612519565b613c03613b7c8a6130cf565b966001600160a01b0397888c51168a519160038352888301528a820152886060981688820152608081018a52613bb184611faa565b52613bbb83611faa565b508851613bc781611950565b60028152893688830137613bda84611fb7565b52613be483611fb7565b508a89810160ff886123036122ec8d806122c5816122bd8b8a51612007565b613c0c82611fc7565b52613c1681611fc7565b5061236f8a8a87810160ff886123036122ec8d806122c5816122bd8b8a51612007565b93613cb95f8589511697859685879b0191825191878184511693015116928b85523088528680862091510151875191613c71836119d4565b868352885195613c80876119b8565b8652898601528785015284898501528a608085015260a084015260c08301528451808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93613d8a575b50613d7e575b5050600284511097881598613d6c578183860151950151613cf161244988611fe7565b51613cfc8183613dcb565b15613d645750925b613d268685919060405192600284526020840152604083015260608201604052565b613d2f88611fc7565b52613d3987611fc7565b5082519b613d468d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613d04565b50505050505050509150611a73613aff565b90975093505f80613cce565b909250613da191503d805f833e6124ff81836119f0565b915f613cc8565b613dc7905f60e01d906001600160e01b038160e01d9116601b0b615169565b1390565b90613dc7916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b613e196001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614960565b90637ffffff58213613e69575b90613e3091614ba9565b9290921580613e61575b613e4357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613e3a565b613e738282615849565b15613e2657604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614daf565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614f73565b613f44916080810182613f06613f008351611fe7565b51611fe7565b52613f3d613f376001600160a01b03809451511693613f2e613f288551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613a03565b5050565b90608081019180613f5c613f008551611fd7565b526001600160a01b03809251511691613f78613f288551611fd7565b5116613f87613f378551611fd7565b51908161402257613f9783613da8565b61332b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd4955f5260209060018252613fed604094855f20835f528452855f20855f528452855f2054613ec0565b945f5260018252835f20905f528152825f20915f52525f20555b5160405191829133835260406020840152604083019061342c565b91614053917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd495613280565b5050614007565b60c0810151908151915f926141ce575b5061410f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916140b7836119d4565b8683528c51936140c6856119d4565b8785528d51966140d5886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301613488565b03915afa9485156141c45787956141a6575b508451614132575b50505050505050565b81905101510151169051813b156141a257918491849383614167965180978195829463012c676d60e21b845260048401613540565b03925af19081156141995750614182575b8080808080614129565b61418c82916119a4565b6141965780614178565b80fd5b513d84823e3d90fd5b8480fd5b6141bb9195503d8089833e6124ff81836119f0565b9050935f614121565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257614211925f928360405180968195829463012c676d60e21b845260048401613540565b03925af1801561022c571561406a5761422b9192506119a4565b5f905f61406a565b60808101614244613f378251611fd7565b5191821561425157505050565b61426b613f286001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166142a6575b505050505050565b6142ca955f9284845260018152828420868552815282842091845252812055613a61565b5f80808061429e565b81156142dd570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614339576020810151908051603f19810190811161325a5760051c82116143255760016020920160051b010190565b5050604051614333816119d4565b5f815290565b50604051614333816119d4565b80511561435657602001515f1a90565b505f90565b905f8091602081519101845af480806143d9575b1561438f5750506040513d81523d5f602083013e60203d82010160405290565b156143b657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156143c7576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061436f5750813b151561436f565b600411156143f657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261442a836143ec565b0152565b614436615937565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614504575f925f946144cf575b5061448c836143ec565b6001831415806144bd575b6144a15750505090565b5163ee07877f60e01b81529182916106df91906004840161440a565b506144c7836143ec565b821515614497565b908094506144f39293503d85116144fd575b6144eb81836119f0565b81019061523f565b919091925f614482565b503d6144e1565b513d5f823e3d90fd5b9080519161451a83611ad4565b9161453560409461452d865195866119f0565b808552611ad4565b601f19946020918601368684013783518351909590801561473457600161458b9101965b600197889101019761458261456d8a611ad4565b9961457a86519b8c6119f0565b808b52611ad4565b01848901612535565b85805f96845160028152338782015230868201526060810186526145ae8b611faa565b526145b88a611faa565b505f925b6146f0575b50505083516145d4575b50505050505090565b858095989796929801816145e88289612007565b526145f38188612007565b505f925b614606575b50859697506145cb565b84518310156146eb576001600160a01b0361467d816146258689612007565b51511686614633878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614674888b612007565b51015191615395565b156146d357868098999a928192614694878a612007565b5151166146a18787612007565b520193856146af8289612007565b5101516146bc868c612007565b526146c7858b612007565b500192909897966145f7565b8951630a57f30960e31b815260048101859052602490fd5b6145fc565b909196815188101561472b57828091019761470b8184612007565b516147168a8d612007565b52614721898c612007565b50019190816145bc565b968291506145c1565b5061458b5f96614559565b614747615937565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614504575f925f946144cf575061448c836143ec565b9091939284158215175f146147b55750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6148ec575b50506147d88161550e565b936147e28161550e565b946147ed868261552e565b909182156148dd575f9083986f0785ee10d5da46d900f436a0000000008086116148cf575b50670de0b6b3a7640000808b116148c0575b50633b9aca00808b116148b1575b50612710808b116148a3575b5098805b614892575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615541565b60019290920191600a900480614842565b60049a04998a93019261483e565b600991939a049901915f614832565b601291939a049901915f614824565b85049950602592505f614812565b509290506118f8949550615541565b5f82121561494057808413614932575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156147cd579092506118f893949161544c565b9092506118f89394916154b3565b808412156148fc579092506118f893949161544c565b613e308282614ba9565b92909180614986576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461499b57505050505f905f90565b6149b4936149a8916155fb565b929194909384926155fb565b90939192846149c28861550e565b916149cc8661550e565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614b73575b030191600160ff1b98838a018112155f14614b40575050035b5f955f821280614b37575b614b19575b5f811280614b07575b614ae95786820103966001600160ff1b0388149081614adf575b5080614ad6575b80614acd575b614aaf575090614a6392916157a7565b915f8113614a76575b506118f893615541565b9091604c8213614aa457614a8d91600a0a906142d3565b908115614a9a575f614a6c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614a53565b50828414614a4d565b905088145f614a46565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614a2c565b9550808701861315614b315786818703015b95614a23565b5f614b2b565b505f8113614a1e565b89985090920390506001600160ff1b0381900387018213614b645701860194614a13565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506149fa565b81156142dd570590565b8082601b82810b8314614d9e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614d4a575b8380820b03614d3957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614cea575b838060030b03614c6e575b808413614c525750506001600160e01b036001925b60e01b91161791565b8303600a0a80156142dd576001600160e01b0391071592614c49565b92915f841315614cbe575090614c848383615849565b614ca057637ffffffe1901600a0a810290637fffffff92614c34565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614aa457614cdd91600a0a90614b9f565b918215614a9a5792614c34565b5f198401808060030b14614cfe5750614c29565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614bdc565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614d8b576305f5e100600894058094819201955b915050614bdc565b620186a060059405809481920195614d83565b5082614c2957505050505f90600190565b919291600160ff1b8401614dc7576118f89350615862565b906118f8935f0391614f73565b919291600160ff1b9190801580614f61575090614df0916155fb565b9490929091905f868585858282138015614f58575b614f3b575b505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084614f06575b505081019182821860ff1c1115614efe57826001600160ff1b0314614ee057905f600192135f14614eb157600a9004915b01925b81158117614e7557509190565b80614e8e575b508015614e86579190565b505f91508190565b9192614ea49203600160ff1b01600a0a90614b9f565b600160ff1b91905f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e65565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614e68565b8107614f13575b80614e34565b60ff1d600117015f614f0d565b505050919350614f2e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614e0a565b50835f12614e05565b15614f6c5750509190565b9350919050565b93929193841581158181176150c457505090614f8e916155fb565b9194908295614f9f829582946155fb565b80969294919693878684821380156150bb575b6150a2575b5050505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084615088575b505081019182821860ff1c111561508057826001600160ff1b0314614ee057905f600192135f1461505157600a9004915b01925b8115811761502457509190565b8061503457508015614e86579190565b600160ff1b9361504b9291038401600a0a90614b9f565b5f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615014565b509092615017565b8107615095575b80614fe3565b60ff1d600117015f61508f565b929b5098509196509450925090505f8080808080614fb7565b50858412614fb2565b93959390929190156150da575050614e86579190565b945092915050565b6008815110614356576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040615140610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61479b565b9451930161514f8151866131b3565b615157575050565b909350611a7391925051925183613df2565b92915f9060018184145f871287151717176151e3575f928082136151d5575b03604c81135f8212176151c957600a0a90846151a78382029384614b9f565b146151bc575050156151b8575f9190565b5f90565b9093509015611a73579190565b5050156151b8575f9190565b5f9560019450925090615188565b5050505f90565b93929190918083145f83125f87121883158715171717615239575f9280821361522c5703604c81135f8212176151c957600a0a90846151a78382029384614b9f565b9194600193509190615188565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615291576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836152a357505090505f90600190565b60ff811682019180831261536b575f8312156152db575050604c198112614e86575f03600a0a916152d483826142d3565b9283021490565b909293915f81135f1461536157604d811361533657600a0a9283156142dd57835f1904831161530d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6153d0576153a791926159a0565b506153b1816143ec565b1591826153bd57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461544457600a6001818404940192061590565b909190600190565b909392915f61545c91818461479b565b9490945f84830191820194121590816154a9575b811561549f575b5061548157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615477565b8281129150615470565b6154c893600160fe1b9081019392019061479b565b9081815f8212156154ff575050604b1982126132a1576154ed915f03600a0a90614b9f565b90816154f7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615527575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156155d6576001600160ff1b0392838311156155c057600160ff1b9383850361557657505050509190565b90919293508514615590575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461325a575f039190565b90916001600160ff1b0380841115613222578514615590575050600a60019104920190565b919091801561579d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156156ab575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061569c575b83136156865791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f19019261567a565b6f4b3b4ca85a86c47a098a2240000000008084051561578b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615774575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615760575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561575057820515615741575b5f61562f565b9290600a02905f19019261573b565b939160640291600119019361570c565b93916402540be4000291600919019361570c565b9391678ac7230489e80000029160121901936156e7565b6025198301955092909202915f6156c5565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615825571461581d579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561585d575f036159da565b6159da565b909291600160ff1b918281016158f457508084146158ea578084139182156158e2578185035b604c8111156158d15750505f915b156158c257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156142dd570491615896565b848203615888565b505090505f905f90565b9361590192945f03614dd4565b80939180928114615915575b50505f039190565b915092506001600160ff1b038314614ee057600a600191059201915f8061590d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615975575b61595d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615956565b81519190604183036159d0576159c99250602082015190606060408401519301515f1a90615a69565b9192909190565b50505f9160029190565b90637ffffff5811315615a6357637ffffffe1981019060438213615a5c575f821215615a3057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156142dd577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615ae0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b03811615615ad657905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index 390662a316..de28113c1f 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xabceaad67b2bfb22234dced976036095d341129762d317512657852774711ece); +bytes32 constant BYTECODE_HASH = bytes32(0xbb26d1e20a8360e1508cbc0938a2ed1ad7af70827261928c041de84987ca731e); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xf3C78908B3F407a6BaE961Cb98A190717f53EDF2); +address constant DEPLOYED_ADDRESS = address(0x828539a2C3790E7602786168D0741D3c67B413E1); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506127168061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd5565b60405161009d939291906124fd565b6040517fa18bcfb6026768fff923ba3f6d2ab7c37c7a6ab3f226e540ca92278af8d56f2c815260200161009d565b61011e610119366004612453565b610d19565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d51565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b6123c78152602001906001900390816102625790505090506116ee815f8151811061028f5761028f612581565b60200260200101906001600160401b031690816001600160401b03168152505061170b816001815181106102c5576102c5612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c78152602001906001900390816102f557905050905061171a815f8151811061032257610322612581565b60200260200101906001600160401b031690816001600160401b0316815250506117298160018151811061035857610358612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160028151811061038e5761038e612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103be579050509050611748815f815181106103eb576103eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042157610421612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610451579050509050611767815f8151811061047e5761047e612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b4576104b4612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104ea576104ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061052057610520612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055657610556612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105865790505090506117b5815f815181106105b3576105b3612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e9576105e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061f5761061f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065557610655612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068b5761068b612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106ba579050509050611803815f815181106106e7576106e7612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071657905050905061181c815f8151811061074357610743612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077657610776612581565b6020026020010181905250858860018151811061079557610795612581565b602002602001018190525084886002815181106107b4576107b4612581565b602002602001018190525083886003815181106107d3576107d3612581565b602002602001018190525082886004815181106107f2576107f2612581565b6020908102919091010152818861080b6006600161256e565b8151811061081b5761081b612581565b602090810291909101015280886108346006600161256e565b61083f90600161256e565b8151811061084f5761084f612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610871579050509050611868815f8151811061089e5761089e612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d4576108d4612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090a5761090a612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061094057610940612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097657610976612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ac576109ac612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109e0576109e0612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a035790505090506118c6815f81518110610a3057610a30612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6657610a66612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9c57610a9c612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad257610ad2612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0857610b08612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3e57610b3e612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7457610b74612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba857610ba8612581565b602090810291909101015289610bc5610bc082611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf587610be86119d8565b610bf06119f8565b611a18565b9250925092505f610c0b82610220015160200190565b90505f8261022001515182610c20919061256e565b90505f610c3e83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5786610240015184611ba5565b915091508115610cec575f610c6c8783611c7c565b90506123c75f610c7a611cab565b90505f60028251610c8b91906125a9565b9050808510610cbc576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd58c8c8686565b9e509e509e50505050505050505050505050610d12565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d41866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d606006600161256e565b610d6b90600161256e565b610d7690600161256e565b6001600160401b03811115610d8d57610d8d61243f565b604051908082528060200260200182016040528015610dc057816020015b6060815260200190600190039081610dab5790505b50604080516002808252606082019092529192505f9190816020015b6123c7815260200190600190039081610ddc579050509050611ccb815f81518110610e0957610e09612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e3f57610e3f612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c7815260200190600190039081610e6f579050509050611ccb815f81518110610e9c57610e9c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610ed257610ed2612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610f0857610f08612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f38579050509050611ccb815f81518110610f6557610f65612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9b57610f9b612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fcb579050509050611ccb815f81518110610ff857610ff8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102e5761102e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106457611064612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109a5761109a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110d0576110d0612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081611100579050509050611ccb815f8151811061112d5761112d612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116357611163612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119957611199612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cf576111cf612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120557611205612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611234579050509050611cf4815f8151811061126157611261612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611290579050509050611d90815f815181106112bd576112bd612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112f0576112f0612581565b6020026020010181905250858860018151811061130f5761130f612581565b6020026020010181905250848860028151811061132e5761132e612581565b6020026020010181905250838860038151811061134d5761134d612581565b6020026020010181905250828860048151811061136c5761136c612581565b602090810291909101015281886113856006600161256e565b8151811061139557611395612581565b602090810291909101015280886113ae6006600161256e565b6113b990600161256e565b815181106113c9576113c9612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113eb579050509050611ccb815f8151811061141857611418612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144e5761144e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148457611484612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114ba576114ba612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114f0576114f0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152657611526612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155a5761155a612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157d579050509050611ccb815f815181106115aa576115aa612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115e0576115e0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161657611616612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164c5761164c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168257611682612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b8576116b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7457610b74612581565b5f6060806116fc5f80611e48565b92509250925093509350939050565b5f6060806116fc5f6001611e48565b5f6060806116fc60015f611e48565b5f6060806116fc600180611e48565b5f6060806116fc60016002611e48565b5f6060806116fc60025f611e48565b5f6060806116fc60026001611e48565b5f6060806116fc60035f611e48565b5f6060806116fc60036001611e48565b5f6060806116fc60036002611e48565b5f6060806116fc600380611e48565b5f6060806116fc60036004611e48565b5f6060806116fc60045f611e48565b5f6060806116fc60046001611e48565b5f6060806116fc60046002611e48565b5f6060806116fc60046003611e48565b5f6060806116fc600480611e48565b5f6060806116fc6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fc600580611e48565b5f6060806116fc60055f611e48565b5f6060806116fc60056001611e48565b5f6060806116fc60056002611e48565b5f6060806116fc60056003611e48565b5f6060806116fc60056004611e48565b5f6060806116fc600680611e48565b5f6060806116fc60065f611e48565b5f6060806116fc60066001611e48565b5f6060806116fc60066002611e48565b5f6060806116fc60066003611e48565b5f6060806116fc60066004611e48565b5f6060806116fc60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b60606040518060600160405280604081526020016125f460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb39160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b606060405180606001604052806040815260200161263460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb3565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb3565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb3565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d9016ee170b171a1729173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb02e0f14716565589"; + hex"6080604052348015600e575f80fd5b5061279a8061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c36600461244d565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124a9565b6100ce6100c93660046124cf565b610c0b565b60405161009d93929190612579565b6040517f8336a7fad53960ed41ca79692ce772de758261a38ddecfa23983c3b89d00aaba815260200161009d565b61011e6101193660046124cf565b610d4f565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d87565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600660016125ea565b6101f19060016125ea565b6101fc9060016125ea565b6001600160401b03811115610213576102136124bb565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61244381526020019060019003908161026257905050905061175a815f8151811061028f5761028f6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611777816001815181106102c5576102c56125fd565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6124438152602001906001900390816102f5579050509050611786815f81518110610322576103226125fd565b60200260200101906001600160401b031690816001600160401b03168152505061179581600181518110610358576103586125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117a48160028151811061038e5761038e6125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117b4816003815181106103c4576103c46125fd565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124438152602001906001900390816103f45790505090506117c4815f81518110610421576104216125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117d381600181518110610457576104576125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124438152602001906001900390816104875790505090506117e3815f815181106104b4576104b46125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117f2816001815181106104ea576104ea6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061180281600281518110610520576105206125fd565b60200260200101906001600160401b031690816001600160401b03168152505061181281600381518110610556576105566125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118218160048151811061058c5761058c6125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124438152602001906001900390816105bc579050509050611831815f815181106105e9576105e96125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118408160018151811061061f5761061f6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061185081600281518110610655576106556125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118608160038151811061068b5761068b6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611870816004815181106106c1576106c16125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816106f057905050905061187f815f8151811061071d5761071d6125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61244381526020019060019003908161074c579050509050611898815f81518110610779576107796125fd565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107ac576107ac6125fd565b602002602001018190525085886001815181106107cb576107cb6125fd565b602002602001018190525084886002815181106107ea576107ea6125fd565b60200260200101819052508388600381518110610809576108096125fd565b60200260200101819052508288600481518110610828576108286125fd565b60209081029190910101528188610841600660016125ea565b81518110610851576108516125fd565b6020908102919091010152808861086a600660016125ea565b6108759060016125ea565b81518110610885576108856125fd565b602090810291909101015260408051600680825260e082019092525f91816020015b6124438152602001906001900390816108a75790505090506118e4815f815181106108d4576108d46125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118f38160018151811061090a5761090a6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061190281600281518110610940576109406125fd565b60200260200101906001600160401b031690816001600160401b03168152505061191281600381518110610976576109766125fd565b60200260200101906001600160401b031690816001600160401b031681525050611922816004815181106109ac576109ac6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611932816005815181106109e2576109e26125fd565b60200260200101906001600160401b031690816001600160401b0316815250508089600581518110610a1657610a166125fd565b602090810291909101015260408051600780825261010082019092525f91816020015b612443815260200190600190039081610a39579050509050611942815f81518110610a6657610a666125fd565b60200260200101906001600160401b031690816001600160401b03168152505061195181600181518110610a9c57610a9c6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061196081600281518110610ad257610ad26125fd565b60200260200101906001600160401b031690816001600160401b03168152505061197081600381518110610b0857610b086125fd565b60200260200101906001600160401b031690816001600160401b03168152505061198081600481518110610b3e57610b3e6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061199081600581518110610b7457610b746125fd565b60200260200101906001600160401b031690816001600160401b0316815250506119a081600681518110610baa57610baa6125fd565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610bde57610bde6125fd565b602090810291909101015289610bfb610bf6826119b0565b6119c5565b9b50505050505050505050505090565b5f6060805f805f610c2b87610c1e611a54565b610c26611a74565b611a94565b9250925092505f610c4182610220015160200190565b90505f8261022001515182610c5691906125ea565b90505f610c7483836f07fffffe0000000003ff200000000000611b85565b80925081945050505f80610c8d86610240015184611c21565b915091508115610d22575f610ca28783611cf8565b90506124435f610cb0611d27565b90505f60028251610cc19190612625565b9050808510610cf2576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d0b8c8c8686565b9e509e509e50505050505050505050505050610d48565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d77866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d96600660016125ea565b610da19060016125ea565b610dac9060016125ea565b6001600160401b03811115610dc357610dc36124bb565b604051908082528060200260200182016040528015610df657816020015b6060815260200190600190039081610de15790505b50604080516002808252606082019092529192505f9190816020015b612443815260200190600190039081610e12579050509050611d47815f81518110610e3f57610e3f6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110610e7557610e756125fd565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612443815260200190600190039081610ea5579050509050611d47815f81518110610ed257610ed26125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110610f0857610f086125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110610f3e57610f3e6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110610f7457610f746125fd565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612443815260200190600190039081610fa4579050509050611d47815f81518110610fd157610fd16125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110611007576110076125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612443815260200190600190039081611037579050509050611d47815f81518110611064576110646125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160018151811061109a5761109a6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816002815181106110d0576110d06125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110611106576111066125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160048151811061113c5761113c6125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61244381526020019060019003908161116c579050509050611d47815f81518110611199576111996125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816001815181106111cf576111cf6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110611205576112056125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160038151811061123b5761123b6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600481518110611271576112716125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816112a0579050509050611d70815f815181106112cd576112cd6125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816112fc579050509050611e0c815f81518110611329576113296125fd565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061135c5761135c6125fd565b6020026020010181905250858860018151811061137b5761137b6125fd565b6020026020010181905250848860028151811061139a5761139a6125fd565b602002602001018190525083886003815181106113b9576113b96125fd565b602002602001018190525082886004815181106113d8576113d86125fd565b602090810291909101015281886113f1600660016125ea565b81518110611401576114016125fd565b6020908102919091010152808861141a600660016125ea565b6114259060016125ea565b81518110611435576114356125fd565b602090810291909101015260408051600680825260e082019092525f91816020015b612443815260200190600190039081611457579050509050611d47815f81518110611484576114846125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816001815181106114ba576114ba6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816002815181106114f0576114f06125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110611526576115266125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160048151811061155c5761155c6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600581518110611592576115926125fd565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115c6576115c66125fd565b602090810291909101015260408051600780825261010082019092525f91816020015b6124438152602001906001900390816115e9579050509050611d47815f81518110611616576116166125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160018151811061164c5761164c6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110611682576116826125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816003815181106116b8576116b86125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816004815181106116ee576116ee6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600581518110611724576117246125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600681518110610baa57610baa6125fd565b5f6060806117685f80611ec4565b92509250925093509350939050565b5f6060806117685f6001611ec4565b5f60608061176860015f611ec4565b5f606080611768600180611ec4565b5f60608061176860016002611ec4565b5f60608061176860016003611ec4565b5f60608061176860025f611ec4565b5f60608061176860026001611ec4565b5f60608061176860035f611ec4565b5f60608061176860036001611ec4565b5f60608061176860036002611ec4565b5f606080611768600380611ec4565b5f60608061176860036004611ec4565b5f60608061176860045f611ec4565b5f60608061176860046001611ec4565b5f60608061176860046002611ec4565b5f60608061176860046003611ec4565b5f606080611768600480611ec4565b5f606080611768611892600660016125ea565b85611ec4565b5f60608060ff80851690600886901c166118d3826118b8600660016125ea565b6118c39060016125ea565b6118cd91906125ea565b82611ec4565b945094509450505093509350939050565b5f606080611768600580611ec4565b5f60608061176860055f611ec4565b5f60608061176860056001611ec4565b5f60608061176860056002611ec4565b5f60608061176860056003611ec4565b5f60608061176860056004611ec4565b5f606080611768600680611ec4565b5f60608061176860065f611ec4565b5f60608061176860066001611ec4565b5f60608061176860066002611ec4565b5f60608061176860066003611ec4565b5f60608061176860066004611ec4565b5f60608061176860066005611ec4565b6060815f6119bd82611f46565b949350505050565b60605f82516002026001600160401b038111156119e4576119e46124bb565b6040519080825280601f01601f191660200182016040528015611a0e576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a4857805183518616908516178152602090920191600201611a26565b50939695505050505050565b60606040518060e0016040528060a681526020016126b260a69139905090565b606060405180608001604052806042815260200161275860429139905090565b5f80611b236040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611b6f87878760405180602001604052805f815250611fb4565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b9c5780611b9f565b60205b915050875192505b8519600184841a1b16158183101615611bc557600182019150611ba7565b9681019660208290036008810293841c90931b92611c105760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ce9916004016124a9565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611ce65760018301516021909301805190935f90819060ff168180611c6b838e612165565b915091508186165f03611c8d575f809b509b5050505050505050505050611cf1565b5f87611c9d600185038916612190565b016004028b015195505062ffffff9081169350841683039150611cd19050575060019750601c1a9550611cf1945050505050565b611cda83612190565b84019350505050611c42565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d1e9083565b95945050505050565b606060405180608001604052806042815260200161267060429139905090565b5f81515f14611d69576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611dcd575060208101516001600160e01b038116601b0b60e082901d5f611d9e838383612249565b905061ffff811115611dc357604051631e4e01d760e21b815260040160405180910390fd5b9250611e07915050565b81515f03611dee57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ea157602082015160408301516001600160e01b038216601b0b60e083901d5f611e3e838383612249565b6001600160e01b038516601b0b935060e085901d925090505f611e62848483612249565b905060ff821180611e73575060ff81115b15611e9157604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e079350505050565b600282511015611dee57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611ed7575060ff84115b15611eff57604051639b0f326160e01b81526004810186905260248101859052604401610ce9565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f528361228b565b90505f611f60826020612644565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fa857602083515102806020855101835e6020939093019201611f85565b50919695505050505050565b6120416040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120c6576120c66124bb565b6040519080825280602002602001820160405280156120ef578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d1e565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611cf1575060019250929050565b5f5f1982036121a25750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122578686866122d4565b91509150806122825760405162bc8ecf60e31b81526004810187905260248101869052604401610ce9565b50949350505050565b5f60208201602083510281015b808210156122cd5781515192830192808410156122c157634e487b715f5260116020526024601cfd5b50602082019150612298565b5050919050565b5f805f85121561230157604051634a7d166b60e01b81526004810186905260248101859052604401610ce9565b845f0361231357505f90506001611c19565b8460ff841685018581121561234e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ce9565b5f805f83121561239a57604c19831215612371575f809550955050505050611c19565b825f03600a0a915081848161238857612388612611565b0495505084029091149150611c199050565b5f83131561243357604d8313156123d75760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ce9565b82600a0a9150815f19816123ed576123ed612611565b048411156124215760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ce9565b5091909102925060019150611c199050565b8360019550955050505050611c19565b61244b61265b565b565b5f6020828403121561245d575f80fd5b81356001600160e01b031981168114612474575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f612474602083018461247b565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156124df575f80fd5b81356001600160401b03808211156124f5575f80fd5b818401915084601f830112612508575f80fd5b81358181111561251a5761251a6124bb565b604051601f8201601f19908116603f01168101908382118183101715612542576125426124bb565b8160405282815287602084870101111561255a575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f602060606020840152612595606084018661247b565b8381036040850152845180825260208087019201905f5b818110156125c8578351835292840192918401916001016125ac565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16125d6565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261263f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16125d6565b634e487b7160e01b5f52605160045260245ffdfe175a17771786179517a417b417c417d317e317f21802181218211831184018501860187018e418f3190219121922193219421951196019701980199019a0187f18980101180010a00082000100010480300038412a001810000010020004200004002038038ff54905cc66c61ef3dcab071659220a895f0b15fec9301a02e0920d5bfe561c21609201e959460c19742710844db209bcd3bf1d9893761f1049db12b93430190ae9a00bf82a7806c138f40e28083f0842ef2104d561fd1315a13316716a6118d260cc117b9bfc0fec7ade14cba28900a422961b6b14a520792bdb02e0f147175655891d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d701e0c"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd5565b60405161009d939291906124fd565b6040517fa18bcfb6026768fff923ba3f6d2ab7c37c7a6ab3f226e540ca92278af8d56f2c815260200161009d565b61011e610119366004612453565b610d19565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d51565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b6123c78152602001906001900390816102625790505090506116ee815f8151811061028f5761028f612581565b60200260200101906001600160401b031690816001600160401b03168152505061170b816001815181106102c5576102c5612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c78152602001906001900390816102f557905050905061171a815f8151811061032257610322612581565b60200260200101906001600160401b031690816001600160401b0316815250506117298160018151811061035857610358612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160028151811061038e5761038e612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103be579050509050611748815f815181106103eb576103eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042157610421612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610451579050509050611767815f8151811061047e5761047e612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b4576104b4612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104ea576104ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061052057610520612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055657610556612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105865790505090506117b5815f815181106105b3576105b3612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e9576105e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061f5761061f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065557610655612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068b5761068b612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106ba579050509050611803815f815181106106e7576106e7612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071657905050905061181c815f8151811061074357610743612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077657610776612581565b6020026020010181905250858860018151811061079557610795612581565b602002602001018190525084886002815181106107b4576107b4612581565b602002602001018190525083886003815181106107d3576107d3612581565b602002602001018190525082886004815181106107f2576107f2612581565b6020908102919091010152818861080b6006600161256e565b8151811061081b5761081b612581565b602090810291909101015280886108346006600161256e565b61083f90600161256e565b8151811061084f5761084f612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610871579050509050611868815f8151811061089e5761089e612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d4576108d4612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090a5761090a612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061094057610940612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097657610976612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ac576109ac612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109e0576109e0612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a035790505090506118c6815f81518110610a3057610a30612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6657610a66612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9c57610a9c612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad257610ad2612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0857610b08612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3e57610b3e612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7457610b74612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba857610ba8612581565b602090810291909101015289610bc5610bc082611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf587610be86119d8565b610bf06119f8565b611a18565b9250925092505f610c0b82610220015160200190565b90505f8261022001515182610c20919061256e565b90505f610c3e83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5786610240015184611ba5565b915091508115610cec575f610c6c8783611c7c565b90506123c75f610c7a611cab565b90505f60028251610c8b91906125a9565b9050808510610cbc576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd58c8c8686565b9e509e509e50505050505050505050505050610d12565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d41866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d606006600161256e565b610d6b90600161256e565b610d7690600161256e565b6001600160401b03811115610d8d57610d8d61243f565b604051908082528060200260200182016040528015610dc057816020015b6060815260200190600190039081610dab5790505b50604080516002808252606082019092529192505f9190816020015b6123c7815260200190600190039081610ddc579050509050611ccb815f81518110610e0957610e09612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e3f57610e3f612581565b6001600160401b039290921660209283029190910190910152604080516003808252608082019092525f91816020015b6123c7815260200190600190039081610e6f579050509050611ccb815f81518110610e9c57610e9c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610ed257610ed2612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610f0857610f08612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f38579050509050611ccb815f81518110610f6557610f65612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9b57610f9b612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fcb579050509050611ccb815f81518110610ff857610ff8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102e5761102e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106457611064612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109a5761109a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110d0576110d0612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081611100579050509050611ccb815f8151811061112d5761112d612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116357611163612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119957611199612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cf576111cf612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120557611205612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611234579050509050611cf4815f8151811061126157611261612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611290579050509050611d90815f815181106112bd576112bd612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112f0576112f0612581565b6020026020010181905250858860018151811061130f5761130f612581565b6020026020010181905250848860028151811061132e5761132e612581565b6020026020010181905250838860038151811061134d5761134d612581565b6020026020010181905250828860048151811061136c5761136c612581565b602090810291909101015281886113856006600161256e565b8151811061139557611395612581565b602090810291909101015280886113ae6006600161256e565b6113b990600161256e565b815181106113c9576113c9612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113eb579050509050611ccb815f8151811061141857611418612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144e5761144e612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148457611484612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114ba576114ba612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114f0576114f0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152657611526612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155a5761155a612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157d579050509050611ccb815f815181106115aa576115aa612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115e0576115e0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161657611616612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164c5761164c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168257611682612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b8576116b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7457610b74612581565b5f6060806116fc5f80611e48565b92509250925093509350939050565b5f6060806116fc5f6001611e48565b5f6060806116fc60015f611e48565b5f6060806116fc600180611e48565b5f6060806116fc60016002611e48565b5f6060806116fc60025f611e48565b5f6060806116fc60026001611e48565b5f6060806116fc60035f611e48565b5f6060806116fc60036001611e48565b5f6060806116fc60036002611e48565b5f6060806116fc600380611e48565b5f6060806116fc60036004611e48565b5f6060806116fc60045f611e48565b5f6060806116fc60046001611e48565b5f6060806116fc60046002611e48565b5f6060806116fc60046003611e48565b5f6060806116fc600480611e48565b5f6060806116fc6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fc600580611e48565b5f6060806116fc60055f611e48565b5f6060806116fc60056001611e48565b5f6060806116fc60056002611e48565b5f6060806116fc60056003611e48565b5f6060806116fc60056004611e48565b5f6060806116fc600680611e48565b5f6060806116fc60065f611e48565b5f6060806116fc60066001611e48565b5f6060806116fc60066002611e48565b5f6060806116fc60066003611e48565b5f6060806116fc60066004611e48565b5f6060806116fc60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b60606040518060600160405280604081526020016125f460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb39160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b606060405180606001604052806040815260200161263460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb3565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb3565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb3565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb3565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb3565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d9016ee170b171a1729173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c0101180010800082000100010480300038412a001810000010020004200004002038038ff54900cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609201e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2104d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb02e0f14716565589"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c36600461244d565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d91906124a9565b6100ce6100c93660046124cf565b610c0b565b60405161009d93929190612579565b6040517f8336a7fad53960ed41ca79692ce772de758261a38ddecfa23983c3b89d00aaba815260200161009d565b61011e6101193660046124cf565b610d4f565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d87565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e6600660016125ea565b6101f19060016125ea565b6101fc9060016125ea565b6001600160401b03811115610213576102136124bb565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b50604080516002808252606082019092529192505f9190816020015b61244381526020019060019003908161026257905050905061175a815f8151811061028f5761028f6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611777816001815181106102c5576102c56125fd565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6124438152602001906001900390816102f5579050509050611786815f81518110610322576103226125fd565b60200260200101906001600160401b031690816001600160401b03168152505061179581600181518110610358576103586125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117a48160028151811061038e5761038e6125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117b4816003815181106103c4576103c46125fd565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6124438152602001906001900390816103f45790505090506117c4815f81518110610421576104216125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117d381600181518110610457576104576125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124438152602001906001900390816104875790505090506117e3815f815181106104b4576104b46125fd565b60200260200101906001600160401b031690816001600160401b0316815250506117f2816001815181106104ea576104ea6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061180281600281518110610520576105206125fd565b60200260200101906001600160401b031690816001600160401b03168152505061181281600381518110610556576105566125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118218160048151811061058c5761058c6125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6124438152602001906001900390816105bc579050509050611831815f815181106105e9576105e96125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118408160018151811061061f5761061f6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061185081600281518110610655576106556125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118608160038151811061068b5761068b6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611870816004815181106106c1576106c16125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816106f057905050905061187f815f8151811061071d5761071d6125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b61244381526020019060019003908161074c579050509050611898815f81518110610779576107796125fd565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107ac576107ac6125fd565b602002602001018190525085886001815181106107cb576107cb6125fd565b602002602001018190525084886002815181106107ea576107ea6125fd565b60200260200101819052508388600381518110610809576108096125fd565b60200260200101819052508288600481518110610828576108286125fd565b60209081029190910101528188610841600660016125ea565b81518110610851576108516125fd565b6020908102919091010152808861086a600660016125ea565b6108759060016125ea565b81518110610885576108856125fd565b602090810291909101015260408051600680825260e082019092525f91816020015b6124438152602001906001900390816108a75790505090506118e4815f815181106108d4576108d46125fd565b60200260200101906001600160401b031690816001600160401b0316815250506118f38160018151811061090a5761090a6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061190281600281518110610940576109406125fd565b60200260200101906001600160401b031690816001600160401b03168152505061191281600381518110610976576109766125fd565b60200260200101906001600160401b031690816001600160401b031681525050611922816004815181106109ac576109ac6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611932816005815181106109e2576109e26125fd565b60200260200101906001600160401b031690816001600160401b0316815250508089600581518110610a1657610a166125fd565b602090810291909101015260408051600780825261010082019092525f91816020015b612443815260200190600190039081610a39579050509050611942815f81518110610a6657610a666125fd565b60200260200101906001600160401b031690816001600160401b03168152505061195181600181518110610a9c57610a9c6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061196081600281518110610ad257610ad26125fd565b60200260200101906001600160401b031690816001600160401b03168152505061197081600381518110610b0857610b086125fd565b60200260200101906001600160401b031690816001600160401b03168152505061198081600481518110610b3e57610b3e6125fd565b60200260200101906001600160401b031690816001600160401b03168152505061199081600581518110610b7457610b746125fd565b60200260200101906001600160401b031690816001600160401b0316815250506119a081600681518110610baa57610baa6125fd565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610bde57610bde6125fd565b602090810291909101015289610bfb610bf6826119b0565b6119c5565b9b50505050505050505050505090565b5f6060805f805f610c2b87610c1e611a54565b610c26611a74565b611a94565b9250925092505f610c4182610220015160200190565b90505f8261022001515182610c5691906125ea565b90505f610c7483836f07fffffe0000000003ff200000000000611b85565b80925081945050505f80610c8d86610240015184611c21565b915091508115610d22575f610ca28783611cf8565b90506124435f610cb0611d27565b90505f60028251610cc19190612625565b9050808510610cf2576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610d0b8c8c8686565b9e509e509e50505050505050505050505050610d48565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d77866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d96600660016125ea565b610da19060016125ea565b610dac9060016125ea565b6001600160401b03811115610dc357610dc36124bb565b604051908082528060200260200182016040528015610df657816020015b6060815260200190600190039081610de15790505b50604080516002808252606082019092529192505f9190816020015b612443815260200190600190039081610e12579050509050611d47815f81518110610e3f57610e3f6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110610e7557610e756125fd565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b612443815260200190600190039081610ea5579050509050611d47815f81518110610ed257610ed26125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110610f0857610f086125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110610f3e57610f3e6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110610f7457610f746125fd565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b612443815260200190600190039081610fa4579050509050611d47815f81518110610fd157610fd16125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600181518110611007576110076125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b612443815260200190600190039081611037579050509050611d47815f81518110611064576110646125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160018151811061109a5761109a6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816002815181106110d0576110d06125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110611106576111066125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160048151811061113c5761113c6125fd565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b61244381526020019060019003908161116c579050509050611d47815f81518110611199576111996125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816001815181106111cf576111cf6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110611205576112056125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160038151811061123b5761123b6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600481518110611271576112716125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816112a0579050509050611d70815f815181106112cd576112cd6125fd565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6124438152602001906001900390816112fc579050509050611e0c815f81518110611329576113296125fd565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061135c5761135c6125fd565b6020026020010181905250858860018151811061137b5761137b6125fd565b6020026020010181905250848860028151811061139a5761139a6125fd565b602002602001018190525083886003815181106113b9576113b96125fd565b602002602001018190525082886004815181106113d8576113d86125fd565b602090810291909101015281886113f1600660016125ea565b81518110611401576114016125fd565b6020908102919091010152808861141a600660016125ea565b6114259060016125ea565b81518110611435576114356125fd565b602090810291909101015260408051600680825260e082019092525f91816020015b612443815260200190600190039081611457579050509050611d47815f81518110611484576114846125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816001815181106114ba576114ba6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816002815181106114f0576114f06125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600381518110611526576115266125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160048151811061155c5761155c6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600581518110611592576115926125fd565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115c6576115c66125fd565b602090810291909101015260408051600780825261010082019092525f91816020015b6124438152602001906001900390816115e9579050509050611d47815f81518110611616576116166125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d478160018151811061164c5761164c6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600281518110611682576116826125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816003815181106116b8576116b86125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d47816004815181106116ee576116ee6125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600581518110611724576117246125fd565b60200260200101906001600160401b031690816001600160401b031681525050611d4781600681518110610baa57610baa6125fd565b5f6060806117685f80611ec4565b92509250925093509350939050565b5f6060806117685f6001611ec4565b5f60608061176860015f611ec4565b5f606080611768600180611ec4565b5f60608061176860016002611ec4565b5f60608061176860016003611ec4565b5f60608061176860025f611ec4565b5f60608061176860026001611ec4565b5f60608061176860035f611ec4565b5f60608061176860036001611ec4565b5f60608061176860036002611ec4565b5f606080611768600380611ec4565b5f60608061176860036004611ec4565b5f60608061176860045f611ec4565b5f60608061176860046001611ec4565b5f60608061176860046002611ec4565b5f60608061176860046003611ec4565b5f606080611768600480611ec4565b5f606080611768611892600660016125ea565b85611ec4565b5f60608060ff80851690600886901c166118d3826118b8600660016125ea565b6118c39060016125ea565b6118cd91906125ea565b82611ec4565b945094509450505093509350939050565b5f606080611768600580611ec4565b5f60608061176860055f611ec4565b5f60608061176860056001611ec4565b5f60608061176860056002611ec4565b5f60608061176860056003611ec4565b5f60608061176860056004611ec4565b5f606080611768600680611ec4565b5f60608061176860065f611ec4565b5f60608061176860066001611ec4565b5f60608061176860066002611ec4565b5f60608061176860066003611ec4565b5f60608061176860066004611ec4565b5f60608061176860066005611ec4565b6060815f6119bd82611f46565b949350505050565b60605f82516002026001600160401b038111156119e4576119e46124bb565b6040519080825280601f01601f191660200182016040528015611a0e576020820181803683370190505b50905061ffff80196020850160208651028101600285015b81831015611a4857805183518616908516178152602090920191600201611a26565b50939695505050505050565b60606040518060e0016040528060a681526020016126b260a69139905090565b606060405180608001604052806042815260200161275860429139905090565b5f80611b236040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611b6f87878760405180602001604052805f815250611fb4565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b9c5780611b9f565b60205b915050875192505b8519600184841a1b16158183101615611bc557600182019150611ba7565b9681019660208290036008810293841c90931b92611c105760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610ce9916004016124a9565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611ce65760018301516021909301805190935f90819060ff168180611c6b838e612165565b915091508186165f03611c8d575f809b509b5050505050505050505050611cf1565b5f87611c9d600185038916612190565b016004028b015195505062ffffff9081169350841683039150611cd19050575060019750601c1a9550611cf1945050505050565b611cda83612190565b84019350505050611c42565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611d1e9083565b95945050505050565b606060405180608001604052806042815260200161267060429139905090565b5f81515f14611d69576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611dcd575060208101516001600160e01b038116601b0b60e082901d5f611d9e838383612249565b905061ffff811115611dc357604051631e4e01d760e21b815260040160405180910390fd5b9250611e07915050565b81515f03611dee57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611ea157602082015160408301516001600160e01b038216601b0b60e083901d5f611e3e838383612249565b6001600160e01b038516601b0b935060e085901d925090505f611e62848483612249565b905060ff821180611e73575060ff81115b15611e9157604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611e079350505050565b600282511015611dee57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611ed7575060ff84115b15611eff57604051639b0f326160e01b81526004810186905260248101859052604401610ce9565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611f528361228b565b90505f611f60826020612644565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611fa857602083515102806020855101835e6020939093019201611f85565b50919695505050505050565b6120416040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120c6576120c66124bb565b6040519080825280602002602001820160405280156120ef578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611d1e565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611cf1575060019250929050565b5f5f1982036121a25750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6122578686866122d4565b91509150806122825760405162bc8ecf60e31b81526004810187905260248101869052604401610ce9565b50949350505050565b5f60208201602083510281015b808210156122cd5781515192830192808410156122c157634e487b715f5260116020526024601cfd5b50602082019150612298565b5050919050565b5f805f85121561230157604051634a7d166b60e01b81526004810186905260248101859052604401610ce9565b845f0361231357505f90506001611c19565b8460ff841685018581121561234e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610ce9565b5f805f83121561239a57604c19831215612371575f809550955050505050611c19565b825f03600a0a915081848161238857612388612611565b0495505084029091149150611c199050565b5f83131561243357604d8313156123d75760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ce9565b82600a0a9150815f19816123ed576123ed612611565b048411156124215760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610ce9565b5091909102925060019150611c199050565b8360019550955050505050611c19565b61244b61265b565b565b5f6020828403121561245d575f80fd5b81356001600160e01b031981168114612474575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f612474602083018461247b565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156124df575f80fd5b81356001600160401b03808211156124f5575f80fd5b818401915084601f830112612508575f80fd5b81358181111561251a5761251a6124bb565b604051601f8201601f19908116603f01168101908382118183101715612542576125426124bb565b8160405282815287602084870101111561255a575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f602060606020840152612595606084018661247b565b8381036040850152845180825260208087019201905f5b818110156125c8578351835292840192918401916001016125ac565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d16125d6565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261263f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d16125d6565b634e487b7160e01b5f52605160045260245ffdfe175a17771786179517a417b417c417d317e317f21802181218211831184018501860187018e418f3190219121922193219421951196019701980199019a0187f18980101180010a00082000100010480300038412a001810000010020004200004002038038ff54905cc66c61ef3dcab071659220a895f0b15fec9301a02e0920d5bfe561c21609201e959460c19742710844db209bcd3bf1d9893761f1049db12b93430190ae9a00bf82a7806c138f40e28083f0842ef2104d561fd1315a13316716a6118d260cc117b9bfc0fec7ade14cba28900a422961b6b14a520792bdb02e0f147175655891d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d471d701e0c"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index c6acd45047..8512b33324 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xca8630d3919d5540fce2c87a35fbea4bfed72adc91d79fb644044046cf1494ac); +bytes32 constant BYTECODE_HASH = bytes32(0x0c6e1142a531bd3f2977b327b2d1d61ba5e0b5719c534a2595e3f1dbdf8c5525); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x0B79366407c6D384731f07e6918D052E39c230fe); +address constant DEPLOYED_ADDRESS = address(0x2E081059052276201A79BCd3c931f4d6195b9ba3); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124d5806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673cf305dd5de53b94dfbf55d560a51f602d9802370146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373cf305dd5de53b94dfbf55d560a51f602d980237014155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124d5806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316738b501ada8bf1a4c132bdd023eccb481df0a0c722146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033738b501ada8bf1a4c132bdd023eccb481df0a0c72214155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673cf305dd5de53b94dfbf55d560a51f602d9802370146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373cf305dd5de53b94dfbf55d560a51f602d980237014155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316738b501ada8bf1a4c132bdd023eccb481df0a0c722146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033738b501ada8bf1a4c132bdd023eccb481df0a0c72214155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600680825260e082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005e80000000000000000000000000cf305dd5de53b94dfbf55d560a51f602d9802370000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000058f96080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b92610157612ad8565b612261565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b9190610278612ad8565b60405192610285846119d4565b5f84523691611dfb565b90612fb7565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612245565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b30614169565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f929192612ad8565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6140ff565b614154565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b60608201526064840135608082015261057181612b1a565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550612b4b565b8190838080808080610587565b6106486104af848b612121565b61065181614ef0565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c0906004353603011261018257610764612ad8565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184612bc6565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613500565b6109de81612b1a565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613572565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af160608201516044600435013590612be9565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151612bc6565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613bd9565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b6145a9565b90614764565b9d8e9260408d0151613ca4565b60408c0152613cce565b99613cce565b98610c5a8484613cf8565b610c648482613d56565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c0152613e68565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b6145a9565b60408a0151610dd98183613bd9565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613ca4565b610e129085613c00565b610dfb565b905091610de1565b50610e2d6060820151613bb6565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613bd9565b61101b5750508490610ed7856001600160a01b0360208701511633613497565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f169293511633612c10565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614041565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151612bc6565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f612ad8565b61111a848633612b92565b61112383612bc6565b15611268576111338486336131ca565b61113d8185613bd9565b15611262575082935b61115285828833613439565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613497565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612229565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761135195602092169361131386858761335a565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a457611399935030916133d3565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b604435916131ca565b604051908152f35b3461018257611436366118b0565b83949392611442612ad8565b61144d848633612b92565b61145681612bc6565b1561155c578061146a6114b9928733612c10565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133612cb6565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612229565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e612ad8565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b612b1a565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1612b4b565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121806116376121798380611f4f565b3690611b81565b5f525f602052600160405f20540361222057806121a08161220c93611f4f565b6122046121bf6121c46020850135938460408701359384923690611b81565b613500565b6121dc6121d18580611f4f565b946060810190611ead565b92906121fc604051966121ee886119d4565b5f88525f3681373690611b81565b933691611c14565b92339261381e565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60c08110612237575050565b60608282015260200161222b565b5f5b82811061225357505050565b606082820152602001612247565b91926001600160a01b038351166001600160a01b0383511614612ac6576001600160a01b03612297606085015160643590612007565b5151166001600160a01b036122b3604085015160843590612007565b51511614801590612a86575b610e32576001600160a01b036122dc604085015160443590612007565b5151166001600160a01b036122f76064356060870151612007565b51511614612a745761230883612b1a565b805f525f60205260405f205415612a25575061232382612b1a565b805f525f60205260405f2054156129d5575061269392937f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061238761237961012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16126006001600160a01b0384511692604051936123d7856119d4565b5f85526123e2613535565b50604051906123f0826119b8565b6006825261240060208301612229565b61240989612b1a565b906001600160a01b038a511660405192600384526020840152604083015260608201526080810160405261243c82611faa565b5261244681611faa565b5060405161245381611950565b60028152604036602083013761246882611fb7565b5261247281611fb7565b506125466124996001600160a01b0361249160443560408d0151612007565b51511661454d565b6124df6001600160a01b038b51168b60206124d66001600160a01b036124c56044356040860151612007565b515116926040604435910151612007565b510151916131ca565b908a60ff60206125116001600160a01b036125006044356040870151612007565b515116936040604435910151612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61254f82611fc7565b5261255981611fc7565b506125e76125786001600160a01b0361249160643560608d0151612007565b6125b56001600160a01b038b51168b60206124d66001600160a01b036125a46064356060860151612007565b515116926060606435910151612007565b908a60ff60206125116001600160a01b036125d66064356060870151612007565b515116936060606435910151612007565b6125f082611fd7565b526125fa81611fd7565b5061431b565b915f6001600160a01b038751169160208801908151906001600160a01b0360208184511693015116928585523060205260408086209151015160405191612646836119d4565b86835260405195612656876119b8565b86526020860152604085015284606085015287608085015260a084015260c0830152604051808099819463d04dfe2360e01b835260048301612ebe565b03915afa94855f915f976129af575b506126b2576040513d5f823e3d90fd5b94908551600281106129975750906127859291604060208801519701516126e16126db87611fe7565b51611fd7565b516126ec8183613bd9565b1561298f5750945b6127168887919060405192600284526020840152604083015260608201604052565b61271f82611fc7565b5261272981611fc7565b5060405195612737876119b8565b8987526064356020880152604087015260608601978852608086015260a085015260c08401526001600160a01b038651169060405191612776836119d4565b5f835260a4356084358761381e565b9390506127956040830151612bc6565b15908115612979575b8115612968575b508015612955575b61294357604051916127be83611988565b5f83525f60208401525f60408401525f60608401526127dd8483614f14565b845260408401526128036127f18386614f14565b60208601528060608601528451613ca4565b946128176020850151604086015190613ca4565b9361282187613bb6565b8015612934575b612922576128e961291b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128cb6129209a60a09661286a8a8851613cf8565b6128788c6020890151613cf8565b6128868a6040890151613d56565b6128948c6060890151613d56565b61289d8a614041565b6128a68c614041565b6001600160a01b036128c260c435926060606435910151612007565b51511633612cb6565b50506001600160a01b036128c260e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e68565b613e68565b565b604051630d86822160e01b8152600490fd5b5061293e85613bb6565b612828565b6040516321badf1f60e01b8152600490fd5b506129636060840151613bb6565b6127ad565b612973915051613bb6565b5f6127a5565b90506129886040850151612bc6565b159061279e565b9050946126f4565b60249060405190630fbb8e5560e21b82526004820152fd5b9096506129ce91503d805f833e6129c681836119f0565b810190612d7a565b955f6126a2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9251604080513381526001600160a01b039092166020830152810193909352507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3925081905060608101612a20565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612aa0606084015160a43590612007565b5151166001600160a01b03612abc604086015160443590612007565b51511614156122bf565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b085760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b4581612b37602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b6129209291612b7661028f923390919060405192600284526020840152604083015260608201604052565b9260405193600185526020850152604084016040523691611dfb565b909115612b9d575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612be5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1290565b90612be5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b929192612c1c8261423c565b93612c2681613bb6565b612ca45784816001600160e01b03612c459360e01d9116601b0b615077565b9290809315612c7b575b50829081612c5f575b5050509190565b612c73926001600160a01b033092166133d3565b5f8181612c58565b9092505f198114612c9057600101915f612c4f565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612cc383613bb6565b612d615784612cdf57612cd7939450613497565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613cce565b95612d2687613bb6565b612d49575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612db582611ad4565b91612dc360405193846119f0565b808352848084019160051b830101918683116101825785809101915b838310612e525750505050948281015191821161018257019180601f84011215610182578251612e0e81611ad4565b93612e1c60405195866119f0565b818552838086019260051b820101928311610182578301905b828210612e43575050505090565b81518152908301908301612e35565b8251815291810191869101612ddf565b90808251908181526020809101926020808460051b8301019501935f915b848310612e905750505050505090565b9091929394958480612eae600193601f198682030187528a516120ee565b9801930193019194939290612e80565b91906020928381526001600160a01b0382511684820152838201516040820152612ef8604083015160e060608401526101008301906118fc565b9060608301516080820152612f1f608084015192601f1993848483030160a0850152612e62565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f6257505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101612f3e565b90604082019082526020606081936040838201528551809452019301915f5b828110612fa3575050505090565b835185529381019392810192600101612f95565b919091604092835192612fc9846119b8565b60068452602094612fdb868601612229565b5f5b84518110156130105780612ff360019287612007565b51612ffe8289612007565b526130098188612007565b5001612fdd565b50925092939093335f52308252825f209183519561302d8761196c565b613035611ee3565b87526060828198015284519061304a826119d4565b5f8252855190613059826119d4565b5f82525f3681375f5b81518110156131be578986886130788486612007565b51888151948d8087015190815161309a575b5050505050505050600101613062565b905f92916001600160a01b03966130bf8887818d51169c01511699878901519061431b565b958251996130cc8b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b82528180613107600498898301612ebe565b03915afa9384156131b4579089915f95613196575b508451613132575b50899250808e8c938e61308a565b5101511691823b1561018257613160925f92838d5180968195829463012c676d60e21b845233908401612f76565b03925af1801561318c57906001929161317d575b81928782613124565b613186906119a4565b5f613174565b89513d5f823e3d90fd5b6131ab9195503d805f833e6129c681836119f0565b9050935f61311c565b8c513d5f823e3d90fd5b50505050505050509050565b82156131ff576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b90915061320b8261454d565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715613321575f9761332b575b508361326261325b836132929a61522c565b50906149b7565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715613321575f976132f0575b5061325b6132b691611a739861522c565b506132c18183613bd9565b156132e85750935b5f5260018252825f20905f528152815f20905f8052525f205490613cce565b9050936132c9565b96508387813d831161331a575b61330781836119f0565b810103126101825795519561325b6132a5565b503d6132fd565b85513d5f823e3d90fd5b96508387813d8311613353575b61334281836119f0565b810103126101825795519583613249565b503d613338565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f51148116156133b4575b836040521561339e57505050565b635274afe760e01b835216600482015260249150fd5b60018115166133ca57813b15153d151616613390565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615613423575b836040525f6060521561339e57505050565b60018115166133ca57813b15153d151616613411565b9392919361344683613bb6565b612d61578461345a57612cd7939450612c10565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612d1c835f20549485613ca4565b909291926134a48161423c565b936134ae81613bb6565b6134ee5784816001600160e01b036134cd9360e01d9116601b0b615077565b508092816134dc575050509190565b6001600160a01b03612c73931661335a565b604051632d1671a360e11b8152600490fd5b9161352b906060613520936001600160a01b039485916040880151612007565b515116940151612007565b51511614612a7457565b60405190613542826119b8565b606060c08361354f611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613581613535565b505f9260406136a6815192613595846119b8565b600684526020936135a7858201612229565b61366f6135b38b612b1a565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135ea86611faa565b526135f485611faa565b50875161360081611950565b6002815288368b83013761361386611fb7565b5261361d85611fb7565b5060ff896125118a8501936136598761363b81612491858a51612007565b9751168861364a848951612007565b515116856124d6858a51612007565b96613665828751612007565b5151169451612007565b61367882611fc7565b5261368281611fc7565b506125e7878b8d60ff896125118c8501936136598761363b81612491858a51612007565b946137265f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136de836119d4565b8683528951956136ed876119b8565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612ebe565b03915afa90815f915f93613800575b506137f3575050505f975b6002855110988915996137e0578284870151960151906137626126db89611fe7565b519061376e8284613bd9565b1590506137d85750925b61379a8685919060405192600284526020840152604083015260608201604052565b6137a388611fc7565b526137ad87611fc7565b5082519b6137ba8d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613778565b5050505050505050509150611a73613535565b9199985094509396613740565b90925061381791503d805f833e6129c681836119f0565b915f613735565b9495939592919261382d613535565b5060409687519061383d826119b8565b6006825260209361384f858401612229565b61385889612b1a565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261388a84611faa565b5261389483611faa565b5089516138a081611950565b600281528a36878301376138b384611fb7565b526138bd83611fb7565b508989019086818351906138d091612007565b5151166138dc9061454d565b86888c511689848651906138ef91612007565b515116828587519061390091612007565b5101519061390d926131ca565b92898186519061391c91612007565b51511694519061392b91612007565b5101519060ff16613963929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61396c83611fc7565b5261397682611fc7565b5060608801858782519061398991612007565b5151166139959061454d565b868a511687898451906139a791612007565b515116878a8551906139b891612007565b510151906139c5926131ca565b90868989818651906139d691612007565b5151169451906139e591612007565b5101519060ff16613a1d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a2683611fd7565b52613a3082611fd7565b50613a3a9161431b565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a6b836119d4565b5f83528c5196613a7a886119b8565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613ab99060048301612ebe565b03815a935f94fa91825f915f94613b98575b50613ada5788513d5f823e3d90fd5b97949596979194825196600288109788613b8157508183850151940151613b036126db87611fe7565b51613b0e8183613bd9565b15613b795750925b613b388585919060405192600284526020840152604083015260608201604052565b613b4187611fc7565b52613b4b86611fc7565b5082519a613b588c6119b8565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613b16565b602490835190630fbb8e5560e21b82526004820152fd5b909350613baf91503d805f833e6129c681836119f0565b925f613acb565b613bd5905f60e01d906001600160e01b038160e01d9116601b0b614f77565b1390565b90613bd5916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614ff8565b613c276001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b848461476e565b90637ffffff58213613c77575b90613c3e916149b7565b9290921580613c6f575b613c5157505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c48565b613c818282615657565b15613c3457604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614bbd565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d81565b613d52916080810182613d14613d0e8351611fe7565b51611fe7565b52613d4b613d456001600160a01b03809451511693613d3c613d368551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613439565b5050565b90608081019180613d6a613d0e8551611fd7565b526001600160a01b03809251511691613d86613d368551611fd7565b5116613d95613d458551611fd7565b519081613e3057613da583613bb6565b612d61579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a20955f5260209060018252613dfb604094855f20835f528452855f20855f528452855f2054613cce565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e62565b91613e61917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a2095612cb6565b5050613e15565b60c0810151908151915f92613fdc575b50613f1d6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613ec5836119d4565b8683528c5193613ed4856119d4565b8785528d5196613ee3886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612ebe565b03915afa948515613fd2578795613fb4575b508451613f40575b50505050505050565b81905101510151169051813b15613fb057918491849383613f75965180978195829463012c676d60e21b845260048401612f76565b03925af1908115613fa75750613f90575b8080808080613f37565b613f9a82916119a4565b613fa45780613f86565b80fd5b513d84823e3d90fd5b8480fd5b613fc99195503d8089833e6129c681836119f0565b9050935f613f2f565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b156101825761401f925f928360405180968195829463012c676d60e21b845260048401612f76565b03925af1801561022c5715613e78576140399192506119a4565b5f905f613e78565b60808101614052613d458251611fd7565b5191821561405f57505050565b614079613d366001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166140b4575b505050505050565b6140d8955f9284845260018152828420868552815282842091845252812055613497565b5f8080806140ac565b81156140eb570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614147576020810151908051603f198101908111612c905760051c82116141335760016020920160051b010190565b5050604051614141816119d4565b5f815290565b50604051614141816119d4565b80511561416457602001515f1a90565b505f90565b905f8091602081519101845af480806141e7575b1561419d5750506040513d81523d5f602083013e60203d82010160405290565b156141c457604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141d5576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061417d5750813b151561417d565b6004111561420457565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614238836141fa565b0152565b614244615745565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614312575f925f946142dd575b5061429a836141fa565b6001831415806142cb575b6142af5750505090565b5163ee07877f60e01b81529182916106df919060048401614218565b506142d5836141fa565b8215156142a5565b908094506143019293503d851161430b575b6142f981836119f0565b81019061504d565b919091925f614290565b503d6142ef565b513d5f823e3d90fd5b9080519161432883611ad4565b9161434360409461433b865195866119f0565b808552611ad4565b601f1994602091860136868401378351835190959080156145425760016143999101965b600197889101019761439061437b8a611ad4565b9961438886519b8c6119f0565b808b52611ad4565b01848901612245565b85805f96845160028152338782015230868201526060810186526143bc8b611faa565b526143c68a611faa565b505f925b6144fe575b50505083516143e2575b50505050505090565b858095989796929801816143f68289612007565b526144018188612007565b505f925b614414575b50859697506143d9565b84518310156144f9576001600160a01b0361448b816144338689612007565b51511686614441878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614482888b612007565b510151916151a3565b156144e157868098999a9281926144a2878a612007565b5151166144af8787612007565b520193856144bd8289612007565b5101516144ca868c612007565b526144d5858b612007565b50019290989796614405565b8951630a57f30960e31b815260048101859052602490fd5b61440a565b90919681518810156145395782809101976145198184612007565b516145248a8d612007565b5261452f898c612007565b50019190816143ca565b968291506143cf565b506143995f96614367565b614555615745565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614312575f925f946142dd575061429a836141fa565b9091939284158215175f146145c35750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146fa575b50506145e68161531c565b936145f08161531c565b946145fb868261533c565b909182156146eb575f9083986f0785ee10d5da46d900f436a0000000008086116146dd575b50670de0b6b3a7640000808b116146ce575b50633b9aca00808b116146bf575b50612710808b116146b1575b5098805b6146a0575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c17029161534f565b60019290920191600a900480614650565b60049a04998a93019261464c565b600991939a049901915f614640565b601291939a049901915f614632565b85049950602592505f614620565b509290506118f894955061534f565b5f82121561474e57808413614740575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145db579092506118f893949161525a565b9092506118f89394916152c1565b8084121561470a579092506118f893949161525a565b613c3e82826149b7565b92909180614794576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f146147a957505050505f905f90565b6147c2936147b691615409565b92919490938492615409565b90939192846147d08861531c565b916147da8661531c565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614981575b030191600160ff1b98838a018112155f1461494e575050035b5f955f821280614945575b614927575b5f811280614915575b6148f75786820103966001600160ff1b03881490816148ed575b50806148e4575b806148db575b6148bd57509061487192916155b5565b915f8113614884575b506118f89361534f565b9091604c82136148b25761489b91600a0a906140e1565b9081156148a8575f61487a565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614861565b5082841461485b565b905088145f614854565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b0301821361483a565b955080870186131561493f5786818703015b95614831565b5f614939565b505f811361482c565b89985090920390506001600160ff1b03819003870182136149725701860194614821565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b9250614808565b81156140eb570590565b8082601b82810b8314614bac577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b58575b8380820b03614b4757507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614af8575b838060030b03614a7c575b808413614a605750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140eb576001600160e01b0391071592614a57565b92915f841315614acc575090614a928383615657565b614aae57637ffffffe1901600a0a810290637fffffff92614a42565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136148b257614aeb91600a0a906149ad565b9182156148a85792614a42565b5f198401808060030b14614b0c5750614a37565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149ea565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b99576305f5e100600894058094819201955b9150506149ea565b620186a060059405809481920195614b91565b5082614a3757505050505f90600190565b919291600160ff1b8401614bd5576118f89350615670565b906118f8935f0391614d81565b919291600160ff1b9190801580614d6f575090614bfe91615409565b9490929091905f868585858282138015614d66575b614d49575b505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614d14575b505081019182821860ff1c1115614d0c57826001600160ff1b0314614cee57905f600192135f14614cbf57600a9004915b01925b81158117614c8357509190565b80614c9c575b508015614c94579190565b505f91508190565b9192614cb29203600160ff1b01600a0a906149ad565b600160ff1b91905f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c73565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c76565b8107614d21575b80614c42565b60ff1d600117015f614d1b565b505050919350614d3c579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614c18565b50835f12614c13565b15614d7a5750509190565b9350919050565b9392919384158115818117614ed257505090614d9c91615409565b9194908295614dad82958294615409565b8096929491969387868482138015614ec9575b614eb0575b5050505050508682841860ff1c94860391039081604c038111614d2e5701600a0a808205919084614e96575b505081019182821860ff1c1115614e8e57826001600160ff1b0314614cee57905f600192135f14614e5f57600a9004915b01925b81158117614e3257509190565b80614e4257508015614c94579190565b600160ff1b93614e599291038401600a0a906149ad565b5f614c89565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e22565b509092614e25565b8107614ea3575b80614df1565b60ff1d600117015f614e9d565b929b5098509196509450925090505f8080808080614dc5565b50858412614dc0565b9395939092919015614ee8575050614c94579190565b945092915050565b6008815110614164576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f4e610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6145a9565b94519301614f5d815186612be9565b614f65575050565b909350611a7391925051925183613c00565b92915f9060018184145f87128715171717614ff1575f92808213614fe3575b03604c81135f821217614fd757600a0a9084614fb583820293846149ad565b14614fca57505015614fc6575f9190565b5f90565b9093509015611a73579190565b505015614fc6575f9190565b5f9560019450925090614f96565b5050505f90565b93929190918083145f83125f87121883158715171717615047575f9280821361503a5703604c81135f821217614fd757600a0a9084614fb583820293846149ad565b9194600193509190614f96565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f83121561509f576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836150b157505090505f90600190565b60ff8116820191808312615179575f8312156150e9575050604c198112614c94575f03600a0a916150e283826140e1565b9283021490565b909293915f81135f1461516f57604d811361514457600a0a9283156140eb57835f1904831161511b5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151de576151b591926157ae565b506151bf816141fa565b1591826151cb57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461525257600a6001818404940192061590565b909190600190565b909392915f61526a9181846145a9565b9490945f84830191820194121590816152b7575b81156152ad575b5061528f57505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615285565b828112915061527e565b6152d693600160fe1b908101939201906145a9565b9081815f82121561530d575050604b198212612cd7576152fb915f03600a0a906149ad565b9081615305575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615335575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153e4576001600160ff1b0392838311156153ce57600160ff1b9383850361538457505050509190565b9091929350851461539e575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c90575f039190565b90916001600160ff1b0380841115612c5857851461539e575050600a60019104920190565b91909180156155ab57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156154b9575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc8301106154aa575b83136154945791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615488565b6f4b3b4ca85a86c47a098a22400000000080840515615599575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615582575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c64000000000000000083051561556e575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561555e5782051561554f575b5f61543d565b9290600a02905f190192615549565b939160640291600119019361551a565b93916402540be4000291600919019361551a565b9391678ac7230489e80000029160121901936154f5565b6025198301955092909202915f6154d3565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615633571461562b579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561566b575f036157e8565b6157e8565b909291600160ff1b9182810161570257508084146156f8578084139182156156f0578185035b604c8111156156df5750505f915b156156d057507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140eb5704916156a4565b848203615696565b505090505f905f90565b9361570f92945f03614be2565b80939180928114615723575b50505f039190565b915092506001600160ff1b038314614cee57600a600191059201915f8061571b565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615783575b61576b5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615764565b81519190604183036157de576157d79250602082015190606060408401519301515f1a90615877565b9192909190565b50505f9160029190565b90637ffffff581131561587157637ffffffe198101906043821361586a575f82121561583e57637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140eb577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158ee579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158e457905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000005bc000000000000000000000000000000000000000000000000000000000000060800000000000000000000000008b501ada8bf1a4c132bdd023eccb481df0a0c72200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005aeb6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117ec575080631f69cb75146115b65780632cb77e9f1461158a5780632fbc4ba01461142857806341d1514f146113f15780635cffe9de1461129557806360746119146110f9578063613255ab1461107657806369c728561461072b578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b81565b6024358281116101825761010c903690600401611b81565b60c0366043190112610182576101043583811161018257610131903690600401611d27565b90610124359384116101825761014e61015c943690600401611d27565b9261015761308d565b612551565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611870565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119f0565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161183f565b919061027861308d565b60405192610285846119d4565b5f84523691611dfb565b90613581565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161183f565b9190604051926102d6846119d4565b5f84528284016102e582611ad4565b946102f360405196876119f0565b8286526102ff83611ad4565b9361031186880195601f190186612535565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118fc565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b870187612121565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119f0565b3061435b565b6103ce828a612007565b526103d98189612007565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612169565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161183f565b61048f92919261308d565b6104c06104bb6104b66104af6104a58880612154565b6040810190612121565b3691611a12565b6142f1565b614346565b801561071957600110156107075760248201926104dd8486611f64565b9050156106f55760448301936104f38587611f64565b9050156106e3576105596105219561054d6105186105118a80612154565b948a611f64565b9890928a611f64565b91909261053e6040519661053488611920565b3388523690611a76565b9960209a8b8801523691611aec565b60408501523691611aec565b606082015260648401356080820152610571816130cf565b90815f525f865260405f209485541595866105b5575b878760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152868b8201526060604082015280610609606082018861206f565b0390a10191610618838a612121565b905061063b575b50505061062e93949550613100565b8190838080808080610587565b6106486104af848b612121565b610651816150e2565b156106bc57509761068f7fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec369936106af9361062e999a9b511692612121565b92906040519384938452868c850152606060408501526060840191611d56565b0390a1859493878061061f565b886106df604051928392630c89984b60e31b8452600484015260248301906118fc565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c090600435360301126101825761076461308d565b5f808061077960048035608481019101611ead565b90501561106457602460043501359261079184613190565b15611052576060806040516107a581611988565b6107ad611f02565b81525f60208201525f604082015201526107c5611f02565b506108256108206107ff6107f56107ef6107e9608460043501600435600401611ead565b90611f34565b80611f4f565b6040810190611f64565b60206108186107e9608460043501600435600401611ead565b013591611f9a565b611d42565b936001600160a01b0361087461082061085b6108516107ef6107e9608460043501600435600401611ead565b6060810190611f64565b60406108186107e9608460043501600435600401611ead565b816040519761088289611950565b16875216602086015260408501526108a4608460043501600435600401611ead565b9490506001604051955f87520160051b85016040525f905f5b6108d1608460043501600435600401611ead565b905081108061103f575b15610e8c576108f4608460043501600435600401611ead565b821015610e78578160051b810135607e1982360301811215610182576080818301360312610182576040519161092983611988565b8181013567ffffffffffffffff81116101825761094b90369084840101611b81565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109849236920101611d27565b606082015280516001600160a01b036109a66040830151602085015190612007565b5151166001600160a01b0385511614801590610e44575b610e32576109d5602083015160408401519083613aca565b6109de816130cf565b91825f525f60205260405f2054155f14610a42575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b016108bd565b9190610a73602084979597015160408501519060608601519060405192610a68846119d4565b5f8452339186613b3c565b5f9491610adc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610ad4575b5092610a3c565b905088610acd565b610af1606082015160446004350135906131b3565b15610b4b57505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610ac6565b610b586040820151613190565b158015610e1f575b15610bb657505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b43565b9250925050600196959691610bcf60646004350161201b565b15610d8c5796610c3f97610c4f60408401516040880151610bf08183613dcb565b15610d845750925b610c49848592610c32610c2c60608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b61479b565b90614956565b9d8e9260408d0151613e96565b60408c0152613ec0565b99613ec0565b98610c5a8484613eea565b610c648482613f48565b60405192338452608060208501526060610c8a845160808088015261010087019061206f565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d2657505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d2196604084015260608301520390a180858c5101808d5260051b8c015261405a565b610ac6565b9091929396602080610d77600193601f198782030189528b51906001600160a01b0382511681526040610d668584015160608785015260608401906120ee565b9201519060408184039101526118fc565b9901950193929101610cc7565b905092610bf8565b610c3f90610c4f6060840151610c49610dca610c2c60408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b61479b565b60408a0151610dd98183613dcb565b15610e175750915b829c8d916060890151908116155f14610e08575060408801515b96879460408d0151613e96565b610e129085613df2565b610dfb565b905091610de1565b50610e2d6060820151613da8565b610b60565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e606060830151604085015190612007565b5151166001600160a01b0360208601511614156109bd565b634e487b7160e01b5f52603260045260245ffd5b50919390610e9e60646004350161201b565b1561103957835b6004356004013590610eb78282613dcb565b61101b5750508490610ed7856001600160a01b0360208701511633613a61565b505060a46004350190610eef82600435600401612121565b905015159081611013575b50610f72575b506001600160a01b03610f1692935116336131da565b50505b8351811015610f3e5780610f38610f3260019387612007565b51614233565b01610f19565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f9c6001600160a01b0385511692600435600401612121565b929091333b1561018257610fe45f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d56565b038183335af190811561022c57859115610f0057905061100491506119a4565b5f836001600160a01b03610f00565b905088610efa565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610ea5565b5061104d6040830151613190565b6108db565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b0361109b611870565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110cc575b50604051908152f35b90508181813d83116110f2575b6110e381836119f0565b810103126101825751826110c3565b503d6110d9565b3461018257611107366118b0565b61110f61308d565b61111a84863361315c565b61112383613190565b1561126857611133848633613794565b61113d8185613dcb565b15611262575082935b61115285828833613a03565b9690947f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c0611183898533613a61565b94906001600160a01b0360405192338452169a8b6020840152876040840152856060840152608083015260a0820152a1836111de5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112559761028f9660ff946040519960078b5260208b015260408a01526060890152608088015260a08701521660c08501523360e085015261010084019384604052611229856119b8565b6006855261123a6101208201612519565b61124385611ff7565b5261124d84611ff7565b503691611dfb565b808080808080808061015c565b93611146565b604051623a3a4d60e21b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112c4611886565b6044359167ffffffffffffffff91606435838111610182573660238201121561018257806004013593841161018257366024858301011161018257611351956020921693611313868587613924565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d56565b03815f855af193841561022c575f946113bd575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113a4576113999350309161399d565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113e9575b816113d9602093836119f0565b8101031261018257519284611365565b3d91506113cc565b3461018257606036600319011261018257602061142061140f611870565b611417611886565b60443591613794565b604051908152f35b3461018257611436366118b0565b8394939261144261308d565b61144d84863361315c565b61145681613190565b1561155c578061146a6114b99287336131da565b9590967f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b0384169a8b60208301528560408301526060820152a133613280565b959093826114e75760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115509661028f9560ff936040519860068a5260208a01526040890152606088015260808701521660a08501523360c085015260e08401938460405261152c856119b8565b6006855261153d6101008201612519565b61154685611fe7565b5261124d84611fe7565b8080808080808061015c565b6040516306dde9c360e41b81523360048201526001600160a01b038616602482015260448101859052606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b3461018257600319604036820112610182576004359067ffffffffffffffff808311610182578260040160a084360393840112610182576024358281116101825761160590369060040161183f565b9061160e61308d565b5f946001600160a01b03948561162386611d42565b1633036117ca5761163c6116373687611b81565b6130cf565b91825f525f60205260405f20966001885414611684575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519133835284602084015260606040840152816116b08961189c565b16606084015260248a013590606219018112156101825789019060a06080840152806116de6004840161189c565b166101008401526116f16024830161189c565b166101208301526044810135602219823603018112156101825701956024600488013597019287116101825786360383136101825760209860846117ad849361176c7f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63976117bd9c6060610140890152610160880191611d56565b61179e61179361177f6044880185611d76565b605f198a8603810160a08c01529491611dab565b926064870190611d76565b918784030160c0880152611dab565b91013560e08301520390a1613100565b8280808080808080611653565b6024866117d687611d42565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561182e575b5015158152f35b6301ffc9a760e01b14905083611827565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118f89160040161183f565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761193c57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761193c57604052565b6040810190811067ffffffffffffffff82111761193c57604052565b6080810190811067ffffffffffffffff82111761193c57604052565b67ffffffffffffffff811161193c57604052565b60e0810190811067ffffffffffffffff82111761193c57604052565b6020810190811067ffffffffffffffff82111761193c57604052565b90601f8019910116810190811067ffffffffffffffff82111761193c57604052565b92919267ffffffffffffffff821161193c5760405191611a3c601f8201601f1916602001846119f0565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a7393359101611a12565b90565b91906060838203126101825760405190611a8f82611950565b8193611a9a8161189c565b8352611aa86020820161189c565b602084015260408101359167ffffffffffffffff831161018257604092611acf9201611a58565b910152565b67ffffffffffffffff811161193c5760051b60200190565b929192611af882611ad4565b604092611b0860405192836119f0565b819581835260208093019160061b84019381851161018257915b848310611b3157505050505050565b8583830312610182578386918251611b488161196c565b611b518661189c565b81528286013583820152815201920191611b22565b9080601f8301121561018257816020611a7393359101611aec565b91909160a0818403126101825760405190611b9b82611920565b8193611ba68261189c565b835267ffffffffffffffff9160208101358381116101825782611bca918301611a76565b602085015260408101358381116101825782611be7918301611b66565b6040850152606081013592831161018257611c086080939284938301611b66565b60608501520135910152565b909291611c2084611ad4565b916040611c3060405194856119f0565b839580855260208095019160059160051b8401948086116101825784935b868510611c5f575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c8a81611950565b611c938361189c565b81528a83013584811161018257830185601f8201121561018257803590611cb982611ad4565b91611cc6895193846119f0565b8083528d808401918b1b83010191888311610182578e809101915b838310611d1757509150508201528583013593841161018257611d08858c95869501611a58565b86820152815201940193611c4e565b82358152918101918f9101611ce1565b9080601f8301121561018257816020611a7393359101611c14565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dc8575050505090565b909192936001906001600160a01b03611de08761189c565b16815285830135838201526040908101950193920190611dba565b90929192611e0881611ad4565b91604091611e1960405194856119f0565b839581855260208095019160051b8301938185116101825783925b858410611e445750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e6e8161196c565b82358481116101825786611e83918501611a76565b81528983013593841161018257611e9e868b95869501611d27565b83820152815201930192611e34565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ef082611950565b60606040835f81525f60208201520152565b60405190611f0f82611920565b5f608083828152611f1e611ee3565b6020820152606060408201526060808201520152565b9015610e7857803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e785760061b0190565b805115610e785760200190565b805160011015610e785760400190565b805160021015610e785760600190565b805160031015610e785760800190565b805160041015610e785760a00190565b805160051015610e785760c00190565b8051821015610e785760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612047575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612039565b906080806120e56120d36120c160406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118fc565b60408701518682036040880152612028565b60608601518582036060870152612028565b93015191015290565b9081518082526020808093019301915f5b82811061210d575050505090565b8351855293810193928101926001016120ff565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b9061218161163761217a8480611f4f565b3690611b81565b5f5260205f81526040926001845f20540361250e57916124039161220885855f6123886121b1836121c89a611f4f565b6121cd878501359182878701359c8d923690611b81565b613aca565b6121e56121da8580611f4f565b946060810190611ead565b96906122008751966121f6886119d4565b8688523690611b81565b973691611c14565b90612211613aff565b50612338865191612221836119b8565b600683526122308a8401612519565b8861223a816130cf565b988b6001600160a01b039a8b84511690835192600384528301528282015233606082015260808101825261226d86611faa565b5261227785611faa565b50805161228381611950565b6002815281368e83013761229686611fb7565b526122a085611fb7565b50810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b51511661473f565b975116906122d4898851612007565b515116846122e38a8951612007565b51015191613794565b958d6122f9828751612007565b5151169451612007565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61234182611fc7565b5261234b81611fc7565b5061236f8b886060810160ff8c6123036122ec8d806122c5816122bd8b8a51612007565b61237882611fd7565b5261238281611fd7565b5061450d565b918385511693868601918b83519289818551169401511693878652308a528180872091510151908251926123bb846119d4565b87845251956123c9876119b8565b86528a8601528d85015284606085015285608085015260a084015260c08301528a5180809a819463d04dfe2360e01b835260048301613488565b03915afa95865f915f986124e8575b506124215788513d5f823e3d90fd5b95938651600281106124d15750888798998260c0979899015199015161244f61244985611fe7565b51611fd7565b5161245a8183613dcb565b156124c75750998a925b6124868b85919060405192600284526020840152604083015260608201604052565b61248f86611fc7565b5261249985611fc7565b508251966124a6886119b8565b8752860152840152866060840152608083015260a082015201526001929190565b9050998a92612464565b6024908a5190630fbb8e5560e21b82526004820152fd5b90975061250791503d805f833e6124ff81836119f0565b810190613344565b965f612412565b505f92508291829150565b5f5b60c08110612527575050565b60608282015260200161251b565b5f5b82811061254357505050565b606082820152602001612537565b926001600160a01b038451166001600160a01b038351161461307b576001600160a01b03612586606086015160643590612007565b5151166001600160a01b036125a2604085015160843590612007565b5151161480159061303b575b610e32576001600160a01b036125cb604086015160443590612007565b5151166001600160a01b036125e66064356060880151612007565b51511614613029576125f7846130cf565b805f525f60205260405f205415612fd95750612612826130cf565b805f525f60205260405f205415612f895750612928907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061267561266761012033845280602085015283018a61206f565b82810360408401528761206f565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16128956001600160a01b0384511691604051926126c5846119d4565b5f84526126d0613aff565b50604051906126de826119b8565b600682526126ee60208301612519565b6126f7896130cf565b906001600160a01b038a5116604051926004845260208401526040830152606082015233608082015260a0810160405261273082611faa565b5261273a81611faa565b5060405161274781611950565b60028152604036602083013761275c82611fb7565b5261276681611fb7565b506127f46127856001600160a01b036122bd60443560408d0151612007565b6127c26001600160a01b038b51168b60206122e36001600160a01b036127b16044356040860151612007565b515116926040604435910151612007565b908a60ff60206123036001600160a01b036127e36044356040870151612007565b515116936040604435910151612007565b6127fd82611fc7565b5261280781611fc7565b5061236f6128266001600160a01b036122bd60643560608d0151612007565b6128636001600160a01b038b51168b60206122e36001600160a01b036128526064356060860151612007565b515116926060606435910151612007565b908a60ff60206123036001600160a01b036128846064356060870151612007565b515116936060606435910151612007565b905f6001600160a01b038751169160208801908151906001600160a01b03602081845116930151169285855230602052604080862091510151604051916128db836119d4565b868352604051956128eb876119b8565b86526020860152604085015284606085015286608085015260a084015260c0830152604051808097819463d04dfe2360e01b835260048301613488565b03915afa92835f915f95612f6b575b50612947576040513d5f823e3d90fd5b9291835160028110612f2d57506040602085015194015161296a61244983611fe7565b516129758183613dcb565b15612f635750935b61299f8186919060405192600284526020840152604083015260608201604052565b6129a883611fc7565b526129b282611fc7565b50604051946129c0866119b8565b888652606435602087015260408601526060850152608084015260a083015260c0820152612bc86001600160a01b038551169360405194612a00866119d4565b5f8652612a0b613aff565b5060405190612a19826119b8565b60068252612a2960208301612519565b612a32866130cf565b906001600160a01b03875116604051926004845260208401526040830152606082015233608082015260a08101604052612a6b82611faa565b52612a7581611faa565b50604051612a8281611950565b600281526040366020830137612a9782611fb7565b52612aa181611fb7565b50612b2b612ac06001600160a01b036122bd60843560408a0151612007565b612afb6001600160a01b038851166001600160a01b03612ae660843560408c0151612007565b51511660206122e360843560408d0151612007565b906001600160a01b03612b1460843560408b0151612007565b51511660ff602061230360843560408d0151612007565b612b3482611fc7565b52612b3e81611fc7565b5061236f612b5d6001600160a01b036122bd60a43560608a0151612007565b612b986001600160a01b038851166001600160a01b03612b8360a43560608c0151612007565b51511660206122e360a43560608d0151612007565b906001600160a01b03612bb160a43560608b0151612007565b51511660ff602061230360a43560608d0151612007565b92612c5e5f6001600160a01b038551169260208601908151906001600160a01b0360208184511693015116928685523060205260408086209151015160405191612c11836119d4565b86835260405195612c21876119b8565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93612f45575b50612c7d576040513d5f823e3d90fd5b90815160028110612f2d575060406020830151920151612c9f61244988611fe7565b51612caa8183613dcb565b15612f255750925b612cd48385919060405192600284526020840152604083015260608201604052565b612cdd88611fc7565b52612ce787611fc7565b5060405196612cf5886119b8565b86885260a43560208901526040880194855260608801938452608088015260a087015260c0860152612d2a6040840151613190565b15918215612f11575b508115612efc575b8115612eeb575b50612ed95760405191612d5483611988565b5f83525f60208401525f60408401525f6060840152612d738483615106565b84526040840152612d99612d878386615106565b60208601528060608601528451613e96565b94612dad6020850151604086015190613e96565b93612db787613da8565b8015612eca575b612eb857612e7f612eb1957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d94612e61612eb69a60a096612e008a8851613eea565b612e0e8c6020890151613eea565b612e1c8a6040890151613f48565b612e2a8c6060890151613f48565b612e338a614233565b612e3c8c614233565b6001600160a01b03612e5860c435926060606435910151612007565b51511633613280565b50506001600160a01b03612e5860e43592606060a435910151612007565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a161405a565b61405a565b565b604051630d86822160e01b8152600490fd5b50612ed485613da8565b612dbe565b6040516321badf1f60e01b8152600490fd5b612ef6915051613da8565b5f612d42565b9050612f0b6060830151613da8565b90612d3b565b612f1d91925051613190565b15905f612d33565b905092612cb2565b60249060405190630fbb8e5560e21b82526004820152fd5b909250612f5c91503d805f833e6124ff81836119f0565b915f612c6d565b90509361297d565b909450612f8291503d805f833e6124ff81836119f0565b935f612937565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612fd4565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03613055606084015160a43590612007565b5151166001600160a01b03613071604087015160443590612007565b51511614156125ae565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0060028154146130bd5760029055565b604051633ee5aeb560e01b8152600490fd5b6040516130fa816130ec602082019460208652604083019061206f565b03601f1981018352826119f0565b51902090565b612eb6929161312b61028f923390919060405192600284526020840152604083015260608201604052565b9260405193613139856119b8565b6006855261314960208601612519565b61315285611faa565b5261124d84611faa565b909115613167575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6131af905f60e01d906001600160e01b038160e01d9116601b0b615169565b1290565b906131af916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b9291926131e68261442e565b936131f081613da8565b61326e5784816001600160e01b0361320f9360e01d9116601b0b615269565b9290809315613245575b50829081613229575b5050509190565b61323d926001600160a01b0330921661399d565b5f8181613222565b9092505f19811461325a57600101915f613219565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361328d83613da8565b61332b57846132a9576132a1939450613a61565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613ec0565b956132f087613da8565b613313575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261337f82611ad4565b9161338d60405193846119f0565b808352848084019160051b830101918683116101825785809101915b83831061341c5750505050948281015191821161018257019180601f840112156101825782516133d881611ad4565b936133e660405195866119f0565b818552838086019260051b820101928311610182578301905b82821061340d575050505090565b815181529083019083016133ff565b82518152918101918691016133a9565b90808251908181526020809101926020808460051b8301019501935f915b84831061345a5750505050505090565b9091929394958480613478600193601f198682030187528a516120ee565b980193019301919493929061344a565b91906020928381526001600160a01b03825116848201528382015160408201526134c2604083015160e060608401526101008301906118fc565b90606083015160808201526134e9608084015192601f1993848483030160a085015261342c565b9260a081015193838382030160c08401528680865192838152019501905f5b81811061352c57505050611a7394955060c060e091015192828503019101526120ee565b825187529588019591880191600101613508565b90604082019082526020606081936040838201528551809452019301915f5b82811061356d575050505090565b83518552938101939281019260010161355f565b919091604092835192613593846119b8565b600684526020946135a5868601612519565b5f5b84518110156135da57806135bd60019287612007565b516135c88289612007565b526135d38188612007565b50016135a7565b50925092939093335f52308252825f20918351956135f78761196c565b6135ff611ee3565b875260608281980152845190613614826119d4565b5f8252855190613623826119d4565b5f82525f3681375f5b8151811015613788578986886136428486612007565b51888151948d80870151908151613664575b505050505050505060010161362c565b905f92916001600160a01b03966136898887818d51169c01511699878901519061450d565b958251996136968b6119b8565b8a5289015287015285015260808401528760a08401528660c08401525f8c51809563d04dfe2360e01b825281806136d1600498898301613488565b03915afa93841561377e579089915f95613760575b5084516136fc575b50899250808e8c938e613654565b5101511691823b156101825761372a925f92838d5180968195829463012c676d60e21b845233908401613540565b03925af18015613756579060019291613747575b819287826136ee565b613750906119a4565b5f61373e565b89513d5f823e3d90fd5b6137759195503d805f833e6124ff81836119f0565b9050935f6136e6565b8c513d5f823e3d90fd5b50505050505050509050565b82156137c9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506137d58261473f565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156138eb575f976138f5575b508361382c6138258361385c9a61541e565b5090614ba9565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156138eb575f976138ba575b5061382561388091611a739861541e565b5061388b8183613dcb565b156138b25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ec0565b905093613893565b96508387813d83116138e4575b6138d181836119f0565b810103126101825795519561382561386f565b503d6138c7565b85513d5f823e3d90fd5b96508387813d831161391d575b61390c81836119f0565b810103126101825795519583613813565b503d613902565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561397e575b836040521561396857505050565b635274afe760e01b835216600482015260249150fd5b600181151661399457813b15153d15161661395a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156139ed575b836040525f6060521561396857505050565b600181151661399457813b15153d1516166139db565b93929193613a1083613da8565b61332b5784613a24576132a19394506131da565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526132e6835f20549485613e96565b90929192613a6e8161442e565b93613a7881613da8565b613ab85784816001600160e01b03613a979360e01d9116601b0b615269565b50809281613aa6575050509190565b6001600160a01b0361323d9316613924565b604051632d1671a360e11b8152600490fd5b91613af5906060613aea936001600160a01b039485916040880151612007565b515116940151612007565b5151161461302957565b60405190613b0c826119b8565b606060c083613b19611f02565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b95949193908693613b4b613aff565b50604092613c39845191613b5e836119b8565b60068352602092613b70848201612519565b613c03613b7c8a6130cf565b966001600160a01b0397888c51168a519160038352888301528a820152886060981688820152608081018a52613bb184611faa565b52613bbb83611faa565b508851613bc781611950565b60028152893688830137613bda84611fb7565b52613be483611fb7565b508a89810160ff886123036122ec8d806122c5816122bd8b8a51612007565b613c0c82611fc7565b52613c1681611fc7565b5061236f8a8a87810160ff886123036122ec8d806122c5816122bd8b8a51612007565b93613cb95f8589511697859685879b0191825191878184511693015116928b85523088528680862091510151875191613c71836119d4565b868352885195613c80876119b8565b8652898601528785015284898501528a608085015260a084015260c08301528451808095819463d04dfe2360e01b835260048301613488565b03915afa90815f915f93613d8a575b50613d7e575b5050600284511097881598613d6c578183860151950151613cf161244988611fe7565b51613cfc8183613dcb565b15613d645750925b613d268685919060405192600284526020840152604083015260608201604052565b613d2f88611fc7565b52613d3987611fc7565b5082519b613d468d6119b8565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613d04565b50505050505050509150611a73613aff565b90975093505f80613cce565b909250613da191503d805f833e6124ff81836119f0565b915f613cc8565b613dc7905f60e01d906001600160e01b038160e01d9116601b0b615169565b1390565b90613dc7916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b6151ea565b613e196001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614960565b90637ffffff58213613e69575b90613e3091614ba9565b9290921580613e61575b613e4357505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613e3a565b613e738282615849565b15613e2657604483856040519163d556b11160e01b835260048301526024820152fd5b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614daf565b611a7391610c2c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614f73565b613f44916080810182613f06613f008351611fe7565b51611fe7565b52613f3d613f376001600160a01b03809451511693613f2e613f288551611fe7565b51611faa565b51169251611fe7565b51611fc7565b5191613a03565b5050565b90608081019180613f5c613f008551611fd7565b526001600160a01b03809251511691613f78613f288551611fd7565b5116613f87613f378551611fd7565b51908161402257613f9783613da8565b61332b579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd4955f5260209060018252613fed604094855f20835f528452855f20855f528452855f2054613ec0565b945f5260018252835f20905f528152825f20915f52525f20555b5160405191829133835260406020840152604083019061342c565b91614053917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612fd495613280565b5050614007565b60c0810151908151915f926141ce575b5061410f6020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b51916140b7836119d4565b8683528c51936140c6856119d4565b8785528d51966140d5886119b8565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301613488565b03915afa9485156141c45787956141a6575b508451614132575b50505050505050565b81905101510151169051813b156141a257918491849383614167965180978195829463012c676d60e21b845260048401613540565b03925af19081156141995750614182575b8080808080614129565b61418c82916119a4565b6141965780614178565b80fd5b513d84823e3d90fd5b8480fd5b6141bb9195503d8089833e6124ff81836119f0565b9050935f614121565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257614211925f928360405180968195829463012c676d60e21b845260048401613540565b03925af1801561022c571561406a5761422b9192506119a4565b5f905f61406a565b60808101614244613f378251611fd7565b5191821561425157505050565b61426b613f286001600160a01b0380935151169351611fd7565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b0385166142a6575b505050505050565b6142ca955f9284845260018152828420868552815282842091845252812055613a61565b5f80808061429e565b81156142dd570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614339576020810151908051603f19810190811161325a5760051c82116143255760016020920160051b010190565b5050604051614333816119d4565b5f815290565b50604051614333816119d4565b80511561435657602001515f1a90565b505f90565b905f8091602081519101845af480806143d9575b1561438f5750506040513d81523d5f602083013e60203d82010160405290565b156143b657604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156143c7576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d15158061436f5750813b151561436f565b600411156143f657565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b03604082019516815261442a836143ec565b0152565b614436615937565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315614504575f925f946144cf575b5061448c836143ec565b6001831415806144bd575b6144a15750505090565b5163ee07877f60e01b81529182916106df91906004840161440a565b506144c7836143ec565b821515614497565b908094506144f39293503d85116144fd575b6144eb81836119f0565b81019061523f565b919091925f614482565b503d6144e1565b513d5f823e3d90fd5b9080519161451a83611ad4565b9161453560409461452d865195866119f0565b808552611ad4565b601f19946020918601368684013783518351909590801561473457600161458b9101965b600197889101019761458261456d8a611ad4565b9961457a86519b8c6119f0565b808b52611ad4565b01848901612535565b85805f96845160028152338782015230868201526060810186526145ae8b611faa565b526145b88a611faa565b505f925b6146f0575b50505083516145d4575b50505050505090565b858095989796929801816145e88289612007565b526145f38188612007565b505f925b614606575b50859697506145cb565b84518310156146eb576001600160a01b0361467d816146258689612007565b51511686614633878a612007565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c614674888b612007565b51015191615395565b156146d357868098999a928192614694878a612007565b5151166146a18787612007565b520193856146af8289612007565b5101516146bc868c612007565b526146c7858b612007565b500192909897966145f7565b8951630a57f30960e31b815260048101859052602490fd5b6145fc565b909196815188101561472b57828091019761470b8184612007565b516147168a8d612007565b52614721898c612007565b50019190816145bc565b968291506145c1565b5061458b5f96614559565b614747615937565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315614504575f925f946144cf575061448c836143ec565b9091939284158215175f146147b55750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6148ec575b50506147d88161550e565b936147e28161550e565b946147ed868261552e565b909182156148dd575f9083986f0785ee10d5da46d900f436a0000000008086116148cf575b50670de0b6b3a7640000808b116148c0575b50633b9aca00808b116148b1575b50612710808b116148a3575b5098805b614892575081906118f8989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615541565b60019290920191600a900480614842565b60049a04998a93019261483e565b600991939a049901915f614832565b601291939a049901915f614824565b85049950602592505f614812565b509290506118f8949550615541565b5f82121561494057808413614932575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156147cd579092506118f893949161544c565b9092506118f89394916154b3565b808412156148fc579092506118f893949161544c565b613e308282614ba9565b92909180614986576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461499b57505050505f905f90565b6149b4936149a8916155fb565b929194909384926155fb565b90939192846149c28861550e565b916149cc8661550e565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614b73575b030191600160ff1b98838a018112155f14614b40575050035b5f955f821280614b37575b614b19575b5f811280614b07575b614ae95786820103966001600160ff1b0388149081614adf575b5080614ad6575b80614acd575b614aaf575090614a6392916157a7565b915f8113614a76575b506118f893615541565b9091604c8213614aa457614a8d91600a0a906142d3565b908115614a9a575f614a6c565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f8512614a53565b50828414614a4d565b905088145f614a46565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614a2c565b9550808701861315614b315786818703015b95614a23565b5f614b2b565b505f8113614a1e565b89985090920390506001600160ff1b0381900387018213614b645701860194614a13565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506149fa565b81156142dd570590565b8082601b82810b8314614d9e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614d4a575b8380820b03614d3957507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614cea575b838060030b03614c6e575b808413614c525750506001600160e01b036001925b60e01b91161791565b8303600a0a80156142dd576001600160e01b0391071592614c49565b92915f841315614cbe575090614c848383615849565b614ca057637ffffffe1901600a0a810290637fffffff92614c34565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff199283039060438213614aa457614cdd91600a0a90614b9f565b918215614a9a5792614c34565b5f198401808060030b14614cfe5750614c29565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614bdc565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614d8b576305f5e100600894058094819201955b915050614bdc565b620186a060059405809481920195614d83565b5082614c2957505050505f90600190565b919291600160ff1b8401614dc7576118f89350615862565b906118f8935f0391614f73565b919291600160ff1b9190801580614f61575090614df0916155fb565b9490929091905f868585858282138015614f58575b614f3b575b505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084614f06575b505081019182821860ff1c1115614efe57826001600160ff1b0314614ee057905f600192135f14614eb157600a9004915b01925b81158117614e7557509190565b80614e8e575b508015614e86579190565b505f91508190565b9192614ea49203600160ff1b01600a0a90614b9f565b600160ff1b91905f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614e65565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614e68565b8107614f13575b80614e34565b60ff1d600117015f614f0d565b505050919350614f2e579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614e0a565b50835f12614e05565b15614f6c5750509190565b9350919050565b93929193841581158181176150c457505090614f8e916155fb565b9194908295614f9f829582946155fb565b80969294919693878684821380156150bb575b6150a2575b5050505050508682841860ff1c94860391039081604c038111614f205701600a0a808205919084615088575b505081019182821860ff1c111561508057826001600160ff1b0314614ee057905f600192135f1461505157600a9004915b01925b8115811761502457509190565b8061503457508015614e86579190565b600160ff1b9361504b9291038401600a0a90614b9f565b5f614e7b565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191615014565b509092615017565b8107615095575b80614fe3565b60ff1d600117015f61508f565b929b5098509196509450925090505f8080808080614fb7565b50858412614fb2565b93959390929190156150da575050614e86579190565b945092915050565b6008815110614356576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040615140610c2c606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61479b565b9451930161514f8151866131b3565b615157575050565b909350611a7391925051925183613df2565b92915f9060018184145f871287151717176151e3575f928082136151d5575b03604c81135f8212176151c957600a0a90846151a78382029384614b9f565b146151bc575050156151b8575f9190565b5f90565b9093509015611a73579190565b5050156151b8575f9190565b5f9560019450925090615188565b5050505f90565b93929190918083145f83125f87121883158715171717615239575f9280821361522c5703604c81135f8212176151c957600a0a90846151a78382029384614b9f565b9194600193509190615188565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615291576044838360405191634a7d166b60e01b835260048301526024820152fd5b9192836152a357505090505f90600190565b60ff811682019180831261536b575f8312156152db575050604c198112614e86575f03600a0a916152d483826142d3565b9283021490565b909293915f81135f1461536157604d811361533657600a0a9283156142dd57835f1904831161530d5750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6153d0576153a791926159a0565b506153b1816143ec565b1591826153bd57505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461544457600a6001818404940192061590565b909190600190565b909392915f61545c91818461479b565b9490945f84830191820194121590816154a9575b811561549f575b5061548157505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f615477565b8281129150615470565b6154c893600160fe1b9081019392019061479b565b9081815f8212156154ff575050604b1982126132a1576154ed915f03600a0a90614b9f565b90816154f7575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a7357600160ff1b90808203615527575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156155d6576001600160ff1b0392838311156155c057600160ff1b9383850361557657505050509190565b90919293508514615590575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461325a575f039190565b90916001600160ff1b0380841115613222578514615590575050600a60019104920190565b919091801561579d57827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000808305156156ab575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc83011061569c575b83136156865791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f19019261567a565b6f4b3b4ca85a86c47a098a2240000000008084051561578b575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515615774575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615760575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561575057820515615741575b5f61562f565b9290600a02905f19019261573b565b939160640291600119019361570c565b93916402540be4000291600919019361570c565b9391678ac7230489e80000029160121901936156e7565b6025198301955092909202915f6156c5565b505f915081908190565b90915f198383099280830292838086109503948086039584871015615825571461581d579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a7391905f81121561585d575f036159da565b6159da565b909291600160ff1b918281016158f457508084146158ea578084139182156158e2578185035b604c8111156158d15750505f915b156158c257507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156142dd570491615896565b848203615888565b505090505f905f90565b9361590192945f03614dd4565b80939180928114615915575b50505f039190565b915092506001600160ff1b038314614ee057600a600191059201915f8061590d565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b158015615975575b61595d5750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415615956565b81519190604183036159d0576159c99250602082015190606060408401519301515f1a90615a69565b9192909190565b50505f9160029190565b90637ffffff5811315615a6357637ffffffe1981019060438213615a5c575f821215615a3057637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156142dd577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615ae0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b03811615615ad657905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; diff --git a/src/lib/LibRaindex.sol b/src/lib/LibRaindex.sol index 83542fb5aa..8608f3427d 100644 --- a/src/lib/LibRaindex.sol +++ b/src/lib/LibRaindex.sol @@ -30,16 +30,16 @@ uint256 constant CONTEXT_COLUMNS = CALLING_CONTEXT_COLUMNS + 1; /// including the first signed context column. uint256 constant CONTEXT_COLUMNS_EXTENDED = CONTEXT_SIGNED_CONTEXT_START_COLUMN + 1; -/// @dev Contextual data available to both calculate order and handle IO. The -/// order hash, order owner and order counterparty. IMPORTANT NOTE that the -/// typical base context of an order with the caller will often be an unrelated -/// clearer of the order rather than the owner or counterparty. +/// @dev Order column. Clear gets all rows; take and quote omit the clearer; +/// add and remove order tasks get only the order hash and owner. IMPORTANT NOTE +/// that the clearer will often be unrelated to the owner or counterparty. uint256 constant CONTEXT_CALLING_CONTEXT_COLUMN = 1; -uint256 constant CONTEXT_CALLING_CONTEXT_ROWS = 3; +uint256 constant CONTEXT_CALLING_CONTEXT_ROWS = 4; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH = 0; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER = 1; uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY = 2; +uint256 constant CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER = 3; /// @dev Deposit column. Filled only for deposit tasks. uint256 constant CONTEXT_DEPOSIT_COLUMN = 5; diff --git a/src/lib/LibRaindexSubParser.sol b/src/lib/LibRaindexSubParser.sol index c97a55bdd0..3e86d0e4ed 100644 --- a/src/lib/LibRaindexSubParser.sol +++ b/src/lib/LibRaindexSubParser.sol @@ -12,6 +12,11 @@ import { CONTEXT_BASE_ROWS } from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; import { + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, + CONTEXT_DEPOSIT_COLUMN, + CONTEXT_WITHDRAW_COLUMN, + CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_DEPOSITOR, + CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER, CONTEXT_COLUMNS_EXTENDED, CONTEXT_VAULT_OUTPUTS_COLUMN, CONTEXT_VAULT_INPUTS_COLUMN, @@ -36,10 +41,6 @@ import { CONTEXT_SIGNED_CONTEXT_START_COLUMN, CONTEXT_SIGNED_CONTEXT_START_ROW, CONTEXT_SIGNED_CONTEXT_START_ROWS, - CONTEXT_DEPOSIT_COLUMN, - CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_DEPOSITOR, - CONTEXT_WITHDRAW_COLUMN, - CONTEXT_CALLING_CONTEXT_ROW_WITHDRAW_WITHDRAWER, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_TOKEN, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_ID, CONTEXT_CALLING_CONTEXT_ROW_DEPOSIT_VAULT_BEFORE, @@ -56,6 +57,7 @@ import { uint256 constant SUB_PARSER_WORD_PARSERS_LENGTH = 2; uint8 constant EXTERN_PARSE_META_BUILD_DEPTH = 1; +bytes constant WORD_SENDER = "sender"; bytes constant WORD_ORDER_CLEARER = "order-clearer"; bytes constant WORD_RAINDEX = "raindex"; bytes constant WORD_ORDER_HASH = "order-hash"; @@ -118,6 +120,16 @@ library LibRaindexSubParser { return LibSubParse.subParserContext(CONTEXT_BASE_COLUMN, CONTEXT_BASE_ROW_SENDER); } + /// @dev Maps the "order-clearer" word to the calling context column. + function subParserOrderClearer(uint256, uint256, OperandV2) + internal + pure + returns (bool, bytes memory, bytes32[] memory) + { + //slither-disable-next-line unused-return + return LibSubParse.subParserContext(CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER); + } + /// @dev Maps the "depositor" word to the deposit column. function subParserDepositor(uint256, uint256, OperandV2) internal @@ -436,20 +448,18 @@ library LibRaindexSubParser { /// @dev Builds the complete authoring metadata for all raindex context /// words. Returns ABI-encoded `AuthoringMetaV2[]` covering every context - /// column (base, calling, calculations, vault IO, deposit, withdraw, - /// signers, signed context). The inner arrays are flattened before encoding. + /// column (base, order, calculations, vault IO, deposit, withdraw, signers, + /// signed context). The inner arrays are flattened before encoding. //slither-disable-next-line dead-code function authoringMetaV2() internal pure returns (bytes memory) { AuthoringMetaV2[][] memory meta = new AuthoringMetaV2[][](CONTEXT_COLUMNS_EXTENDED); AuthoringMetaV2[] memory contextBaseMeta = new AuthoringMetaV2[](CONTEXT_BASE_ROWS); - contextBaseMeta[CONTEXT_BASE_ROW_SENDER] = AuthoringMetaV2( - // constant WORD_ORDER_CLEARER defined above is less than 32 bytes, - // so this conversion is safe. - // forge-lint: disable-next-line(unsafe-typecast) - bytes32(WORD_ORDER_CLEARER), - "The order clearer is the address that submitted the transaction that is causing the order to execute. This MAY be the counterparty, e.g. when an order is being taken directly, but it MAY NOT be the counterparty if a third party is clearing two orders against each other." - ); + contextBaseMeta[CONTEXT_BASE_ROW_SENDER] = + // constant WORD_SENDER defined above is less than 32 bytes, so this + // conversion is safe. + // forge-lint: disable-next-line(unsafe-typecast) + AuthoringMetaV2(bytes32(WORD_SENDER), "The address that called the raindex entrypoint."); contextBaseMeta[CONTEXT_BASE_ROW_CALLING_CONTRACT] = // constant WORD_RAINDEX defined above is less than 32 bytes, so // this conversion is safe. @@ -474,6 +484,13 @@ library LibRaindexSubParser { bytes32(WORD_ORDER_COUNTERPARTY), "The address of the owner of the counterparty order. Will be the order taker if there is no counterparty order." ); + contextCallingContextMeta[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = AuthoringMetaV2( + // constant WORD_ORDER_CLEARER defined above is less than 32 bytes, + // so this conversion is safe. + // forge-lint: disable-next-line(unsafe-typecast) + bytes32(WORD_ORDER_CLEARER), + "The address that called clear, matching this order against a counterparty order. Only available in clears; reverts when the order is taken or quoted." + ); AuthoringMetaV2[] memory contextCalculationsMeta = new AuthoringMetaV2[](CONTEXT_CALCULATIONS_ROWS); contextCalculationsMeta[CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT] = AuthoringMetaV2( diff --git a/test/concrete/parser/RaindexV6SubParser.contextSender.t.sol b/test/concrete/parser/RaindexV6SubParser.contextSender.t.sol new file mode 100644 index 0000000000..f421152f55 --- /dev/null +++ b/test/concrete/parser/RaindexV6SubParser.contextSender.t.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RaindexV6SubParserContextTest} from "test/util/abstract/RaindexV6SubParserContextTest.sol"; + +contract RaindexV6SubParserContextSenderTest is RaindexV6SubParserContextTest { + function word() internal pure override returns (string memory) { + return "sender"; + } +} diff --git a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol index cf221ee494..80aeedebc7 100644 --- a/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.operandHandlersWiring.t.sol @@ -11,7 +11,7 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// `[column][row]` matrix of internal operand-handler function pointers into a /// flat table of 16-bit pointers (two bytes per slot, column-major then row /// order), exactly mirroring the word-parser table. EVERY plain context word -/// (base / calling / calculations / vault-in / vault-out / deposit / withdraw) +/// (base / order / calculations / vault-in / vault-out / deposit / withdraw) /// is wired to the SAME `LibParseOperand.handleOperandDisallowed` function, so /// those slots all share one 16-bit pointer. Only TWO slots are different: /// - signers (column 7, row 0) -> `handleOperandSingleFullNoDefault` @@ -25,7 +25,7 @@ import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParse /// deterministically covers the operand-handler outer length, the column /// assignments, and the deposit/withdraw column offsets: any of those mutations /// changes the table length and/or relocates the two distinct handler pointers -/// off slots 30/31. +/// off slots 31/32. contract RaindexV6SubParserOperandHandlersWiringTest is Test { RaindexV6SubParser internal subParser; @@ -35,32 +35,36 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { // Flat slot indices into the operand-handler pointer table (column-major): // col 0 base (2 rows) -> 0, 1 - // col 1 calling context (3 rows) -> 2, 3, 4 - // col 2 calculations (2 rows) -> 5, 6 - // col 3 vault inputs (5 rows) -> 7..11 - // col 4 vault outputs (5 rows) -> 12..16 - // col 5 deposit (6 rows) -> 17..22 - // col 6 withdraw (7 rows) -> 23..29 - // col 7 signers (1 row) -> 30 - // col 8 signed context (1 row) -> 31 - uint256 internal constant TABLE_SLOTS = 32; - uint256 internal constant SLOT_SIGNERS = 30; - uint256 internal constant SLOT_SIGNED_CONTEXT = 31; + // col 1 order (4 rows) -> 2..5 + // col 2 calculations (2 rows) -> 6, 7 + // col 3 vault inputs (5 rows) -> 8..12 + // col 4 vault outputs (5 rows) -> 13..17 + // col 5 deposit (6 rows) -> 18..23 + // col 6 withdraw (7 rows) -> 24..30 + // col 7 signers (1 row) -> 31 + // col 8 signed context (1 row) -> 32 + uint256 internal constant TABLE_SLOTS = 33; + uint256 internal constant SLOT_SIGNERS = 31; + uint256 internal constant SLOT_SIGNED_CONTEXT = 32; + uint256 internal constant SLOT_DEPOSIT_FIRST = 18; /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the /// freshly built operand-handler table, asserting the table is the expected - /// 64 bytes (32 16-bit slots). + /// 66 bytes (33 16-bit slots). function pointerAt(uint256 slot) internal view returns (uint16) { bytes memory table = subParser.buildOperandHandlerFunctionPointers(); - assertEq(table.length, TABLE_SLOTS * 2, "operand handler table must hold 32 16-bit pointers"); + assertEq(table.length, TABLE_SLOTS * 2, "operand handler table must hold 33 16-bit pointers"); uint256 byteIndex = slot * 2; return (uint16(uint8(table[byteIndex])) << 8) | uint16(uint8(table[byteIndex + 1])); } - /// The operand-handler table holds exactly 32 slots (64 bytes); any outer - /// length or column offset mutation that drops a column is caught by the - /// guard inside `pointerAt`. + /// The operand-handler table holds exactly 33 slots (66 bytes), matching the + /// extended context column/row layout. A mutation to the outer matrix length + /// (`new ...[][](CONTEXT_COLUMNS_EXTENDED)`) or to the deposit/withdraw column + /// offset (which displaces or drops a whole column) changes this length and + /// is caught by the guard inside `pointerAt`. Reading slot 0 exercises it. function testOperandHandlerTableLength() external view { + // pointerAt asserts table.length == 66; any wrong length reverts here. pointerAt(0); } @@ -68,6 +72,7 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { /// disallowed pointer; the signers slot (column 7, row 0) differs. function testSignersOperandHandlerIsDistinct() external view { uint16 disallowed = pointerAt(0); + // Every plain context slot before signers shares the disallowed pointer. for (uint256 slot = 0; slot < SLOT_SIGNERS; slot++) { assertEq(pointerAt(slot), disallowed, "plain context slot uses handleOperandDisallowed"); } @@ -88,11 +93,11 @@ contract RaindexV6SubParserOperandHandlersWiringTest is Test { ); } - /// Every deposit (slots 17..22) and withdraw (slots 23..29) slot is the + /// Every deposit (slots 18..23) and withdraw (slots 24..30) slot is the /// shared disallowed pointer. function testDepositWithdrawOperandHandlersAllDisallowed() external view { uint16 disallowed = pointerAt(0); - for (uint256 slot = 17; slot < SLOT_SIGNERS; slot++) { + for (uint256 slot = SLOT_DEPOSIT_FIRST; slot < SLOT_SIGNERS; slot++) { assertEq(pointerAt(slot), disallowed, "deposit/withdraw operand slot uses handleOperandDisallowed"); } } diff --git a/test/concrete/parser/RaindexV6SubParser.routing.t.sol b/test/concrete/parser/RaindexV6SubParser.routing.t.sol index 18d2d20b0b..c8aff13e9c 100644 --- a/test/concrete/parser/RaindexV6SubParser.routing.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routing.t.sol @@ -56,7 +56,6 @@ contract RaindexV6SubParserRoutingTest is Test { // Base column (column 0). function testRouteSender() external pure { - // order-clearer -> base column 0, sender row 0. checkRoute(LibRaindexSubParser.subParserSender, 0, 0); } @@ -65,7 +64,7 @@ contract RaindexV6SubParserRoutingTest is Test { checkRoute(LibRaindexSubParser.subParserCallingContract, 0, 1); } - // Calling context column (column 1). + // Order column (column 1). function testRouteOrderHash() external pure { checkRoute(LibRaindexSubParser.subParserOrderHash, 1, 0); @@ -79,6 +78,10 @@ contract RaindexV6SubParserRoutingTest is Test { checkRoute(LibRaindexSubParser.subParserOrderCounterparty, 1, 2); } + function testRouteOrderClearer() external pure { + checkRoute(LibRaindexSubParser.subParserOrderClearer, 1, 3); + } + // Calculations column (column 2). function testRouteMaxOutput() external pure { diff --git a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol index 26aabf88b3..43a0208610 100644 --- a/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.wordParsersWiring.t.sol @@ -4,57 +4,40 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.17.0/src/Test.sol"; import {RaindexV6SubParser} from "../../../src/concrete/parser/RaindexV6SubParser.sol"; +import {DEPOSIT_WORDS_LENGTH, WITHDRAW_WORDS_LENGTH} from "../../../src/lib/LibRaindexSubParser.sol"; +import { + CONTEXT_CALLING_CONTEXT_ROWS, + CONTEXT_CALCULATIONS_ROWS, + CONTEXT_VAULT_IO_ROWS, + CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS, + CONTEXT_SIGNED_CONTEXT_START_ROWS +} from "../../../src/lib/LibRaindex.sol"; +import {CONTEXT_BASE_ROWS} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; /// @title RaindexV6SubParserWordParsersWiringTest -/// @notice Pins which library word-parser function is wired into every -/// deposit and withdraw slot of `buildSubParserWordParsers()`. The build -/// function flattens a `[column][row]` matrix of internal-function pointers -/// into a flat table of 16-bit pointers (two bytes per slot, in column-major -/// then row order). The ABSOLUTE pointer value of any slot is unstable across -/// source edits (solc reorders its internal dispatch table), so this test -/// asserts only RELATIONS BETWEEN slots WITHIN A SINGLE build output, which are -/// invariant under that reordering: a slot wired to function F has the same -/// 16-bit pointer as every other slot wired to F, and a different pointer from -/// any slot wired to a distinct function. +/// @notice Every word reads its own context cell, so no two word parsers can +/// be the same function: the flat 16-bit pointer table holds one slot per word +/// and no two slots share a pointer. contract RaindexV6SubParserWordParsersWiringTest is Test { - RaindexV6SubParser internal subParser; - - function setUp() public { - subParser = new RaindexV6SubParser(); + function wordCount() internal pure returns (uint256) { + return CONTEXT_BASE_ROWS + CONTEXT_CALLING_CONTEXT_ROWS + CONTEXT_CALCULATIONS_ROWS + CONTEXT_VAULT_IO_ROWS * 2 + + DEPOSIT_WORDS_LENGTH + WITHDRAW_WORDS_LENGTH + CONTEXT_SIGNED_CONTEXT_SIGNERS_ROWS + + CONTEXT_SIGNED_CONTEXT_START_ROWS; } - // Flat slot indices into the word-parser pointer table (column-major): - // col 0 base (2 rows) -> 0, 1 - // col 1 calling context (3 rows) -> 2, 3, 4 - // col 2 calculations (2 rows) -> 5, 6 - // col 3 vault inputs (5 rows) -> 7..11 - // col 4 vault outputs (5 rows) -> 12..16 - // col 5 deposit (6 rows) -> 17..22 - // col 6 withdraw (7 rows) -> 23..29 - // col 7 signers (1 row) -> 30 - // col 8 signed context (1 row) -> 31 - uint256 internal constant TABLE_SLOTS = 32; - uint256 internal constant SLOT_DEPOSIT_FIRST = 17; - uint256 internal constant SLOT_WITHDRAW_LAST = 29; + function testWordParsersTableHasOneSlotPerWord() external { + assertEq(new RaindexV6SubParser().buildSubParserWordParsers().length, wordCount() * 2); + } - /// @dev Read the big-endian 16-bit function pointer at flat `slot` from the - /// freshly built word-parser table. - function pointerAt(uint256 slot) internal view returns (uint16) { - bytes memory table = subParser.buildSubParserWordParsers(); - assertEq(table.length, TABLE_SLOTS * 2, "word parser table must hold 32 16-bit pointers"); - uint256 byteIndex = slot * 2; - return (uint16(uint8(table[byteIndex])) << 8) | uint16(uint8(table[byteIndex + 1])); + function testOperandHandlersTableHasOneSlotPerWord() external { + assertEq(new RaindexV6SubParser().buildOperandHandlerFunctionPointers().length, wordCount() * 2); } - /// Every deposit and withdraw word, depositor and withdrawer included, reads - /// its own cell, so each of those slots has a pointer no other slot shares. - function testDepositWithdrawSlotsAreUnique() external view { - for (uint256 slot = SLOT_DEPOSIT_FIRST; slot <= SLOT_WITHDRAW_LAST; slot++) { - uint16 pointer = pointerAt(slot); - for (uint256 other = 0; other < TABLE_SLOTS; other++) { - if (other != slot) { - assertTrue(pointer != pointerAt(other), "deposit/withdraw slot shares a parser with another slot"); - } + function testWordParsersPairwiseDistinct() external { + bytes memory table = new RaindexV6SubParser().buildSubParserWordParsers(); + for (uint256 i = 0; i < table.length; i += 2) { + for (uint256 j = i + 2; j < table.length; j += 2) { + assertTrue(table[i] != table[j] || table[i + 1] != table[j + 1], "two words share a parser"); } } } diff --git a/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol b/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol index aae3c80000..1f12769541 100644 --- a/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol +++ b/test/concrete/raindex/RaindexV6.calculateOrderIOHarness.t.sol @@ -10,6 +10,8 @@ import { CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH, CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER, CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY, + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, + CONTEXT_CALLING_CONTEXT_ROWS, CONTEXT_CALCULATIONS_COLUMN, CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT, CONTEXT_CALCULATIONS_ROW_IO_RATIO, @@ -134,7 +136,7 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { interpreter.setStack(stack); } - /// The calling-context column (column 0) is [orderHash, owner, counterparty]. + /// Outside a clear the order column is [orderHash, owner, counterparty]. /// Pins each row against a mutation that swaps a row, reuses a single value, /// or builds the wrong column. function testCallingContextColumn() external { @@ -161,6 +163,34 @@ contract RaindexV6CalculateOrderIOHarnessTest is Test { bytes32(uint256(uint160(counterparty))), "calling context counterparty" ); + assertEq(callingContext.length, CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, "no clearer row outside a clear"); + } + + /// A clear appends the clearer (`msg.sender`) to the order column. + function testCallingContextColumnClearing() external { + OrderV4 memory order = _order(); + harness.exposedIncrease(owner, outputToken, OUTPUT_VAULT_ID, LibDecimalFloat.packLossless(1000, 0)); + _setStack(LibDecimalFloat.packLossless(2, 0), LibDecimalFloat.packLossless(5, 0)); + + OrderIOCalculationV4 memory calc = + harness.exposedCalculateOrderIOClearing(order, 0, 0, counterparty, new SignedContextV1[](0)); + + bytes32[] memory callingContext = calc.context[CONTEXT_CALLING_CONTEXT_COLUMN]; + assertEq(callingContext.length, CONTEXT_CALLING_CONTEXT_ROWS, "clearer row in a clear"); + assertEq(callingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH], order.hash(), "order hash"); + assertEq( + callingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER], bytes32(uint256(uint160(owner))), "order owner" + ); + assertEq( + callingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY], + bytes32(uint256(uint160(counterparty))), + "counterparty" + ); + assertEq( + callingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER], + bytes32(uint256(uint160(address(this)))), + "clearer" + ); } /// The vault INPUT column (column 2) is diff --git a/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol b/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol index 7b7bbb76f3..dd314d7bf5 100644 --- a/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol +++ b/test/concrete/raindex/RaindexV6.contextWordEntrypoints.t.sol @@ -12,18 +12,25 @@ import { EvaluableV4, SignedContextV1, TakeOrdersConfigV5, - QuoteV2 + QuoteV2, + ClearConfigV2 } from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; +import {LibOrder} from "../../../src/lib/LibOrder.sol"; import {LibTestContextWords} from "test/util/lib/LibTestContextWords.sol"; +import { + LibNamespace, + FullyQualifiedNamespace, + StateNamespace +} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; /// @title RaindexV6ContextWordEntrypointsTest -/// @notice Every deposit and withdraw context word reads its true value in its -/// own task entrypoint and reverts out of bounds in every other entrypoint. +/// @notice Every context word reads its true value in the entrypoints that fill +/// its cell and reverts out of bounds in every other entrypoint. contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { using Strings for address; using Strings for uint256; @@ -31,6 +38,7 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { address internal constant ACTOR = address(0xD0); address internal constant TAKER = address(0xB0B); + address internal constant CLEARER = address(0xC1EA); bytes32 internal constant VAULT_ID = bytes32(uint256(1)); struct Check { @@ -84,6 +92,21 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { ); } + function configHash() internal view returns (string memory) { + OrderConfigV4 memory config = orderConfig(); + return uint256( + LibOrder.hash(OrderV4(ACTOR, config.evaluable, config.validInputs, config.validOutputs, config.nonce)) + ).toHexString(); + } + + function raindexCheck() internal view returns (Check memory) { + return Check("raindex()", address(iRaindex).toHexString()); + } + + function senderCheck(address sender) internal pure returns (Check memory) { + return Check("sender()", sender.toHexString()); + } + // Entrypoints. function doDeposit(TaskV2[] memory post) public { @@ -157,54 +180,117 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { iRaindex.quote2(QuoteV2(order, 0, 0, new SignedContextV1[](0))); } + /// `CLEARER` clears an ACTOR order whose calculate source is `calculate` and + /// handle source is `handle` against a TAKER order. + function doClear(string memory calculate, string memory handle) public { + vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.prank(ACTOR); + iRaindex.deposit4(address(iToken1), VAULT_ID, LibDecimalFloat.packLossless(10, 0), new TaskV2[](0)); + vm.prank(TAKER); + iRaindex.deposit4(address(iToken0), VAULT_ID, LibDecimalFloat.packLossless(10, 0), new TaskV2[](0)); + + OrderV4 memory alice = LibTestTakeOrder.addOrderWithExpression( + vm, + ACTOR, + bytes(string.concat("using-words-from ", address(iSubParser).toHexString(), "\n", calculate, handle)), + address(iToken0), + VAULT_ID, + address(iToken1), + VAULT_ID + ); + OrderV4 memory bob = LibTestTakeOrder.addOrderWithExpression( + vm, TAKER, "_ _:1 1;:;", address(iToken1), VAULT_ID, address(iToken0), VAULT_ID + ); + vm.prank(CLEARER); + iRaindex.clear3(alice, bob, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0)); + assertTrue( + iRaindex.vaultBalance2(ACTOR, address(iToken1), VAULT_ID).lt(LibDecimalFloat.packLossless(10, 0)), + "order cleared" + ); + } + // Families. function depositChecks() internal view returns (Check[] memory checks) { - checks = new Check[](6); - checks[0] = Check("depositor()", ACTOR.toHexString()); - checks[1] = Check("deposit-token()", address(iToken0).toHexString()); - checks[2] = Check("deposit-vault-id()", uint256(VAULT_ID).toHexString()); - checks[3] = Check("deposit-vault-before()", "0"); - checks[4] = Check("deposit-vault-after()", "1"); - checks[5] = Check("deposit-token-decimals()", "18"); + checks = new Check[](8); + checks[0] = raindexCheck(); + checks[1] = Check("depositor()", ACTOR.toHexString()); + checks[2] = Check("deposit-token()", address(iToken0).toHexString()); + checks[3] = Check("deposit-vault-id()", uint256(VAULT_ID).toHexString()); + checks[4] = Check("deposit-vault-before()", "0"); + checks[5] = Check("deposit-vault-after()", "1"); + checks[6] = Check("deposit-token-decimals()", "18"); + checks[7] = senderCheck(ACTOR); } function withdrawChecks() internal view returns (Check[] memory checks) { - checks = new Check[](7); - checks[0] = Check("withdrawer()", ACTOR.toHexString()); - checks[1] = Check("withdraw-token()", address(iToken0).toHexString()); - checks[2] = Check("withdraw-vault-id()", uint256(VAULT_ID).toHexString()); - checks[3] = Check("withdraw-vault-before()", "1"); - checks[4] = Check("withdraw-vault-after()", "0"); - checks[5] = Check("withdraw-target-amount()", "1"); - checks[6] = Check("withdraw-token-decimals()", "18"); - } - - function words() internal pure returns (string[] memory all) { - string[] memory deposit = LibTestContextWords.depositWords(); - string[] memory withdraw = LibTestContextWords.withdrawWords(); - all = new string[](deposit.length + withdraw.length); - for (uint256 i = 0; i < deposit.length; i++) { - all[i] = deposit[i]; - } - for (uint256 i = 0; i < withdraw.length; i++) { - all[deposit.length + i] = withdraw[i]; - } + checks = new Check[](9); + checks[0] = raindexCheck(); + checks[1] = Check("withdrawer()", ACTOR.toHexString()); + checks[2] = Check("withdraw-token()", address(iToken0).toHexString()); + checks[3] = Check("withdraw-vault-id()", uint256(VAULT_ID).toHexString()); + checks[4] = Check("withdraw-vault-before()", "1"); + checks[5] = Check("withdraw-vault-after()", "0"); + checks[6] = Check("withdraw-target-amount()", "1"); + checks[7] = Check("withdraw-token-decimals()", "18"); + checks[8] = senderCheck(ACTOR); + } + + function orderTaskChecks() internal view returns (Check[] memory checks) { + checks = new Check[](4); + checks[0] = raindexCheck(); + checks[1] = Check("order-hash()", configHash()); + checks[2] = Check("order-owner()", ACTOR.toHexString()); + checks[3] = senderCheck(ACTOR); + } + + function entaskChecks() internal view returns (Check[] memory checks) { + checks = new Check[](2); + checks[0] = raindexCheck(); + checks[1] = senderCheck(ACTOR); + } + + /// Order hash depends on the bytecode holding these checks, so + /// `testOrderEvalOrderHash` pins it separately. + function orderEvalChecks(bool handle) internal view returns (Check[] memory checks) { + checks = new Check[](16); + checks[0] = raindexCheck(); + checks[1] = Check("order-owner()", ACTOR.toHexString()); + checks[2] = Check("order-counterparty()", TAKER.toHexString()); + checks[3] = senderCheck(TAKER); + checks[4] = Check("calculated-max-output()", handle ? "1" : "0"); + checks[5] = Check("calculated-io-ratio()", handle ? "1" : "0"); + checks[6] = Check("input-token()", address(iToken0).toHexString()); + checks[7] = Check("input-token-decimals()", "18"); + checks[8] = Check("input-vault-id()", uint256(VAULT_ID).toHexString()); + checks[9] = Check("input-vault-before()", "0"); + checks[10] = Check("input-vault-increase()", handle ? "1" : "0"); + checks[11] = Check("output-token()", address(iToken1).toHexString()); + checks[12] = Check("output-token-decimals()", "18"); + checks[13] = Check("output-vault-id()", uint256(VAULT_ID).toHexString()); + checks[14] = Check("output-vault-before()", "10"); + checks[15] = Check("output-vault-decrease()", handle ? "1" : "0"); + } + + /// Words the order eval fills but `orderEvalChecks` cannot pin by value. + function orderEvalUnpinned(string memory word) internal pure returns (bool) { + return keccak256(bytes(word)) == keccak256("order-hash()"); } // Task entrypoint runner. function checkTaskFamily(function(TaskV2[] memory) external run, Check[] memory checks) internal { uint256 start = vm.snapshotState(); - run(task(checks.length > 0 ? ensures(checks) : ":;")); + run(task(ensures(checks))); vm.revertToState(start); - string[] memory all = words(); - for (uint256 i = 0; i < all.length; i++) { - if (inFamily(checks, all[i])) { + string[] memory words = LibTestContextWords.allWords(); + for (uint256 i = 0; i < words.length; i++) { + if (inFamily(checks, words[i])) { continue; } uint256 snapshot = vm.snapshotState(); - TaskV2[] memory post = task(string.concat(":set(0 ", all[i], ");")); + TaskV2[] memory post = task(string.concat(":set(0 ", words[i], ");")); vm.expectRevert(stdError.indexOOBError); run(post); vm.revertToState(snapshot); @@ -220,27 +306,34 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { } function testAddOrderContextWords() external { - checkTaskFamily(this.doAddOrder, new Check[](0)); + checkTaskFamily(this.doAddOrder, orderTaskChecks()); } function testRemoveOrderContextWords() external { - checkTaskFamily(this.doRemoveOrder, new Check[](0)); + checkTaskFamily(this.doRemoveOrder, orderTaskChecks()); } function testEntaskContextWords() external { - checkTaskFamily(this.doEntask, new Check[](0)); + checkTaskFamily(this.doEntask, entaskChecks()); } // Order eval runner. function checkOrderEvalFamily(bool handle) internal { - uint256 start = vm.snapshotState(); - this.doTake("_ _:1 1;", ":;"); - vm.revertToState(start); - string[] memory all = words(); - for (uint256 i = 0; i < all.length; i++) { + Check[] memory checks = orderEvalChecks(handle); + string memory body = ensures(checks); + if (handle) { + this.doTake("_ _:1 1;", body); + } else { + this.doTake(string.concat("_ _:1 1,", body), ":;"); + } + string[] memory words = LibTestContextWords.allWords(); + for (uint256 i = 0; i < words.length; i++) { + if (inFamily(checks, words[i]) || orderEvalUnpinned(words[i])) { + continue; + } uint256 snapshot = vm.snapshotState(); - string memory read = string.concat(":set(0 ", all[i], ");"); + string memory read = string.concat(":set(0 ", words[i], ");"); vm.expectRevert(stdError.indexOOBError); if (handle) { this.doTake("_ _:1 1;", read); @@ -258,4 +351,39 @@ contract RaindexV6ContextWordEntrypointsTest is RaindexV6ExternalRealTest { function testHandleIOContextWords() external { checkOrderEvalFamily(true); } + + /// The order hash word reads the hash of the order being evaluated, in both + /// calculate and handle IO. + function testOrderEvalOrderHash() external { + bytes32 orderHash = LibOrder.hash(this.doTake("_ _:1 1,:set(1 order-hash());", ":set(2 order-hash());")); + FullyQualifiedNamespace ns = + LibNamespace.qualifyNamespace(StateNamespace.wrap(uint256(uint160(ACTOR))), address(iRaindex)); + assertEq(iStore.get(ns, bytes32(uint256(1))), orderHash, "calculate order hash"); + assertEq(iStore.get(ns, bytes32(uint256(2))), orderHash, "handle io order hash"); + } + + // Quote and clear. + + function testQuoteSender() external { + Check[] memory checks = new Check[](1); + checks[0] = senderCheck(address(this)); + this.doQuote(string.concat("_ _:1 1,", ensures(checks))); + } + + function clearChecks() internal view returns (Check[] memory checks) { + checks = new Check[](5); + checks[0] = raindexCheck(); + checks[1] = senderCheck(CLEARER); + checks[2] = Check("order-owner()", ACTOR.toHexString()); + checks[3] = Check("order-counterparty()", TAKER.toHexString()); + checks[4] = Check("order-clearer()", CLEARER.toHexString()); + } + + function testClearCalculateContextWords() external { + this.doClear(string.concat("_ _:1 1,", ensures(clearChecks())), ":;"); + } + + function testClearHandleIOContextWords() external { + this.doClear("_ _:1 1;", ensures(clearChecks())); + } } diff --git a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol index 36fddf3f46..a0b341f911 100644 --- a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol +++ b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol @@ -24,7 +24,20 @@ contract RaindexV6CalculateOrderIOHarness is RaindexV6, IRaindexV6CalculateOrder SignedContextV1[] memory signedContext ) external view returns (OrderIOCalculationV4 memory) { (, OrderIOCalculationV4 memory orderIOCalculation) = calculateOrderIO( - order, inputIOIndex, outputIOIndex, counterparty, signedContext, new bytes32[](0), false + order, inputIOIndex, outputIOIndex, counterparty, signedContext, new bytes32[](0), false, false + ); + return orderIOCalculation; + } + + function exposedCalculateOrderIOClearing( + OrderV4 memory order, + uint256 inputIOIndex, + uint256 outputIOIndex, + address counterparty, + SignedContextV1[] memory signedContext + ) external view returns (OrderIOCalculationV4 memory) { + (, OrderIOCalculationV4 memory orderIOCalculation) = calculateOrderIO( + order, inputIOIndex, outputIOIndex, counterparty, signedContext, new bytes32[](0), false, true ); return orderIOCalculation; } diff --git a/test/util/fixture/LibRaindexSubParserContextFixture.sol b/test/util/fixture/LibRaindexSubParserContextFixture.sol index a92739983a..7a7666eb79 100644 --- a/test/util/fixture/LibRaindexSubParserContextFixture.sol +++ b/test/util/fixture/LibRaindexSubParserContextFixture.sol @@ -3,19 +3,17 @@ pragma solidity =0.8.25; import { + WORD_SENDER, WORD_RAINDEX, WORD_ORDER_CLEARER, WORD_ORDER_HASH, WORD_ORDER_OWNER, WORD_ORDER_COUNTERPARTY, - CONTEXT_BASE_ROWS, - CONTEXT_BASE_ROW_SENDER, - CONTEXT_BASE_ROW_CALLING_CONTRACT, CONTEXT_CALLING_CONTEXT_ROWS, CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH, CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER, CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY, - CONTEXT_BASE_COLUMN, + CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER, CONTEXT_CALLING_CONTEXT_COLUMN, CONTEXT_CALCULATIONS_COLUMN, CONTEXT_CALCULATIONS_ROWS, @@ -44,19 +42,26 @@ import { CONTEXT_SIGNED_CONTEXT_SIGNERS_COLUMN, CONTEXT_SIGNED_CONTEXT_START_COLUMN } from "../../../src/lib/LibRaindexSubParser.sol"; +import { + CONTEXT_BASE_COLUMN, + CONTEXT_BASE_ROWS, + CONTEXT_BASE_ROW_SENDER, + CONTEXT_BASE_ROW_CALLING_CONTRACT +} from "rainlang-interface-0.2.13/src/lib/caller/LibContext.sol"; library LibRaindexSubParserContextFixture { function hashedNamesContext() internal pure returns (bytes32[][] memory) { bytes32[][] memory context = new bytes32[][](CONTEXT_SIGNED_CONTEXT_START_COLUMN + 2); bytes32[] memory contextBase = new bytes32[](CONTEXT_BASE_ROWS); - contextBase[CONTEXT_BASE_ROW_SENDER] = keccak256(WORD_ORDER_CLEARER); + contextBase[CONTEXT_BASE_ROW_SENDER] = keccak256(WORD_SENDER); contextBase[CONTEXT_BASE_ROW_CALLING_CONTRACT] = keccak256(WORD_RAINDEX); bytes32[] memory contextCallingContext = new bytes32[](CONTEXT_CALLING_CONTEXT_ROWS); contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_HASH] = keccak256(WORD_ORDER_HASH); contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_OWNER] = keccak256(WORD_ORDER_OWNER); contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_COUNTERPARTY] = keccak256(WORD_ORDER_COUNTERPARTY); + contextCallingContext[CONTEXT_CALLING_CONTEXT_ROW_ORDER_CLEARER] = keccak256(WORD_ORDER_CLEARER); bytes32[] memory contextCalculations = new bytes32[](CONTEXT_CALCULATIONS_ROWS); contextCalculations[CONTEXT_CALCULATIONS_ROW_MAX_OUTPUT] = keccak256(WORD_CALCULATED_MAX_OUTPUT); diff --git a/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol b/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol index ee5f281750..b6acd63d25 100644 --- a/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol +++ b/test/util/interface/IRaindexV6CalculateOrderIOHarness.sol @@ -15,6 +15,14 @@ interface IRaindexV6CalculateOrderIOHarness is IRaindexV6 { SignedContextV1[] memory signedContext ) external view returns (OrderIOCalculationV4 memory); + function exposedCalculateOrderIOClearing( + OrderV4 memory order, + uint256 inputIOIndex, + uint256 outputIOIndex, + address counterparty, + SignedContextV1[] memory signedContext + ) external view returns (OrderIOCalculationV4 memory); + function seedTofu(address token) external returns (TOFUOutcome, uint8); function exposedIncrease(address owner, address token, bytes32 vaultId, Float amount) external; diff --git a/test/util/lib/LibTestContextWords.sol b/test/util/lib/LibTestContextWords.sol index 0086680ab8..67cb1fefc7 100644 --- a/test/util/lib/LibTestContextWords.sol +++ b/test/util/lib/LibTestContextWords.sol @@ -2,28 +2,41 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity ^0.8.25; -/// @dev Raindex sub parser context words as rainlang call expressions. +/// @dev Every Raindex sub parser context word as a rainlang call expression. library LibTestContextWords { - function depositWords() internal pure returns (string[] memory) { - string[] memory words = new string[](6); - words[0] = "depositor()"; - words[1] = "deposit-token()"; - words[2] = "deposit-vault-id()"; - words[3] = "deposit-vault-before()"; - words[4] = "deposit-vault-after()"; - words[5] = "deposit-token-decimals()"; - return words; - } - - function withdrawWords() internal pure returns (string[] memory) { - string[] memory words = new string[](7); - words[0] = "withdrawer()"; - words[1] = "withdraw-token()"; - words[2] = "withdraw-vault-id()"; - words[3] = "withdraw-vault-before()"; - words[4] = "withdraw-vault-after()"; - words[5] = "withdraw-target-amount()"; - words[6] = "withdraw-token-decimals()"; + function allWords() internal pure returns (string[] memory) { + string[] memory words = new string[](31); + words[0] = "sender()"; + words[1] = "raindex()"; + words[2] = "order-hash()"; + words[3] = "order-owner()"; + words[4] = "order-counterparty()"; + words[5] = "order-clearer()"; + words[6] = "calculated-max-output()"; + words[7] = "calculated-io-ratio()"; + words[8] = "input-token()"; + words[9] = "input-token-decimals()"; + words[10] = "input-vault-id()"; + words[11] = "input-vault-before()"; + words[12] = "input-vault-increase()"; + words[13] = "output-token()"; + words[14] = "output-token-decimals()"; + words[15] = "output-vault-id()"; + words[16] = "output-vault-before()"; + words[17] = "output-vault-decrease()"; + words[18] = "depositor()"; + words[19] = "deposit-token()"; + words[20] = "deposit-vault-id()"; + words[21] = "deposit-vault-before()"; + words[22] = "deposit-vault-after()"; + words[23] = "deposit-token-decimals()"; + words[24] = "withdrawer()"; + words[25] = "withdraw-token()"; + words[26] = "withdraw-vault-id()"; + words[27] = "withdraw-vault-before()"; + words[28] = "withdraw-vault-after()"; + words[29] = "withdraw-target-amount()"; + words[30] = "withdraw-token-decimals()"; return words; } }