{"matchId":"51118625","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-09-16T12:24:06Z","creationBytecode":{"onchainBytecode":"0x6080604052346104e957615385803803806100198161050b565b9283398101610140828203126104e95781516001600160401b0381116104e9578161004591840161055b565b60208301519091906001600160401b0381116104e9578161006791850161055b565b60408401519092906001600160401b0381116104e957826100899186016105bb565b60608501519093906001600160401b0381116104e957836100ab9187016105bb565b608086015190936001600160401b0382116104e9576100cb9187016105bb565b926100d860a08701610547565b936100e560c08801610547565b6100f160e08901610547565b610100890151610120909901516001600160a01b03811699908a90036104e9576127106006556032600c556014805461ffff60a01b191661010160a01b17905561013a82610622565b5061014488610622565b5061014e83610622565b5086519788156104e9578951891480610501575b806104f7575b806104ed575b156104e957604080936101d67fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd39969229966101d0856101ca7f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9761064d565b506106c3565b50610756565b50600b80546001600160a01b0319166001600160a01b0392909216918217905581515f81526020810191909152a180600f558151905f82526020820152a1426013555f5b85811061028f57601480546001600160a01b031916891790555f5460ff81166102805760019060ff1916175f557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1604051614b1b90816107ea8239f35b63d93c066560e01b5f5260045ffd5b610299818461060e565b516102a4828461060e565b5111156104e9576001600160a01b036102bd828761060e565b5116906102ca818561060e565b51825f52600d60205260405f20556102e2818461060e565b51825f52600e60205260405f2055815f52600360205260405f20600160ff19825416179055817fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd6040610335848861060e565b51610340858861060e565b5182519182526020820152a26001600160a01b0361035e828761060e565b5116825f52600460205260405f2060018060a01b03821660018060a01b0319825416179055805f52600560205260405f2060018060a01b03841660018060a01b03198254161790557fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f35f80a26103d4818961060e565b51604051909290606081016001600160401b038111828210176104d5576040528181526020810193845260408101428152825f52600960205260405f2090815495680100000000000000008710156104d557600187018084558710156104c1576001966002935f52600360205f2091020193878060a01b0390888060a01b0390511616878060a01b03198554161784555186840155519101557f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de606061049a848c61060e565b51604051908482525f60208301526040820152a15f5260116020524260405f20550161021a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b508651891461016e565b5084518914610168565b5085518914610162565b6040519190601f01601f191682016001600160401b038111838210176104d557604052565b6001600160401b0381116104d55760051b60200190565b51906001600160a01b03821682036104e957565b9080601f830112156104e957815161057a61057582610530565b61050b565b9260208085848152019260051b8201019283116104e957602001905b8282106105a35750505090565b602080916105b084610547565b815201910190610596565b9080601f830112156104e95781516105d561057582610530565b9260208085848152019260051b8201019283116104e957602001905b8282106105fe5750505090565b81518152602091820191016105f1565b80518210156104c15760209160051b010190565b1561062c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b6001600160a01b0381165f9081525f5160206153255f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153255f395f51905f5260205260408120805460ff191660011790553391905f5160206153055f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206153655f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153655f395f51905f5260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f5160206153055f395f51905f529080a4600190565b6001600160a01b0381165f9081525f5160206153455f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153455f395f51905f5260205260408120805460ff191660011790553391907f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b905f5160206153055f395f51905f529080a460019056fe60806040526004361015610012575b5f80fd5b5f5f3560e01c806301e51e971461386257806301ffc9a71461380b57806304d3a96d146133c35780630db14e95146132305780630f40517a146131f75780631a9be40a146130465780632169678314612dc5578063248a9ca314612d99578063251d6ec314612d605780632647d92914612d335780632d4abd2d14612bc35780632f2ff15d14612b8457806332cf58c414612a0d57806336103291146128e657806336568abe146128a157806339de62a6146128245780633a33a4f8146126785780633f4ba83a14612612578063403f37311461257d57806343ab265f1461255957806344337ea1146124a157806348d832cb146123ca5780634d2b1444146123ac5780634f8fe1f11461232f578063537df3b61461227d5780635c975abb1461225b5780635f2567571461221a5780636382d9ad1461213357806366fd9d6514611ca657806368c4ac2614611c675780636c0a188e14611c495780637c395b1314611aae578063812a71d5146118bb5780638456cb591461186257806391d148541461181857806395d322b0146117df5780639ed9e4831461166f578063a1bab44714611603578063a217fddf146115e7578063abd42922146115a3578063adc9772e146112f8578063cb0b8fe5146112bf578063d295fa9a1461117b578063d40549c01461113a578063d547741f146110f2578063da57c7d714610f0a578063ddd5e1b214610c80578063e30227ea14610ba1578063e315d80414610b68578063e8690bc2146108b1578063ebc73e6514610850578063f56f4f0f1461081b578063f7192ba8146104a0578063f92396a6146102b95763fe575a8714610278575f80fd5b346102b65760203660031901126102b65760209060ff906040906001600160a01b036102a2613c87565b168152600a84522054166040519015158152f35b80fd5b50346102b65760403660031901126102b6576102d3613c87565b6001600160a01b03168082526003602052604082205460243591906102fa9060ff16613d52565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b8352600160209081526040808520335f908152925290205460ff1615610469578115610439576040516370a0823160e01b8152306004820152602081602481855afa90811561042e5784916103fc575b5082116103c257600b5461038a9083906001600160a01b0316836144d1565b7f9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85602060018060a01b03600b5416604051908152a380f35b60405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b90506020813d602011610426575b8161041760209383613ea4565b8101031261000e57515f61036b565b3d915061040a565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152600860248201526706d757374203e20360c41b6044820152606490fd5b63e2517d3f60e01b8352336004527f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b602452604483fd5b50346102b65760403660031901126102b6576004356104bd613c9d565b906104c661435d565b338352600a6020526104df60ff60408520541615613d92565b60ff60145460a81c166107d657808352600760205261050060408420613fe6565b818452600760205283600660408220828155826001820155826002820155826003820155826004820155826005820155015560018060a01b036020820151169033855260086020526040852060018060a01b0383165f5260205260405f2033865260086020526040862060018060a01b0384165f52602052610587600360405f2001613f84565b946060830151156107d2576040830151336001600160a01b03909116036107d2576105b38351156142b2565b6001600160a01b038116936105c99085146142e8565b865b86518110156107c357856105df8289614051565b51146105ed576001016105cb565b9091929394958051905f1982019182116107af579161063d610616610642936106809695614051565b51610625600388019384613dcc565b90919082549060031b91821b915f19901b1916179055565b614322565b60a0608085015194015192610658858254614065565b815560018101610669858254614065565b905560024291015561067b8133614377565b6143f5565b61068a8284614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561079b5786916106b691613e15565b8482526010602052604082206106cd858254614065565b90558482526012602052604082206106e6848254614065565b9055848252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c57610773575b505061074391614065565b916040519081527f16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b1860203392a480f35b8161077d91613ea4565b61078857845f610738565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b89526011600452602489fd5b50610680919293949550610642565b8680fd5b60405162461bcd60e51b815260206004820152601860248201527f63616e63656c20636c61696d206e6f7420656e61626c656400000000000000006044820152606490fd5b50346102b65760403660031901126102b657602061084861083a613c87565b610842613c9d565b90614512565b604051908152f35b50346102b65760203660031901126102b65760043561086d61485a565b7fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd399692296040600f5461089f8185141561427c565b8151908152836020820152a1600f5580f35b50346102b65760a03660031901126102b6576108cb613c87565b60243590604435906084356001600160a01b0381169160643591839003610b64576108f461485a565b6108fd81614a62565b506001600160a01b03168086526003602052604086205490929060ff16610b3357612710821080610b2a575b15610aef57828652600360205260408620805460ff19166001179055859061094f61485a565b838252600360205261096760ff604084205416613d52565b85151580610ae6575b15610ae257837fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd60407f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de98606098847fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260808983610acd9b52600d602052868082205491858152600e6020522054875191825260208201528587820152848e820152a2848c52600d60205281838d2055848c52600e60205280838d205582519182526020820152a283875260046020526040872060018060a01b0382166001600160601b0360a01b825416179055808752600560205260408720846001600160601b0360a01b825416179055604051907fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f38880a2610aad81613e88565b838152826020820152426040820152838752600960205260408720614219565b6040519182528460208301526040820152a180f35b5080fd5b50848610610970565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c696420726577617264207261746560681b6044820152606490fd5b50811515610929565b60405162461bcd60e51b815260206004820152600960248201526814dd5c1c1bdc9d195960ba1b6044820152606490fd5b8580fd5b50346102b65760203660031901126102b6576020906040906001600160a01b03610b90613c87565b168152601283522054604051908152f35b50346102b65760203660031901126102b6576001600160a01b03610bc3613c87565b1681526009602052604081208054610bda81613fce565b91610be86040519384613ea4565b81835283526020808420849184015b838310610c425785858051915f198301928311610c2e5760406020610c1c8585614051565b51015181519081526127106020820152f35b634e487b7160e01b81526011600452602490fd5b60036020600192604051610c5581613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190610bf7565b50346102b65760403660031901126102b657600435610c9d613c9d565b90610ca661435d565b338352600a602052610cbf60ff60408520541615613d92565b8083526007602052610cd360408420613fe6565b60208181015133808752600880845260408089206001600160a01b039094165f818152948652818520938a52918552808920828552909452929091209094919290610d2090600301613f84565b946060820192835115610f065760e08301514210610f06576040830151336001600160a01b0390911603610f0657610d6d90610d5d8451156142b2565b6001600160a01b031685146142e8565b848752600760205260408720805460ff19166001179055865b8651811015610ef55785610d9a8289614051565b5114610da857600101610d86565b9091929394958051905f1982019182116107af5760059261063d610dd4610e50979694610de394614051565b51610625600386019384613dcc565b60808301928351878a526002602052610e0160408b20918254613df5565b9055855193519060c060a08201519101519160405195610e2087613e33565b600187528960208801523360408801526060870152608086015260a085015260c08401524260e084015201613ec6565b601454815185916001600160a01b0316803b15610797576040516317d5759960e31b81526001600160a01b0386166004820152336024820152604481019290925282908290606490829084905af1801561078c57610edc575b505051916040519081527fdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd60203392a480f35b81610ee691613ea4565b610ef157835f610ea9565b8380fd5b50610e509293949550600590610de3565b8780fd5b50346102b657610f1936613cb3565b91836060604051610f2981613e6c565b828152826020820152826040820152015260018060a01b03821684526003602052610f5a60ff604086205416613d52565b60018060a01b031683526008602052604083209060018060a01b03165f5260205260405f20604051610f8b81613e50565b815481526001820154602082015260028201546040820152610faf60038301613f84565b606082015260048201918254610fc481613fce565b93610fd26040519586613ea4565b81855286526020808720879186015b83831061109d5750505050600590608083019384520190815461100381613fce565b926110116040519485613ea4565b81845286526020808720969084015b82821061107f57608061104788888860a089015261104181515183106141e5565b51614051565b5160606040519160018060a01b03815116835260018060a01b0360208201511660208401526040810151604084015201516060820152f35b6007602060019261108f8b613fe6565b815201980191019096611020565b6004602060019260409b989b516110b381613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190979497610fe1565b50346102b65760403660031901126102b657611136600435611112613c9d565b9061113161112c825f526001602052600160405f20015490565b614918565b6149de565b5080f35b50346102b65760203660031901126102b6576020906001600160a01b0361115f613c87565b16815260048252604060018060a01b0391205416604051908152f35b50346102b65760403660031901126102b657600435600461119a613c9d565b6001600160a01b03818116808652602084815260408088205490516318160ddd60e01b81529592939192869290918391165afa9283156112b4578593611280575b50845260106020526111f260408520549130614512565b8261123257505050670de0b6b3a7640000915b670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e5760206108488484613e15565b61123b91614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561126c579061126691613e15565b91611205565b634e487b7160e01b84526011600452602484fd5b9092506020813d6020116112ac575b8161129c60209383613ea4565b8101031261000e5751915f6111db565b3d915061128f565b6040513d87823e3d90fd5b50346102b65760203660031901126102b6576020906040906001600160a01b036112e7613c87565b168152601083522054604051908152f35b50346102b65760403660031901126102b657611312613c87565b6001600160a01b03811680835260036020526040832054602435929061133a9060ff16613d52565b61134261435d565b338452600a60205261135b60ff60408620541615613d92565b338452600860205260408420825f5260205260405f209083825401838652600d60205260408620548110610b6457838652600e602052604086205410610788576040516323b872dd60e01b6020820152336024820152306044820152606480820186905281526113e591906113db906113d5608482613ea4565b85614a8d565b61067b8133614377565b8285526010602052604085206113fc858254614065565b9055670de0b6b3a76400008402848104670de0b6b3a7640000148515171561158f57859161142991613e15565b838252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c5761157a575b50506040516004820161148b82613e6c565b8382526020820133815260408301908682526060840192428452805490600160401b82101561156657600182018082558210156115525789526020808a209551600292831b90960180546001600160a01b039788166001600160a01b03199182161782559351600182018054919098169416939093179095559151818301559151600390920191909155825485019092558285525260408320805483019055337f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f78480a480f35b634e487b7160e01b8a52603260045260248afd5b634e487b7160e01b8a52604160045260248afd5b8161158491613ea4565b610ef157835f611479565b634e487b7160e01b86526011600452602486fd5b50346102b65760203660031901126102b6576115d760406115e3926115c66141a9565b506004358152600760205220613fe6565b60405191829182613ced565b0390f35b50346102b657806003193601126102b657602090604051908152f35b50346102b65760203660031901126102b65760043561162061485a565b61271081111580611663575b6116359061427c565b80600c547f2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e108480a3600c5580f35b50600c5481141561162c565b50346102b65760403660031901126102b657611689613c87565b611691613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20604051916116c483613e50565b8154835260018201546020840152600282015460408401526116e860038301613f84565b6060840152600482019182546116fd81613fce565b9361170b6040519586613ea4565b81855283526020808420849186015b83831061179057505050506080840192835260050180549061173b82613fce565b926117496040519485613ea4565b82845290815260208082209084015b838310611772576020868660a08a01525151604051908152f35b6007602060019261178285613fe6565b815201920192019190611758565b600460206001926040516117a381613e6c565b848060a01b038654168152848060a01b03858701541683820152600286015460408201526003860154606082015281520192019201919061171a565b50346102b65760203660031901126102b6576020906040906001600160a01b03611807613c87565b168152600d83522054604051908152f35b50346102b65760403660031901126102b6576040611834613c9d565b9160043581526001602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102b657806003193601126102b65761187b6148a9565b61188361435d565b600160ff198254161781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346102b65760403660031901126102b6576118d5613c87565b6001600160a01b0381168083526003602052604083205460243592906118fd9060ff16613d52565b61190561485a565b612710831015611a7a57818452600960205260408420805461192681613fce565b916119346040519384613ea4565b81835286526020808720879184015b838310611a3c57505050508051905f19820191821161158f5760209161196891614051565b510151918383141580611a33575b156119fb577f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de936119d06119f592604051906119b182613e88565b8082528360208301524260408301528852600960205260408820614219565b60405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a180f35b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964206e6577207261746560801b6044820152606490fd5b50831515611976565b60036020600192604051611a4f81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190611943565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b6044820152606490fd5b50346102b657611abd36613cb3565b9291611ac76141a9565b506001600160a01b038216835260036020526040832054611aea9060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f2060405190611b1c82613e50565b805482526001810154602083015260028101546040830152611b4060038201613f84565b6060830152600481018054611b5481613fce565b91611b626040519384613ea4565b81835285526020808620869184015b838310611bfa57505050506080830152600501805490611b9082613fce565b93611b9e6040519586613ea4565b82855290815260208082209085015b838310611bdc576115e3611bcf888861104160a08a01918083525183106141e5565b5160405191829182613ced565b60076020600192611bec85613fe6565b815201920192019190611bad565b60046020600192604051611c0d81613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190611b71565b50346102b657806003193601126102b6576020600654604051908152f35b50346102b65760203660031901126102b65760209060ff906040906001600160a01b03611c92613c87565b168152600384522054166040519015158152f35b50346102b65760803660031901126102b657611cc0613c87565b611cc8613c9d565b6044356001600160a01b03811691908281036107885760643590338652600a602052611cfb60ff60408820541615613d92565b6001600160a01b038316808752600a6020526040872054909190611d229060ff1615613d92565b848752600a602052611d3b60ff60408920541615613d92565b8482146120ee5782156120a957611d528685614072565b9383851061207a57338314612029576001600160a01b03878116808a52600460208181526040808d20549051636eb1769f60e11b81528686169381019390935233602484015292939192909183916044918391165afa801561201e5786918b91611fe9575b5010611fb8578089526004602052604089205489906001600160a01b0316803b15610ae257604051630f75ba2160e41b81526001600160a01b0385166004820152336024820152604481018890529082908290606490829084905af1801561078c57611f9f575b5052600460208181526040808b205490516323b872dd60e01b81526001600160a01b03858116948201949094528584166024820152604481018890529492859116818c81606481015b03925af1928315611f9457888093611e8892611e8d96611f65575b50614377565b614377565b855260086020526040852060018060a01b0385165f5260205260405f2091825491600184019586549588526008602052604088209060018060a01b03165f5260205260405f2096670de0b6b3a76400008202918204670de0b6b3a764000003610c2e5750611f22611f52959493670de0b6b3a7640000611f1b611f14611f38968396613e15565b8093613e02565b0495613e02565b0492611f2f818854614065565b87558254613df5565b905560018401611f49828254614065565b90558254613df5565b9055600242910155602060405160018152f35b611f869060203d602011611f8d575b611f7e8183613ea4565b810190614191565b505f611e82565b503d611f74565b6040513d8b823e3d90fd5b81611fa991613ea4565b611fb457885f611e1e565b8880fd5b60405162461bcd60e51b8152602060048201526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b9150506020813d602011612016575b8161200560209383613ea4565b8101031261000e578590515f611db7565b3d9150611ff8565b6040513d8c823e3d90fd5b6001600160a01b038781168952600460208181526040808c205490516323b872dd60e01b815233938101939093528584166024840152604483018890529194929091859116818c8160648101611e67565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f66726f6d2063616e206e6f742062652073616d652061732074686520746f00006044820152606490fd5b50346102b65760403660031901126102b65761214d613c87565b612155613c9d565b9061215e61485a565b61216781614a62565b5061217182614a62565b506040516370a0823160e01b81523060048201526001600160a01b03919091169190602081602481865afa801561042e5784906121e6575b6121b5915082846144d1565b6001600160a01b0316907ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f8380a380f35b506020813d602011612212575b8161220060209383613ea4565b8101031261000e576121b590516121a9565b3d91506121f3565b50346102b65760203660031901126102b6576020906001600160a01b0361223f613c87565b16815260058252604060018060a01b0391205416604051908152f35b50346102b657806003193601126102b65760ff60209154166040519015158152f35b50346102b65760203660031901126102b657612297613c87565b61229f61485a565b6001600160a01b0316808252600a602052604082205460ff16156122f857808252600a60205260408220805460ff191690557f1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde88280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08189b1858dadb1a5cdd1959608a1b6044820152606490fd5b50346102b65760203660031901126102b657600435801515809103610ae25761235661485a565b60145460ff8160a81c1615159061236f82841415614110565b60ff60a81b191660a883901b60ff60a81b16176014557f84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce98380a380f35b50346102b657806003193601126102b6576020600f54604051908152f35b50346102b65760603660031901126102b6576123e4613c87565b602435604435916123f361485a565b6001600160a01b0316808452600360205260408420549091906124189060ff16613d52565b80151580612498575b15610ef157818452600d602052817fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260806040872054838852600e60205260408820546040519182526020820152846040820152866060820152a2818452600d60205260408420558252600e602052604082205580f35b50828110612421565b50346102b65760203660031901126102b6576124bb613c87565b6124c361485a565b6001600160a01b0316808252600a602052604082205460ff1661251e57808252600a60205260408220805460ff191660011790557f44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b8789678280a280f35b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e48189b1858dadb1a5cdd1959606a1b6044820152606490fd5b50346102b65760203660031901126102b6576020610848612578613c87565b61414e565b50346102b65760203660031901126102b657612597613c87565b61259f61485a565b6125a881614a62565b50600b546001600160a01b03828116929082169083821461078857604080516001600160a01b0393841681529190921660208201527f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9190a16001600160a01b03191617600b5580f35b50346102b657806003193601126102b65761262b6148a9565b805460ff8116156126695760ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b50346102b65760403660031901126102b657612692613c87565b61269a613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f206040516126cc81613e50565b8154815260018201546020820152600282015460408201526126f060038301613f84565b916060820192835260048101805461270781613fce565b916127156040519384613ea4565b81835286526020808720879184015b8383106127d557505050509060059160808401520190815461274581613fce565b926127536040519485613ea4565b81845285526020808620869185015b8383106127b7575050505060a001525190604051918291602083016020845282518091526020604085019301915b81811061279e575050500390f35b8251845285945060209384019390920191600101612790565b600760206001926127c785613fe6565b815201920192019190612762565b600460206001926040516127e881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612724565b50346102b65760203660031901126102b657600435801515809103610ae25761284b61485a565b60145460ff8160a01c1615159061286482841415614110565b60ff60a01b191660a083901b60ff60a01b16176014557f99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b8380a380f35b50346102b65760403660031901126102b6576128bb613c9d565b336001600160a01b038216036128d757611136906004356149de565b63334bd91960e11b8252600482fd5b50346102b65760403660031901126102b657600490612903613c9d565b6001600160a01b03818116808452602085815260408086205490516318160ddd60e01b81529692939192879290918391165afa938415612a025783946129ce575b508252601060205261295b60408320549130614512565b8361298557505050506020670de0b6b3a764000061297c815b600435613e02565b04604051908152f35b61298e91614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e575061297c6129c9602093670de0b6b3a764000093613e15565b612974565b9093506020813d6020116129fa575b816129ea60209383613ea4565b8101031261000e5751925f612944565b3d91506129dd565b6040513d85823e3d90fd5b50346102b65760403660031901126102b657612a27613c87565b612a2f613c9d565b60018060a01b038216835260086020526040832060018060a01b0382165f5260205260405f2060405190612a6282613e50565b805482526001810154602083015260028101546040830152612a8660038201613f84565b6060830152600481018054612a9a81613fce565b91612aa86040519384613ea4565b81835287526020808820889184015b838310612b35575050505060808301526005018054612ad581613fce565b91612ae36040519384613ea4565b81835286526020808720969083015b828210612b1757602087612b0e88888860a08201525192614512565b01604051908152f35b60076020600192612b278b613fe6565b815201980191019096612af2565b60046020600192604051612b4881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612ab7565b50346102b65760403660031901126102b657611136600435612ba4613c9d565b90612bbe61112c825f526001602052600160405f20015490565b614952565b50346102b65760403660031901126102b657612bdd613c87565b612be5613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f209060405190612c1982613e50565b825482526001830154602083015260028301546040830152612c3d60038401613f84565b606083015260048301928354612c5281613fce565b90612c606040519283613ea4565b80825260208201958452602084209584905b828210612ce4575050506080840152600501805490612c9082613fce565b92612c9e6040519485613ea4565b82845290815260208082209084015b838310612cc6576020858060a089015251604051908152f35b60076020600192612cd685613fe6565b815201920192019190612cad565b60046020600192604051612cf781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096612c72565b50346102b65760403660031901126102b6576020610848612d52613c87565b612d5a613c9d565b90614072565b50346102b65760203660031901126102b6576020906040906001600160a01b03612d88613c87565b168152600e83522054604051908152f35b50346102b65760203660031901126102b65760206108486004355f526001602052600160405f20015490565b50346102b657612dd436613cb3565b919290428311156130125760018060a01b038416825260086020526040822060018060a01b0382165f5260205260405f209160405191612e1383613e50565b835483526001840154602084015260028401549360408401948552612e3a60038201613f84565b6060850152600481018054612e4e81613fce565b91612e5c6040519384613ea4565b81835285526020808620869184015b838310612fc3575050505060808501526005018054612e8981613fce565b91612e976040519384613ea4565b81835284526020808520859184015b838310612fa5575050505060a08401526001600160a01b03811682526009602052604082208054909690612ed981613fce565b97612ee7604051998a613ea4565b8189528452602080852085918a015b838310612f6757505050508651965f19880197881161126c57602097612f1b91614051565b51929451612f4a575b505084612f39644979cb9e0094954290613df5565b925191015102020401604051908152f35b644979cb9e009450612f608792612f3992614512565b9450612f24565b60036020600192604051612f7a81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190612ef6565b60076020600192612fb585613fe6565b815201920192019190612ea6565b60046020600192604051612fd681613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612e6b565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606490fd5b50346102b65760403660031901126102b657613060613c87565b613068613c9d565b9082916130758183614512565b9160018060a01b031684526008602052604084209060018060a01b03165f5260205260405f2092604051936130a985613e50565b8054855260018101546020860152600281015460408601526130cd60038201613f84565b60608601526004810180546130e181613fce565b916130ef6040519384613ea4565b81835284526020808520859184015b8383106131a857505050509060059160808701520193845461311f81613fce565b9561312d6040519788613ea4565b81875283526020808420849188015b83831061318a575050505060a001938452915b8351805184101561317d5760019160a061316c8661317594614051565b51015190614065565b92019161314f565b5060209160405191018152f35b6007602060019261319a85613fe6565b81520192019201919061313c565b600460206001926040516131bb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906130fe565b50346102b65760203660031901126102b6576020906040906001600160a01b0361321f613c87565b168152600283522054604051908152f35b50346102b65760403660031901126102b65761324a613c87565b613252613c9d565b6001600160a01b0381168352600360205260408320549091906132779060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20906040516132a981613e50565b8254815260018301546020820152600283015460408201526132cd60038401613f84565b6060820152600483019283546132e281613fce565b906132f06040519283613ea4565b80825260208201958552602085209585905b82821061337457505050608083015260050180549061332082613fce565b9361332e6040519586613ea4565b82855290815260208082209085015b838310613356576020858760a082015251604051908152f35b6007602060019261336685613fe6565b81520192019201919061333d565b6004602060019260405161338781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096613302565b50346102b65760403660031901126102b6576133dd613c87565b6001600160a01b0381168083526003602052604083205460243592906134059060ff16613d52565b61340d61435d565b338452600a60205261342660ff60408620541615613d92565b60ff60145460a01c166137c657338452600860205260408420825f5260205260405f20906134548133614377565b61345d816143f5565b918054906001810191825487151591826137a9575b5050156107d2576006548752600760205281549587815f19810361376457505050805487818801979355938782555b8615613727578588526010602052604088206134be868254613df5565b90558588526012602052604088206134d7848254613df5565b9055670de0b6b3a76400008702878104670de0b6b3a7640000036107af57889161350091613e15565b86825260046020526024602060018060a01b03604085205416604051928380926370a0823160e01b82523360048301525afa908115612a025783916136f2575b5080821180156136e9575b6136e1575b50868252600460205260408220546001600160a01b0316803b1561079757604051632770a7eb60e21b8152336004820152602481019290925282908290604490829084905af1801561078c576136cc575b5050600c546127100361271081116136b8576135c06127109188613e02565b0490816135d66135d0828a613df5565b9561414e565b1061367e576135e96136459233886144d1565b858852600260205260408820613600868254613df5565b905560056040519161361183613e33565b600183528760208401523360408401528860608401528660808401528460a08401524260c08401524260e084015201613ec6565b604051928352602083015260408201527f25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c28960603392a480f35b60405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b816136d691613ea4565b6107d257865f6135a1565b90505f613550565b5083541561354b565b9250506020823d60201161371f575b8161370e60209383613ea4565b8101031261000e578891515f613540565b3d9150613701565b60405162461bcd60e51b81526020600482015260156024820152746e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b919790959390828110613785575061377d828254613df5565b9055916134a1565b909395506137969189829555613df5565b6137a1818354613df5565b8255936134a1565b018711801591506137bc575b5f80613472565b505f1986146137b5565b60405162461bcd60e51b815260206004820152601a60248201527f666c617368207769746864726177206e6f7420656e61626c65640000000000006044820152606490fd5b50346102b65760203660031901126102b65760043563ffffffff60e01b8116809103610ae257602090637965db0b60e01b8114908115613851575b506040519015158152f35b6301ffc9a760e01b14905082613846565b3461000e57604036600319011261000e5761387b613c87565b6024359060018060a01b03811691825f5260036020526138a160ff60405f205416613d52565b6138a961435d565b335f52600a6020526138c260ff60405f20541615613d92565b6138cc8233614377565b6138d5826143f5565b90335f52600860205260405f20845f5260205260405f2093845493600186019485548415159182613c6a575b505015613c34576006545f52600760205260405f2090835f908754955f1981145f14613bed5750505086545f818601959755945f88555b60048301968755600383019586558415613bb05760038801600654815491600160401b831015613b9c578261062591600161397595018155613dcc565b8554845f52601060205261398e60405f20918254613df5565b90558654845f5260126020526139a960405f20918254613df5565b9055670de0b6b3a76400008502858104670de0b6b3a764000003613b88576024916139d391613e15565b97845f526004602052602060018060a01b0360405f205416604051938480926370a0823160e01b82523360048301525afa918215613b37575f92613b54575b50818911908115613b4a575b50613b42575b505f838152600460205260409020546001600160a01b0316803b1561000e57604051632770a7eb60e21b815233600482015260248101989098525f908890604490829084905af1908115613b3757602097613aa192613b27575b508254610100600160a81b03191660089190911b610100600160a81b0316178255565b600181810180546001600160a01b03191633908117909155600283018590554260058401819055600f54016006938401558254918201909255935494546040805192835260208301969096529481019490945291928392907ff74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba90606090a4604051908152f35b5f613b3191613ea4565b5f613a7e565b6040513d5f823e3d90fd5b965087613a24565b9050541589613a1e565b9091506020813d602011613b80575b81613b7060209383613ea4565b8101031261000e57519089613a12565b3d9150613b63565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b81526020600482015260156024820152744e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b9196979095828110155f14613c105750613c08828254613df5565b905595613938565b90979650613c21915f829955613df5565b613c2c818954613df5565b885594613938565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b01841180159150613c7d575b8780613901565b505f198314613c76565b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b606090600319011261000e576004356001600160a01b038116810361000e57906024356001600160a01b038116810361000e579060443590565b91909160e08061010083019480511515845260018060a01b03602082015116602085015260018060a01b036040820151166040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b15613d5957565b60405162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b6044820152606490fd5b15613d9957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b8054821015613de1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211613b8857565b81810292918115918404141715613b8857565b8115613e1f570490565b634e487b7160e01b5f52601260045260245ffd5b610100810190811067ffffffffffffffff821117613b9c57604052565b60c0810190811067ffffffffffffffff821117613b9c57604052565b6080810190811067ffffffffffffffff821117613b9c57604052565b6060810190811067ffffffffffffffff821117613b9c57604052565b90601f8019910116810190811067ffffffffffffffff821117613b9c57604052565b805490600160401b821015613b9c5760018201808255821015613de1575f90815260209081902083516007909302018054918401516001600160a81b031990921660ff931515939093169290921760089190911b610100600160a81b03161781559060069060e09060408101516001850180546001600160a01b0319166001600160a01b0392909216919091179055606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b90604051918281549182825260208201905f5260205f20925f5b818110613fb5575050613fb392500383613ea4565b565b8454835260019485019487945060209093019201613f9e565b67ffffffffffffffff8111613b9c5760051b60200190565b90604051613ff381613e33565b825460ff81161515825260081c6001600160a01b03908116602083015260018401541660408201526002830154606082015260038301546080820152600483015460a0820152600583015460c08201526006929092015460e0830152565b8051821015613de15760209160051b010190565b91908201809211613b8857565b6001600160a01b039091165f818152600360205260409020546140979060ff16613d52565b5f526004602052602060018060a01b0360405f205416916024604051809481936370a0823160e01b835260018060a01b031660048301525afa908115613b37575f916140e1575090565b90506020813d602011614108575b816140fc60209383613ea4565b8101031261000e575190565b3d91506140ef565b1561411757565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd1a1a5b99c818da185b99d959608a1b6044820152606490fd5b602060249161415c81614a62565b506040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115613b37575f916140e1575090565b9081602091031261000e5751801515810361000e5790565b604051906141b682613e33565b5f60e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b156141ec57565b60405162461bcd60e51b81526020600482015260056024820152640d2dcc8caf60db1b6044820152606490fd5b805490600160401b821015613b9c5760018201808255821015613de1576002916040915f52600360205f209102019260018060a01b0360018060a01b03825116166001600160601b0360a01b855416178455602081015160018501550151910155565b1561428357565b60405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606490fd5b156142b957565b60405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606490fd5b156142ef57565b60405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606490fd5b80548015614349575f1901906143388282613dcc565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b60ff5f541661436857565b63d93c066560e01b5f5260045ffd5b9060018060a01b0382165f52600860205260405f2060018060a01b0382165f5260205260405f20915f82600285019283546143e4575b506143ba60019130614512565b94015542905560018060a01b0316805f5260116020524260405f20555f52601260205260405f2055565b6143ee9250614512565b825f6143ad565b6001600160a01b039081165f818152600460208181526040928390205492516318160ddd60e01b81529490928592918391165afa918215613b37575f9261449d575b508161444b575050670de0b6b3a764000090565b8061446f915f52601060205260405f2054905f52601260205260405f205490614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715613b885761449a91613e15565b90565b9091506020813d6020116144c9575b816144b960209383613ea4565b8101031261000e5751905f614437565b3d91506144ac565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613fb39161450d606483613ea4565b614a8d565b9091906001600160a01b0316308114614827575f52600860205260405f2060018060a01b0383165f5260205260405f209160405161454f81613e50565b83548152600184015490602081019182526002850154946040820195865261457960038201613f84565b606083015260048101805461458d81613fce565b9161459b6040519384613ea4565b81835260208301905f5260205f205f915b8383106147d85750505050608083015260050180546145ca81613fce565b916145d86040519384613ea4565b81835260208301905f5260205f205f915b8383106147ba575050505060a08201525193519051915b60018060a01b03165f52600960205260405f2090815461461f81613fce565b9261462d6040519485613ea4565b81845260208401905f5260205f205f915b83831061477c57505050508151915f198301838111613b88576146619082614051565b5192821561477257604084019183835111155f146146a0575050509061449a93946020614694644979cb9e009442613df5565b92015102020490614065565b5f939293925f5b838110614744575b505b8284106146d557505050509061449a93946020614694644979cb9e00945142613df5565b83969192931561473a576146f79060406146ef8986614051565b510151613df5565b5f198701878111613b88576001916020614717644979cb9e009387614051565b5101518b020204604061472a8986614051565b5101519201965b019291906146b1565b9095600190614731565b60406147538285969795614051565b510151821061476857600101939291936146a7565b939291505f6146af565b505f955050505050565b6003602060019260405161478f81613e88565b848060a01b03865416815284860154838201526002860154604082015281520192019201919061463e565b600760206001926147ca85613fe6565b8152019201920191906145e9565b600460206001926040516147eb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906145ac565b506001600160a01b0382165f90815260106020908152604080832054601183528184205460129093529220549193614600565b335f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff161561489257565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8602052604090205460ff16156148e157565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260016020908152604080832033845290915290205460ff161561493c5750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff166149d8575f8181526001602081815260408084206001600160a01b0396909616808552959091528220805460ff19169091179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff16156149d8575f8181526001602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b15614a6c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b905f602091828151910182855af115613b37575f513d614adc57506001600160a01b0381163b155b614abc5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614ab556fea2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0da6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4923b5fec2089556a6c5b151e34068bfe081a4d2aa094faa466b56d44dbb75c738b9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000089ab9241aab22a86b4b5fd05628f3e3c34f9777f00000000000000000000000095abf5bf2afe39ddd92cc35f8bc2a3dbcfee1ef900000000000000000000000089ab9241aab22a86b4b5fd05628f3e3c34f9777f00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000fc8e6b1ab1a4c37724f8bc797730afa8d01d04ef000000000000000000000000000000000000000000000000000000000000000100000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000000000000000000000100000000000000000000000073af543d809c8d3414e5b92b3aa2c25b182ba3a1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","recompiledBytecode":"0x6080604052346104e957615385803803806100198161050b565b9283398101610140828203126104e95781516001600160401b0381116104e9578161004591840161055b565b60208301519091906001600160401b0381116104e9578161006791850161055b565b60408401519092906001600160401b0381116104e957826100899186016105bb565b60608501519093906001600160401b0381116104e957836100ab9187016105bb565b608086015190936001600160401b0382116104e9576100cb9187016105bb565b926100d860a08701610547565b936100e560c08801610547565b6100f160e08901610547565b610100890151610120909901516001600160a01b03811699908a90036104e9576127106006556032600c556014805461ffff60a01b191661010160a01b17905561013a82610622565b5061014488610622565b5061014e83610622565b5086519788156104e9578951891480610501575b806104f7575b806104ed575b156104e957604080936101d67fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd39969229966101d0856101ca7f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9761064d565b506106c3565b50610756565b50600b80546001600160a01b0319166001600160a01b0392909216918217905581515f81526020810191909152a180600f558151905f82526020820152a1426013555f5b85811061028f57601480546001600160a01b031916891790555f5460ff81166102805760019060ff1916175f557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1604051614b1b90816107ea8239f35b63d93c066560e01b5f5260045ffd5b610299818461060e565b516102a4828461060e565b5111156104e9576001600160a01b036102bd828761060e565b5116906102ca818561060e565b51825f52600d60205260405f20556102e2818461060e565b51825f52600e60205260405f2055815f52600360205260405f20600160ff19825416179055817fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd6040610335848861060e565b51610340858861060e565b5182519182526020820152a26001600160a01b0361035e828761060e565b5116825f52600460205260405f2060018060a01b03821660018060a01b0319825416179055805f52600560205260405f2060018060a01b03841660018060a01b03198254161790557fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f35f80a26103d4818961060e565b51604051909290606081016001600160401b038111828210176104d5576040528181526020810193845260408101428152825f52600960205260405f2090815495680100000000000000008710156104d557600187018084558710156104c1576001966002935f52600360205f2091020193878060a01b0390888060a01b0390511616878060a01b03198554161784555186840155519101557f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de606061049a848c61060e565b51604051908482525f60208301526040820152a15f5260116020524260405f20550161021a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b508651891461016e565b5084518914610168565b5085518914610162565b6040519190601f01601f191682016001600160401b038111838210176104d557604052565b6001600160401b0381116104d55760051b60200190565b51906001600160a01b03821682036104e957565b9080601f830112156104e957815161057a61057582610530565b61050b565b9260208085848152019260051b8201019283116104e957602001905b8282106105a35750505090565b602080916105b084610547565b815201910190610596565b9080601f830112156104e95781516105d561057582610530565b9260208085848152019260051b8201019283116104e957602001905b8282106105fe5750505090565b81518152602091820191016105f1565b80518210156104c15760209160051b010190565b1561062c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b6001600160a01b0381165f9081525f5160206153255f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153255f395f51905f5260205260408120805460ff191660011790553391905f5160206153055f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206153655f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153655f395f51905f5260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f5160206153055f395f51905f529080a4600190565b6001600160a01b0381165f9081525f5160206153455f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153455f395f51905f5260205260408120805460ff191660011790553391907f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b905f5160206153055f395f51905f529080a460019056fe60806040526004361015610012575b5f80fd5b5f5f3560e01c806301e51e971461386257806301ffc9a71461380b57806304d3a96d146133c35780630db14e95146132305780630f40517a146131f75780631a9be40a146130465780632169678314612dc5578063248a9ca314612d99578063251d6ec314612d605780632647d92914612d335780632d4abd2d14612bc35780632f2ff15d14612b8457806332cf58c414612a0d57806336103291146128e657806336568abe146128a157806339de62a6146128245780633a33a4f8146126785780633f4ba83a14612612578063403f37311461257d57806343ab265f1461255957806344337ea1146124a157806348d832cb146123ca5780634d2b1444146123ac5780634f8fe1f11461232f578063537df3b61461227d5780635c975abb1461225b5780635f2567571461221a5780636382d9ad1461213357806366fd9d6514611ca657806368c4ac2614611c675780636c0a188e14611c495780637c395b1314611aae578063812a71d5146118bb5780638456cb591461186257806391d148541461181857806395d322b0146117df5780639ed9e4831461166f578063a1bab44714611603578063a217fddf146115e7578063abd42922146115a3578063adc9772e146112f8578063cb0b8fe5146112bf578063d295fa9a1461117b578063d40549c01461113a578063d547741f146110f2578063da57c7d714610f0a578063ddd5e1b214610c80578063e30227ea14610ba1578063e315d80414610b68578063e8690bc2146108b1578063ebc73e6514610850578063f56f4f0f1461081b578063f7192ba8146104a0578063f92396a6146102b95763fe575a8714610278575f80fd5b346102b65760203660031901126102b65760209060ff906040906001600160a01b036102a2613c87565b168152600a84522054166040519015158152f35b80fd5b50346102b65760403660031901126102b6576102d3613c87565b6001600160a01b03168082526003602052604082205460243591906102fa9060ff16613d52565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b8352600160209081526040808520335f908152925290205460ff1615610469578115610439576040516370a0823160e01b8152306004820152602081602481855afa90811561042e5784916103fc575b5082116103c257600b5461038a9083906001600160a01b0316836144d1565b7f9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85602060018060a01b03600b5416604051908152a380f35b60405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b90506020813d602011610426575b8161041760209383613ea4565b8101031261000e57515f61036b565b3d915061040a565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152600860248201526706d757374203e20360c41b6044820152606490fd5b63e2517d3f60e01b8352336004527f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b602452604483fd5b50346102b65760403660031901126102b6576004356104bd613c9d565b906104c661435d565b338352600a6020526104df60ff60408520541615613d92565b60ff60145460a81c166107d657808352600760205261050060408420613fe6565b818452600760205283600660408220828155826001820155826002820155826003820155826004820155826005820155015560018060a01b036020820151169033855260086020526040852060018060a01b0383165f5260205260405f2033865260086020526040862060018060a01b0384165f52602052610587600360405f2001613f84565b946060830151156107d2576040830151336001600160a01b03909116036107d2576105b38351156142b2565b6001600160a01b038116936105c99085146142e8565b865b86518110156107c357856105df8289614051565b51146105ed576001016105cb565b9091929394958051905f1982019182116107af579161063d610616610642936106809695614051565b51610625600388019384613dcc565b90919082549060031b91821b915f19901b1916179055565b614322565b60a0608085015194015192610658858254614065565b815560018101610669858254614065565b905560024291015561067b8133614377565b6143f5565b61068a8284614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561079b5786916106b691613e15565b8482526010602052604082206106cd858254614065565b90558482526012602052604082206106e6848254614065565b9055848252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c57610773575b505061074391614065565b916040519081527f16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b1860203392a480f35b8161077d91613ea4565b61078857845f610738565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b89526011600452602489fd5b50610680919293949550610642565b8680fd5b60405162461bcd60e51b815260206004820152601860248201527f63616e63656c20636c61696d206e6f7420656e61626c656400000000000000006044820152606490fd5b50346102b65760403660031901126102b657602061084861083a613c87565b610842613c9d565b90614512565b604051908152f35b50346102b65760203660031901126102b65760043561086d61485a565b7fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd399692296040600f5461089f8185141561427c565b8151908152836020820152a1600f5580f35b50346102b65760a03660031901126102b6576108cb613c87565b60243590604435906084356001600160a01b0381169160643591839003610b64576108f461485a565b6108fd81614a62565b506001600160a01b03168086526003602052604086205490929060ff16610b3357612710821080610b2a575b15610aef57828652600360205260408620805460ff19166001179055859061094f61485a565b838252600360205261096760ff604084205416613d52565b85151580610ae6575b15610ae257837fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd60407f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de98606098847fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260808983610acd9b52600d602052868082205491858152600e6020522054875191825260208201528587820152848e820152a2848c52600d60205281838d2055848c52600e60205280838d205582519182526020820152a283875260046020526040872060018060a01b0382166001600160601b0360a01b825416179055808752600560205260408720846001600160601b0360a01b825416179055604051907fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f38880a2610aad81613e88565b838152826020820152426040820152838752600960205260408720614219565b6040519182528460208301526040820152a180f35b5080fd5b50848610610970565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c696420726577617264207261746560681b6044820152606490fd5b50811515610929565b60405162461bcd60e51b815260206004820152600960248201526814dd5c1c1bdc9d195960ba1b6044820152606490fd5b8580fd5b50346102b65760203660031901126102b6576020906040906001600160a01b03610b90613c87565b168152601283522054604051908152f35b50346102b65760203660031901126102b6576001600160a01b03610bc3613c87565b1681526009602052604081208054610bda81613fce565b91610be86040519384613ea4565b81835283526020808420849184015b838310610c425785858051915f198301928311610c2e5760406020610c1c8585614051565b51015181519081526127106020820152f35b634e487b7160e01b81526011600452602490fd5b60036020600192604051610c5581613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190610bf7565b50346102b65760403660031901126102b657600435610c9d613c9d565b90610ca661435d565b338352600a602052610cbf60ff60408520541615613d92565b8083526007602052610cd360408420613fe6565b60208181015133808752600880845260408089206001600160a01b039094165f818152948652818520938a52918552808920828552909452929091209094919290610d2090600301613f84565b946060820192835115610f065760e08301514210610f06576040830151336001600160a01b0390911603610f0657610d6d90610d5d8451156142b2565b6001600160a01b031685146142e8565b848752600760205260408720805460ff19166001179055865b8651811015610ef55785610d9a8289614051565b5114610da857600101610d86565b9091929394958051905f1982019182116107af5760059261063d610dd4610e50979694610de394614051565b51610625600386019384613dcc565b60808301928351878a526002602052610e0160408b20918254613df5565b9055855193519060c060a08201519101519160405195610e2087613e33565b600187528960208801523360408801526060870152608086015260a085015260c08401524260e084015201613ec6565b601454815185916001600160a01b0316803b15610797576040516317d5759960e31b81526001600160a01b0386166004820152336024820152604481019290925282908290606490829084905af1801561078c57610edc575b505051916040519081527fdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd60203392a480f35b81610ee691613ea4565b610ef157835f610ea9565b8380fd5b50610e509293949550600590610de3565b8780fd5b50346102b657610f1936613cb3565b91836060604051610f2981613e6c565b828152826020820152826040820152015260018060a01b03821684526003602052610f5a60ff604086205416613d52565b60018060a01b031683526008602052604083209060018060a01b03165f5260205260405f20604051610f8b81613e50565b815481526001820154602082015260028201546040820152610faf60038301613f84565b606082015260048201918254610fc481613fce565b93610fd26040519586613ea4565b81855286526020808720879186015b83831061109d5750505050600590608083019384520190815461100381613fce565b926110116040519485613ea4565b81845286526020808720969084015b82821061107f57608061104788888860a089015261104181515183106141e5565b51614051565b5160606040519160018060a01b03815116835260018060a01b0360208201511660208401526040810151604084015201516060820152f35b6007602060019261108f8b613fe6565b815201980191019096611020565b6004602060019260409b989b516110b381613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190979497610fe1565b50346102b65760403660031901126102b657611136600435611112613c9d565b9061113161112c825f526001602052600160405f20015490565b614918565b6149de565b5080f35b50346102b65760203660031901126102b6576020906001600160a01b0361115f613c87565b16815260048252604060018060a01b0391205416604051908152f35b50346102b65760403660031901126102b657600435600461119a613c9d565b6001600160a01b03818116808652602084815260408088205490516318160ddd60e01b81529592939192869290918391165afa9283156112b4578593611280575b50845260106020526111f260408520549130614512565b8261123257505050670de0b6b3a7640000915b670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e5760206108488484613e15565b61123b91614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561126c579061126691613e15565b91611205565b634e487b7160e01b84526011600452602484fd5b9092506020813d6020116112ac575b8161129c60209383613ea4565b8101031261000e5751915f6111db565b3d915061128f565b6040513d87823e3d90fd5b50346102b65760203660031901126102b6576020906040906001600160a01b036112e7613c87565b168152601083522054604051908152f35b50346102b65760403660031901126102b657611312613c87565b6001600160a01b03811680835260036020526040832054602435929061133a9060ff16613d52565b61134261435d565b338452600a60205261135b60ff60408620541615613d92565b338452600860205260408420825f5260205260405f209083825401838652600d60205260408620548110610b6457838652600e602052604086205410610788576040516323b872dd60e01b6020820152336024820152306044820152606480820186905281526113e591906113db906113d5608482613ea4565b85614a8d565b61067b8133614377565b8285526010602052604085206113fc858254614065565b9055670de0b6b3a76400008402848104670de0b6b3a7640000148515171561158f57859161142991613e15565b838252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c5761157a575b50506040516004820161148b82613e6c565b8382526020820133815260408301908682526060840192428452805490600160401b82101561156657600182018082558210156115525789526020808a209551600292831b90960180546001600160a01b039788166001600160a01b03199182161782559351600182018054919098169416939093179095559151818301559151600390920191909155825485019092558285525260408320805483019055337f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f78480a480f35b634e487b7160e01b8a52603260045260248afd5b634e487b7160e01b8a52604160045260248afd5b8161158491613ea4565b610ef157835f611479565b634e487b7160e01b86526011600452602486fd5b50346102b65760203660031901126102b6576115d760406115e3926115c66141a9565b506004358152600760205220613fe6565b60405191829182613ced565b0390f35b50346102b657806003193601126102b657602090604051908152f35b50346102b65760203660031901126102b65760043561162061485a565b61271081111580611663575b6116359061427c565b80600c547f2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e108480a3600c5580f35b50600c5481141561162c565b50346102b65760403660031901126102b657611689613c87565b611691613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20604051916116c483613e50565b8154835260018201546020840152600282015460408401526116e860038301613f84565b6060840152600482019182546116fd81613fce565b9361170b6040519586613ea4565b81855283526020808420849186015b83831061179057505050506080840192835260050180549061173b82613fce565b926117496040519485613ea4565b82845290815260208082209084015b838310611772576020868660a08a01525151604051908152f35b6007602060019261178285613fe6565b815201920192019190611758565b600460206001926040516117a381613e6c565b848060a01b038654168152848060a01b03858701541683820152600286015460408201526003860154606082015281520192019201919061171a565b50346102b65760203660031901126102b6576020906040906001600160a01b03611807613c87565b168152600d83522054604051908152f35b50346102b65760403660031901126102b6576040611834613c9d565b9160043581526001602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102b657806003193601126102b65761187b6148a9565b61188361435d565b600160ff198254161781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346102b65760403660031901126102b6576118d5613c87565b6001600160a01b0381168083526003602052604083205460243592906118fd9060ff16613d52565b61190561485a565b612710831015611a7a57818452600960205260408420805461192681613fce565b916119346040519384613ea4565b81835286526020808720879184015b838310611a3c57505050508051905f19820191821161158f5760209161196891614051565b510151918383141580611a33575b156119fb577f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de936119d06119f592604051906119b182613e88565b8082528360208301524260408301528852600960205260408820614219565b60405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a180f35b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964206e6577207261746560801b6044820152606490fd5b50831515611976565b60036020600192604051611a4f81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190611943565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b6044820152606490fd5b50346102b657611abd36613cb3565b9291611ac76141a9565b506001600160a01b038216835260036020526040832054611aea9060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f2060405190611b1c82613e50565b805482526001810154602083015260028101546040830152611b4060038201613f84565b6060830152600481018054611b5481613fce565b91611b626040519384613ea4565b81835285526020808620869184015b838310611bfa57505050506080830152600501805490611b9082613fce565b93611b9e6040519586613ea4565b82855290815260208082209085015b838310611bdc576115e3611bcf888861104160a08a01918083525183106141e5565b5160405191829182613ced565b60076020600192611bec85613fe6565b815201920192019190611bad565b60046020600192604051611c0d81613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190611b71565b50346102b657806003193601126102b6576020600654604051908152f35b50346102b65760203660031901126102b65760209060ff906040906001600160a01b03611c92613c87565b168152600384522054166040519015158152f35b50346102b65760803660031901126102b657611cc0613c87565b611cc8613c9d565b6044356001600160a01b03811691908281036107885760643590338652600a602052611cfb60ff60408820541615613d92565b6001600160a01b038316808752600a6020526040872054909190611d229060ff1615613d92565b848752600a602052611d3b60ff60408920541615613d92565b8482146120ee5782156120a957611d528685614072565b9383851061207a57338314612029576001600160a01b03878116808a52600460208181526040808d20549051636eb1769f60e11b81528686169381019390935233602484015292939192909183916044918391165afa801561201e5786918b91611fe9575b5010611fb8578089526004602052604089205489906001600160a01b0316803b15610ae257604051630f75ba2160e41b81526001600160a01b0385166004820152336024820152604481018890529082908290606490829084905af1801561078c57611f9f575b5052600460208181526040808b205490516323b872dd60e01b81526001600160a01b03858116948201949094528584166024820152604481018890529492859116818c81606481015b03925af1928315611f9457888093611e8892611e8d96611f65575b50614377565b614377565b855260086020526040852060018060a01b0385165f5260205260405f2091825491600184019586549588526008602052604088209060018060a01b03165f5260205260405f2096670de0b6b3a76400008202918204670de0b6b3a764000003610c2e5750611f22611f52959493670de0b6b3a7640000611f1b611f14611f38968396613e15565b8093613e02565b0495613e02565b0492611f2f818854614065565b87558254613df5565b905560018401611f49828254614065565b90558254613df5565b9055600242910155602060405160018152f35b611f869060203d602011611f8d575b611f7e8183613ea4565b810190614191565b505f611e82565b503d611f74565b6040513d8b823e3d90fd5b81611fa991613ea4565b611fb457885f611e1e565b8880fd5b60405162461bcd60e51b8152602060048201526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b9150506020813d602011612016575b8161200560209383613ea4565b8101031261000e578590515f611db7565b3d9150611ff8565b6040513d8c823e3d90fd5b6001600160a01b038781168952600460208181526040808c205490516323b872dd60e01b815233938101939093528584166024840152604483018890529194929091859116818c8160648101611e67565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f66726f6d2063616e206e6f742062652073616d652061732074686520746f00006044820152606490fd5b50346102b65760403660031901126102b65761214d613c87565b612155613c9d565b9061215e61485a565b61216781614a62565b5061217182614a62565b506040516370a0823160e01b81523060048201526001600160a01b03919091169190602081602481865afa801561042e5784906121e6575b6121b5915082846144d1565b6001600160a01b0316907ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f8380a380f35b506020813d602011612212575b8161220060209383613ea4565b8101031261000e576121b590516121a9565b3d91506121f3565b50346102b65760203660031901126102b6576020906001600160a01b0361223f613c87565b16815260058252604060018060a01b0391205416604051908152f35b50346102b657806003193601126102b65760ff60209154166040519015158152f35b50346102b65760203660031901126102b657612297613c87565b61229f61485a565b6001600160a01b0316808252600a602052604082205460ff16156122f857808252600a60205260408220805460ff191690557f1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde88280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08189b1858dadb1a5cdd1959608a1b6044820152606490fd5b50346102b65760203660031901126102b657600435801515809103610ae25761235661485a565b60145460ff8160a81c1615159061236f82841415614110565b60ff60a81b191660a883901b60ff60a81b16176014557f84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce98380a380f35b50346102b657806003193601126102b6576020600f54604051908152f35b50346102b65760603660031901126102b6576123e4613c87565b602435604435916123f361485a565b6001600160a01b0316808452600360205260408420549091906124189060ff16613d52565b80151580612498575b15610ef157818452600d602052817fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260806040872054838852600e60205260408820546040519182526020820152846040820152866060820152a2818452600d60205260408420558252600e602052604082205580f35b50828110612421565b50346102b65760203660031901126102b6576124bb613c87565b6124c361485a565b6001600160a01b0316808252600a602052604082205460ff1661251e57808252600a60205260408220805460ff191660011790557f44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b8789678280a280f35b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e48189b1858dadb1a5cdd1959606a1b6044820152606490fd5b50346102b65760203660031901126102b6576020610848612578613c87565b61414e565b50346102b65760203660031901126102b657612597613c87565b61259f61485a565b6125a881614a62565b50600b546001600160a01b03828116929082169083821461078857604080516001600160a01b0393841681529190921660208201527f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9190a16001600160a01b03191617600b5580f35b50346102b657806003193601126102b65761262b6148a9565b805460ff8116156126695760ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b50346102b65760403660031901126102b657612692613c87565b61269a613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f206040516126cc81613e50565b8154815260018201546020820152600282015460408201526126f060038301613f84565b916060820192835260048101805461270781613fce565b916127156040519384613ea4565b81835286526020808720879184015b8383106127d557505050509060059160808401520190815461274581613fce565b926127536040519485613ea4565b81845285526020808620869185015b8383106127b7575050505060a001525190604051918291602083016020845282518091526020604085019301915b81811061279e575050500390f35b8251845285945060209384019390920191600101612790565b600760206001926127c785613fe6565b815201920192019190612762565b600460206001926040516127e881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612724565b50346102b65760203660031901126102b657600435801515809103610ae25761284b61485a565b60145460ff8160a01c1615159061286482841415614110565b60ff60a01b191660a083901b60ff60a01b16176014557f99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b8380a380f35b50346102b65760403660031901126102b6576128bb613c9d565b336001600160a01b038216036128d757611136906004356149de565b63334bd91960e11b8252600482fd5b50346102b65760403660031901126102b657600490612903613c9d565b6001600160a01b03818116808452602085815260408086205490516318160ddd60e01b81529692939192879290918391165afa938415612a025783946129ce575b508252601060205261295b60408320549130614512565b8361298557505050506020670de0b6b3a764000061297c815b600435613e02565b04604051908152f35b61298e91614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e575061297c6129c9602093670de0b6b3a764000093613e15565b612974565b9093506020813d6020116129fa575b816129ea60209383613ea4565b8101031261000e5751925f612944565b3d91506129dd565b6040513d85823e3d90fd5b50346102b65760403660031901126102b657612a27613c87565b612a2f613c9d565b60018060a01b038216835260086020526040832060018060a01b0382165f5260205260405f2060405190612a6282613e50565b805482526001810154602083015260028101546040830152612a8660038201613f84565b6060830152600481018054612a9a81613fce565b91612aa86040519384613ea4565b81835287526020808820889184015b838310612b35575050505060808301526005018054612ad581613fce565b91612ae36040519384613ea4565b81835286526020808720969083015b828210612b1757602087612b0e88888860a08201525192614512565b01604051908152f35b60076020600192612b278b613fe6565b815201980191019096612af2565b60046020600192604051612b4881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612ab7565b50346102b65760403660031901126102b657611136600435612ba4613c9d565b90612bbe61112c825f526001602052600160405f20015490565b614952565b50346102b65760403660031901126102b657612bdd613c87565b612be5613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f209060405190612c1982613e50565b825482526001830154602083015260028301546040830152612c3d60038401613f84565b606083015260048301928354612c5281613fce565b90612c606040519283613ea4565b80825260208201958452602084209584905b828210612ce4575050506080840152600501805490612c9082613fce565b92612c9e6040519485613ea4565b82845290815260208082209084015b838310612cc6576020858060a089015251604051908152f35b60076020600192612cd685613fe6565b815201920192019190612cad565b60046020600192604051612cf781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096612c72565b50346102b65760403660031901126102b6576020610848612d52613c87565b612d5a613c9d565b90614072565b50346102b65760203660031901126102b6576020906040906001600160a01b03612d88613c87565b168152600e83522054604051908152f35b50346102b65760203660031901126102b65760206108486004355f526001602052600160405f20015490565b50346102b657612dd436613cb3565b919290428311156130125760018060a01b038416825260086020526040822060018060a01b0382165f5260205260405f209160405191612e1383613e50565b835483526001840154602084015260028401549360408401948552612e3a60038201613f84565b6060850152600481018054612e4e81613fce565b91612e5c6040519384613ea4565b81835285526020808620869184015b838310612fc3575050505060808501526005018054612e8981613fce565b91612e976040519384613ea4565b81835284526020808520859184015b838310612fa5575050505060a08401526001600160a01b03811682526009602052604082208054909690612ed981613fce565b97612ee7604051998a613ea4565b8189528452602080852085918a015b838310612f6757505050508651965f19880197881161126c57602097612f1b91614051565b51929451612f4a575b505084612f39644979cb9e0094954290613df5565b925191015102020401604051908152f35b644979cb9e009450612f608792612f3992614512565b9450612f24565b60036020600192604051612f7a81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190612ef6565b60076020600192612fb585613fe6565b815201920192019190612ea6565b60046020600192604051612fd681613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612e6b565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606490fd5b50346102b65760403660031901126102b657613060613c87565b613068613c9d565b9082916130758183614512565b9160018060a01b031684526008602052604084209060018060a01b03165f5260205260405f2092604051936130a985613e50565b8054855260018101546020860152600281015460408601526130cd60038201613f84565b60608601526004810180546130e181613fce565b916130ef6040519384613ea4565b81835284526020808520859184015b8383106131a857505050509060059160808701520193845461311f81613fce565b9561312d6040519788613ea4565b81875283526020808420849188015b83831061318a575050505060a001938452915b8351805184101561317d5760019160a061316c8661317594614051565b51015190614065565b92019161314f565b5060209160405191018152f35b6007602060019261319a85613fe6565b81520192019201919061313c565b600460206001926040516131bb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906130fe565b50346102b65760203660031901126102b6576020906040906001600160a01b0361321f613c87565b168152600283522054604051908152f35b50346102b65760403660031901126102b65761324a613c87565b613252613c9d565b6001600160a01b0381168352600360205260408320549091906132779060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20906040516132a981613e50565b8254815260018301546020820152600283015460408201526132cd60038401613f84565b6060820152600483019283546132e281613fce565b906132f06040519283613ea4565b80825260208201958552602085209585905b82821061337457505050608083015260050180549061332082613fce565b9361332e6040519586613ea4565b82855290815260208082209085015b838310613356576020858760a082015251604051908152f35b6007602060019261336685613fe6565b81520192019201919061333d565b6004602060019260405161338781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096613302565b50346102b65760403660031901126102b6576133dd613c87565b6001600160a01b0381168083526003602052604083205460243592906134059060ff16613d52565b61340d61435d565b338452600a60205261342660ff60408620541615613d92565b60ff60145460a01c166137c657338452600860205260408420825f5260205260405f20906134548133614377565b61345d816143f5565b918054906001810191825487151591826137a9575b5050156107d2576006548752600760205281549587815f19810361376457505050805487818801979355938782555b8615613727578588526010602052604088206134be868254613df5565b90558588526012602052604088206134d7848254613df5565b9055670de0b6b3a76400008702878104670de0b6b3a7640000036107af57889161350091613e15565b86825260046020526024602060018060a01b03604085205416604051928380926370a0823160e01b82523360048301525afa908115612a025783916136f2575b5080821180156136e9575b6136e1575b50868252600460205260408220546001600160a01b0316803b1561079757604051632770a7eb60e21b8152336004820152602481019290925282908290604490829084905af1801561078c576136cc575b5050600c546127100361271081116136b8576135c06127109188613e02565b0490816135d66135d0828a613df5565b9561414e565b1061367e576135e96136459233886144d1565b858852600260205260408820613600868254613df5565b905560056040519161361183613e33565b600183528760208401523360408401528860608401528660808401528460a08401524260c08401524260e084015201613ec6565b604051928352602083015260408201527f25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c28960603392a480f35b60405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b816136d691613ea4565b6107d257865f6135a1565b90505f613550565b5083541561354b565b9250506020823d60201161371f575b8161370e60209383613ea4565b8101031261000e578891515f613540565b3d9150613701565b60405162461bcd60e51b81526020600482015260156024820152746e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b919790959390828110613785575061377d828254613df5565b9055916134a1565b909395506137969189829555613df5565b6137a1818354613df5565b8255936134a1565b018711801591506137bc575b5f80613472565b505f1986146137b5565b60405162461bcd60e51b815260206004820152601a60248201527f666c617368207769746864726177206e6f7420656e61626c65640000000000006044820152606490fd5b50346102b65760203660031901126102b65760043563ffffffff60e01b8116809103610ae257602090637965db0b60e01b8114908115613851575b506040519015158152f35b6301ffc9a760e01b14905082613846565b3461000e57604036600319011261000e5761387b613c87565b6024359060018060a01b03811691825f5260036020526138a160ff60405f205416613d52565b6138a961435d565b335f52600a6020526138c260ff60405f20541615613d92565b6138cc8233614377565b6138d5826143f5565b90335f52600860205260405f20845f5260205260405f2093845493600186019485548415159182613c6a575b505015613c34576006545f52600760205260405f2090835f908754955f1981145f14613bed5750505086545f818601959755945f88555b60048301968755600383019586558415613bb05760038801600654815491600160401b831015613b9c578261062591600161397595018155613dcc565b8554845f52601060205261398e60405f20918254613df5565b90558654845f5260126020526139a960405f20918254613df5565b9055670de0b6b3a76400008502858104670de0b6b3a764000003613b88576024916139d391613e15565b97845f526004602052602060018060a01b0360405f205416604051938480926370a0823160e01b82523360048301525afa918215613b37575f92613b54575b50818911908115613b4a575b50613b42575b505f838152600460205260409020546001600160a01b0316803b1561000e57604051632770a7eb60e21b815233600482015260248101989098525f908890604490829084905af1908115613b3757602097613aa192613b27575b508254610100600160a81b03191660089190911b610100600160a81b0316178255565b600181810180546001600160a01b03191633908117909155600283018590554260058401819055600f54016006938401558254918201909255935494546040805192835260208301969096529481019490945291928392907ff74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba90606090a4604051908152f35b5f613b3191613ea4565b5f613a7e565b6040513d5f823e3d90fd5b965087613a24565b9050541589613a1e565b9091506020813d602011613b80575b81613b7060209383613ea4565b8101031261000e57519089613a12565b3d9150613b63565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b81526020600482015260156024820152744e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b9196979095828110155f14613c105750613c08828254613df5565b905595613938565b90979650613c21915f829955613df5565b613c2c818954613df5565b885594613938565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b01841180159150613c7d575b8780613901565b505f198314613c76565b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b606090600319011261000e576004356001600160a01b038116810361000e57906024356001600160a01b038116810361000e579060443590565b91909160e08061010083019480511515845260018060a01b03602082015116602085015260018060a01b036040820151166040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b15613d5957565b60405162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b6044820152606490fd5b15613d9957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b8054821015613de1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211613b8857565b81810292918115918404141715613b8857565b8115613e1f570490565b634e487b7160e01b5f52601260045260245ffd5b610100810190811067ffffffffffffffff821117613b9c57604052565b60c0810190811067ffffffffffffffff821117613b9c57604052565b6080810190811067ffffffffffffffff821117613b9c57604052565b6060810190811067ffffffffffffffff821117613b9c57604052565b90601f8019910116810190811067ffffffffffffffff821117613b9c57604052565b805490600160401b821015613b9c5760018201808255821015613de1575f90815260209081902083516007909302018054918401516001600160a81b031990921660ff931515939093169290921760089190911b610100600160a81b03161781559060069060e09060408101516001850180546001600160a01b0319166001600160a01b0392909216919091179055606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b90604051918281549182825260208201905f5260205f20925f5b818110613fb5575050613fb392500383613ea4565b565b8454835260019485019487945060209093019201613f9e565b67ffffffffffffffff8111613b9c5760051b60200190565b90604051613ff381613e33565b825460ff81161515825260081c6001600160a01b03908116602083015260018401541660408201526002830154606082015260038301546080820152600483015460a0820152600583015460c08201526006929092015460e0830152565b8051821015613de15760209160051b010190565b91908201809211613b8857565b6001600160a01b039091165f818152600360205260409020546140979060ff16613d52565b5f526004602052602060018060a01b0360405f205416916024604051809481936370a0823160e01b835260018060a01b031660048301525afa908115613b37575f916140e1575090565b90506020813d602011614108575b816140fc60209383613ea4565b8101031261000e575190565b3d91506140ef565b1561411757565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd1a1a5b99c818da185b99d959608a1b6044820152606490fd5b602060249161415c81614a62565b506040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115613b37575f916140e1575090565b9081602091031261000e5751801515810361000e5790565b604051906141b682613e33565b5f60e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b156141ec57565b60405162461bcd60e51b81526020600482015260056024820152640d2dcc8caf60db1b6044820152606490fd5b805490600160401b821015613b9c5760018201808255821015613de1576002916040915f52600360205f209102019260018060a01b0360018060a01b03825116166001600160601b0360a01b855416178455602081015160018501550151910155565b1561428357565b60405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606490fd5b156142b957565b60405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606490fd5b156142ef57565b60405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606490fd5b80548015614349575f1901906143388282613dcc565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b60ff5f541661436857565b63d93c066560e01b5f5260045ffd5b9060018060a01b0382165f52600860205260405f2060018060a01b0382165f5260205260405f20915f82600285019283546143e4575b506143ba60019130614512565b94015542905560018060a01b0316805f5260116020524260405f20555f52601260205260405f2055565b6143ee9250614512565b825f6143ad565b6001600160a01b039081165f818152600460208181526040928390205492516318160ddd60e01b81529490928592918391165afa918215613b37575f9261449d575b508161444b575050670de0b6b3a764000090565b8061446f915f52601060205260405f2054905f52601260205260405f205490614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715613b885761449a91613e15565b90565b9091506020813d6020116144c9575b816144b960209383613ea4565b8101031261000e5751905f614437565b3d91506144ac565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613fb39161450d606483613ea4565b614a8d565b9091906001600160a01b0316308114614827575f52600860205260405f2060018060a01b0383165f5260205260405f209160405161454f81613e50565b83548152600184015490602081019182526002850154946040820195865261457960038201613f84565b606083015260048101805461458d81613fce565b9161459b6040519384613ea4565b81835260208301905f5260205f205f915b8383106147d85750505050608083015260050180546145ca81613fce565b916145d86040519384613ea4565b81835260208301905f5260205f205f915b8383106147ba575050505060a08201525193519051915b60018060a01b03165f52600960205260405f2090815461461f81613fce565b9261462d6040519485613ea4565b81845260208401905f5260205f205f915b83831061477c57505050508151915f198301838111613b88576146619082614051565b5192821561477257604084019183835111155f146146a0575050509061449a93946020614694644979cb9e009442613df5565b92015102020490614065565b5f939293925f5b838110614744575b505b8284106146d557505050509061449a93946020614694644979cb9e00945142613df5565b83969192931561473a576146f79060406146ef8986614051565b510151613df5565b5f198701878111613b88576001916020614717644979cb9e009387614051565b5101518b020204604061472a8986614051565b5101519201965b019291906146b1565b9095600190614731565b60406147538285969795614051565b510151821061476857600101939291936146a7565b939291505f6146af565b505f955050505050565b6003602060019260405161478f81613e88565b848060a01b03865416815284860154838201526002860154604082015281520192019201919061463e565b600760206001926147ca85613fe6565b8152019201920191906145e9565b600460206001926040516147eb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906145ac565b506001600160a01b0382165f90815260106020908152604080832054601183528184205460129093529220549193614600565b335f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff161561489257565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8602052604090205460ff16156148e157565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260016020908152604080832033845290915290205460ff161561493c5750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff166149d8575f8181526001602081815260408084206001600160a01b0396909616808552959091528220805460ff19169091179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff16156149d8575f8181526001602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b15614a6c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b905f602091828151910182855af115613b37575f513d614adc57506001600160a01b0381163b155b614abc5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614ab556fea2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0da6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4923b5fec2089556a6c5b151e34068bfe081a4d2aa094faa466b56d44dbb75c738b9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8","sourceMap":"472:36530:11:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;911:6;;472:36530;1564:2;;472:36530;2061:4;472:36530;;-1:-1:-1;;;;472:36530:11;-1:-1:-1;;;472:36530:11;;;2478:36;;;:::i;:::-;;2524:32;;;:::i;:::-;;2566:30;;;:::i;:::-;;472:36530;;827:238:15;;;472:36530:11;;;;2715:28;;:73;;;-1:-1:-1;2715:118:11;;;-1:-1:-1;2715:158:11;;;-1:-1:-1;472:36530:11;;;;2917:38;;3006:26;3172:34;2917:38;2965:31;2917:38;;3080:39;2917:38;;:::i;:::-;;2965:31;:::i;:::-;;3006:26;:::i;:::-;-1:-1:-1;3043:22:11;1396:21;;-1:-1:-1;;;;;;1396:21:11;-1:-1:-1;;;;;472:36530:11;;;;1396:21;;;;;472:36530;;-1:-1:-1;1396:21:11;;472:36530;1396:21;;;;;;3080:39;472:36530;3130:27;472:36530;;;1396:21;-1:-1:-1;1396:21:11;;472:36530;1396:21;;;3172:34;3231:15;3217:29;472:36530;-1:-1:-1;3329:7:11;;;;;;2061:4;1396:21;;-1:-1:-1;;;;;;1396:21:11;;;;;-1:-1:-1;472:36530:11;1396:21;472:36530;;1939:61:8;;472:36530:11;1396:21;;;;;-1:-1:-1;1396:21:11;2427:20:8;472:36530:11;;;735:10:7;1396:21:11;;2427:20:8;472:36530:11;;;;;;;;;1939:61:8;1974:15;;;-1:-1:-1;1974:15:8;3788:23:11;-1:-1:-1;1974:15:8;3338:3:11;3365:18;;;;:::i;:::-;1396:21;3386:18;;;;:::i;:::-;1396:21;-1:-1:-1;472:36530:11;;;-1:-1:-1;;;;;3468:10:11;;;;:::i;:::-;1396:21;472:36530;3516:18;;;;;:::i;:::-;1396:21;;-1:-1:-1;1396:21:11;3492:14;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;3572:18;;;;:::i;:::-;1396:21;;-1:-1:-1;1396:21:11;3548:14;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;1396:21;-1:-1:-1;1396:21:11;3604:15;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;1396:21;;;;;;;;3677:18;3652:64;472:36530;3677:18;;;;:::i;:::-;1396:21;3697:18;;;;:::i;:::-;1396:21;472:36530;;1396:21;;;472:36530;1396:21;;;3652:64;-1:-1:-1;;;;;3761:12:11;;;;:::i;:::-;1396:21;472:36530;1396:21;-1:-1:-1;1396:21:11;3788:23;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;;;;;;;;;;;;1396:21;;;;;;;;-1:-1:-1;1396:21:11;3844:23;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;;;;;;;;;;;;1396:21;;;;;;;3914:34;-1:-1:-1;3914:34:11;;4106:17;;;;:::i;:::-;1396:21;472:36530;;1396:21;;;472:36530;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;1396:21;;;472:36530;4030:154;;1396:21;;;472:36530;4030:154;;3231:15;1396:21;;;-1:-1:-1;1396:21:11;4198:15;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;;;;;;;;;;;472:36530;1396:21;;;;;;;;;;472:36530;1396:21;;;-1:-1:-1;1396:21:11;3604:15;472:36530;-1:-1:-1;1396:21:11;;;;472:36530;;;;;;;;;;;;1396:21;;472:36530;;;;;;;1396:21;;;;;;;;;;;472:36530;1396:21;;;472:36530;4260:45;472:36530;4287:17;;;;:::i;:::-;1396:21;472:36530;;1396:21;;;;-1:-1:-1;472:36530:11;1396:21;;;472:36530;1396:21;;;4260:45;-1:-1:-1;1396:21:11;4320:22;472:36530;1396:21;3231:15;472:36530;-1:-1:-1;1396:21:11;472:36530;1396:21;3314:13;;1396:21;472:36530;;;-1:-1:-1;1396:21:11;1564:2;3788:23;1396:21;;-1:-1:-1;1396:21:11;;472:36530;;;-1:-1:-1;472:36530:11;;3788:23;472:36530;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;2715:158;472:36530;;;2850:23;;2715:158;;:118;472:36530;;;2804:29;;2715:118;;:73;472:36530;;;2759:29;;2715:73;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;472:36530:11;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;472:36530:11;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1396:21;472:36530;;1396:21;;;;;;;;;;;;:::o;292:438:15:-;377:326;;;719:4;292:438;:::o;377:326::-;;;;;;;;;;;;;;;6155:316:0;-1:-1:-1;;;;;472:36530:11;;2241:4:0;1396:21:11;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;2241:4:0;1396:21:11;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;;;-1:-1:-1;;1396:21:11;2930:6:0;1396:21:11;;;735:10:7;;472:36530:11;-1:-1:-1;;;;;;;;;;;2241:4:0;;6346:40;2930:6;6400:11;:::o;6248:217::-;6442:12;2241:4;6442:12;:::o;6155:316::-;-1:-1:-1;;;;;472:36530:11;;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;;;-1:-1:-1;;1396:21:11;2930:6:0;1396:21:11;;;735:10:7;;472:36530:11;1330:24;;-1:-1:-1;;;;;;;;;;;6346:40:0;472:36530:11;6346:40:0;2930:6;6400:11;:::o;6155:316::-;-1:-1:-1;;;;;472:36530:11;;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;;;-1:-1:-1;;1396:21:11;2930:6:0;1396:21:11;;;735:10:7;;472:36530:11;1396:21;;-1:-1:-1;;;;;;;;;;;6346:40:0;472:36530:11;6346:40:0;2930:6;6400:11;:::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c0033","offset":21200}},"transformations":[{"type":"insert","offset":21381,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000089ab9241aab22a86b4b5fd05628f3e3c34f9777f00000000000000000000000095abf5bf2afe39ddd92cc35f8bc2a3dbcfee1ef900000000000000000000000089ab9241aab22a86b4b5fd05628f3e3c34f9777f00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000fc8e6b1ab1a4c37724f8bc797730afa8d01d04ef000000000000000000000000000000000000000000000000000000000000000100000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000000000000000000000100000000000000000000000073af543d809c8d3414e5b92b3aa2c25b182ba3a1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}},"runtimeBytecode":{"onchainBytecode":"0x60806040526004361015610012575b5f80fd5b5f5f3560e01c806301e51e971461386257806301ffc9a71461380b57806304d3a96d146133c35780630db14e95146132305780630f40517a146131f75780631a9be40a146130465780632169678314612dc5578063248a9ca314612d99578063251d6ec314612d605780632647d92914612d335780632d4abd2d14612bc35780632f2ff15d14612b8457806332cf58c414612a0d57806336103291146128e657806336568abe146128a157806339de62a6146128245780633a33a4f8146126785780633f4ba83a14612612578063403f37311461257d57806343ab265f1461255957806344337ea1146124a157806348d832cb146123ca5780634d2b1444146123ac5780634f8fe1f11461232f578063537df3b61461227d5780635c975abb1461225b5780635f2567571461221a5780636382d9ad1461213357806366fd9d6514611ca657806368c4ac2614611c675780636c0a188e14611c495780637c395b1314611aae578063812a71d5146118bb5780638456cb591461186257806391d148541461181857806395d322b0146117df5780639ed9e4831461166f578063a1bab44714611603578063a217fddf146115e7578063abd42922146115a3578063adc9772e146112f8578063cb0b8fe5146112bf578063d295fa9a1461117b578063d40549c01461113a578063d547741f146110f2578063da57c7d714610f0a578063ddd5e1b214610c80578063e30227ea14610ba1578063e315d80414610b68578063e8690bc2146108b1578063ebc73e6514610850578063f56f4f0f1461081b578063f7192ba8146104a0578063f92396a6146102b95763fe575a8714610278575f80fd5b346102b65760203660031901126102b65760209060ff906040906001600160a01b036102a2613c87565b168152600a84522054166040519015158152f35b80fd5b50346102b65760403660031901126102b6576102d3613c87565b6001600160a01b03168082526003602052604082205460243591906102fa9060ff16613d52565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b8352600160209081526040808520335f908152925290205460ff1615610469578115610439576040516370a0823160e01b8152306004820152602081602481855afa90811561042e5784916103fc575b5082116103c257600b5461038a9083906001600160a01b0316836144d1565b7f9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85602060018060a01b03600b5416604051908152a380f35b60405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b90506020813d602011610426575b8161041760209383613ea4565b8101031261000e57515f61036b565b3d915061040a565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152600860248201526706d757374203e20360c41b6044820152606490fd5b63e2517d3f60e01b8352336004527f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b602452604483fd5b50346102b65760403660031901126102b6576004356104bd613c9d565b906104c661435d565b338352600a6020526104df60ff60408520541615613d92565b60ff60145460a81c166107d657808352600760205261050060408420613fe6565b818452600760205283600660408220828155826001820155826002820155826003820155826004820155826005820155015560018060a01b036020820151169033855260086020526040852060018060a01b0383165f5260205260405f2033865260086020526040862060018060a01b0384165f52602052610587600360405f2001613f84565b946060830151156107d2576040830151336001600160a01b03909116036107d2576105b38351156142b2565b6001600160a01b038116936105c99085146142e8565b865b86518110156107c357856105df8289614051565b51146105ed576001016105cb565b9091929394958051905f1982019182116107af579161063d610616610642936106809695614051565b51610625600388019384613dcc565b90919082549060031b91821b915f19901b1916179055565b614322565b60a0608085015194015192610658858254614065565b815560018101610669858254614065565b905560024291015561067b8133614377565b6143f5565b61068a8284614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561079b5786916106b691613e15565b8482526010602052604082206106cd858254614065565b90558482526012602052604082206106e6848254614065565b9055848252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c57610773575b505061074391614065565b916040519081527f16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b1860203392a480f35b8161077d91613ea4565b61078857845f610738565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b89526011600452602489fd5b50610680919293949550610642565b8680fd5b60405162461bcd60e51b815260206004820152601860248201527f63616e63656c20636c61696d206e6f7420656e61626c656400000000000000006044820152606490fd5b50346102b65760403660031901126102b657602061084861083a613c87565b610842613c9d565b90614512565b604051908152f35b50346102b65760203660031901126102b65760043561086d61485a565b7fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd399692296040600f5461089f8185141561427c565b8151908152836020820152a1600f5580f35b50346102b65760a03660031901126102b6576108cb613c87565b60243590604435906084356001600160a01b0381169160643591839003610b64576108f461485a565b6108fd81614a62565b506001600160a01b03168086526003602052604086205490929060ff16610b3357612710821080610b2a575b15610aef57828652600360205260408620805460ff19166001179055859061094f61485a565b838252600360205261096760ff604084205416613d52565b85151580610ae6575b15610ae257837fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd60407f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de98606098847fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260808983610acd9b52600d602052868082205491858152600e6020522054875191825260208201528587820152848e820152a2848c52600d60205281838d2055848c52600e60205280838d205582519182526020820152a283875260046020526040872060018060a01b0382166001600160601b0360a01b825416179055808752600560205260408720846001600160601b0360a01b825416179055604051907fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f38880a2610aad81613e88565b838152826020820152426040820152838752600960205260408720614219565b6040519182528460208301526040820152a180f35b5080fd5b50848610610970565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c696420726577617264207261746560681b6044820152606490fd5b50811515610929565b60405162461bcd60e51b815260206004820152600960248201526814dd5c1c1bdc9d195960ba1b6044820152606490fd5b8580fd5b50346102b65760203660031901126102b6576020906040906001600160a01b03610b90613c87565b168152601283522054604051908152f35b50346102b65760203660031901126102b6576001600160a01b03610bc3613c87565b1681526009602052604081208054610bda81613fce565b91610be86040519384613ea4565b81835283526020808420849184015b838310610c425785858051915f198301928311610c2e5760406020610c1c8585614051565b51015181519081526127106020820152f35b634e487b7160e01b81526011600452602490fd5b60036020600192604051610c5581613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190610bf7565b50346102b65760403660031901126102b657600435610c9d613c9d565b90610ca661435d565b338352600a602052610cbf60ff60408520541615613d92565b8083526007602052610cd360408420613fe6565b60208181015133808752600880845260408089206001600160a01b039094165f818152948652818520938a52918552808920828552909452929091209094919290610d2090600301613f84565b946060820192835115610f065760e08301514210610f06576040830151336001600160a01b0390911603610f0657610d6d90610d5d8451156142b2565b6001600160a01b031685146142e8565b848752600760205260408720805460ff19166001179055865b8651811015610ef55785610d9a8289614051565b5114610da857600101610d86565b9091929394958051905f1982019182116107af5760059261063d610dd4610e50979694610de394614051565b51610625600386019384613dcc565b60808301928351878a526002602052610e0160408b20918254613df5565b9055855193519060c060a08201519101519160405195610e2087613e33565b600187528960208801523360408801526060870152608086015260a085015260c08401524260e084015201613ec6565b601454815185916001600160a01b0316803b15610797576040516317d5759960e31b81526001600160a01b0386166004820152336024820152604481019290925282908290606490829084905af1801561078c57610edc575b505051916040519081527fdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd60203392a480f35b81610ee691613ea4565b610ef157835f610ea9565b8380fd5b50610e509293949550600590610de3565b8780fd5b50346102b657610f1936613cb3565b91836060604051610f2981613e6c565b828152826020820152826040820152015260018060a01b03821684526003602052610f5a60ff604086205416613d52565b60018060a01b031683526008602052604083209060018060a01b03165f5260205260405f20604051610f8b81613e50565b815481526001820154602082015260028201546040820152610faf60038301613f84565b606082015260048201918254610fc481613fce565b93610fd26040519586613ea4565b81855286526020808720879186015b83831061109d5750505050600590608083019384520190815461100381613fce565b926110116040519485613ea4565b81845286526020808720969084015b82821061107f57608061104788888860a089015261104181515183106141e5565b51614051565b5160606040519160018060a01b03815116835260018060a01b0360208201511660208401526040810151604084015201516060820152f35b6007602060019261108f8b613fe6565b815201980191019096611020565b6004602060019260409b989b516110b381613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190979497610fe1565b50346102b65760403660031901126102b657611136600435611112613c9d565b9061113161112c825f526001602052600160405f20015490565b614918565b6149de565b5080f35b50346102b65760203660031901126102b6576020906001600160a01b0361115f613c87565b16815260048252604060018060a01b0391205416604051908152f35b50346102b65760403660031901126102b657600435600461119a613c9d565b6001600160a01b03818116808652602084815260408088205490516318160ddd60e01b81529592939192869290918391165afa9283156112b4578593611280575b50845260106020526111f260408520549130614512565b8261123257505050670de0b6b3a7640000915b670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e5760206108488484613e15565b61123b91614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561126c579061126691613e15565b91611205565b634e487b7160e01b84526011600452602484fd5b9092506020813d6020116112ac575b8161129c60209383613ea4565b8101031261000e5751915f6111db565b3d915061128f565b6040513d87823e3d90fd5b50346102b65760203660031901126102b6576020906040906001600160a01b036112e7613c87565b168152601083522054604051908152f35b50346102b65760403660031901126102b657611312613c87565b6001600160a01b03811680835260036020526040832054602435929061133a9060ff16613d52565b61134261435d565b338452600a60205261135b60ff60408620541615613d92565b338452600860205260408420825f5260205260405f209083825401838652600d60205260408620548110610b6457838652600e602052604086205410610788576040516323b872dd60e01b6020820152336024820152306044820152606480820186905281526113e591906113db906113d5608482613ea4565b85614a8d565b61067b8133614377565b8285526010602052604085206113fc858254614065565b9055670de0b6b3a76400008402848104670de0b6b3a7640000148515171561158f57859161142991613e15565b838252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c5761157a575b50506040516004820161148b82613e6c565b8382526020820133815260408301908682526060840192428452805490600160401b82101561156657600182018082558210156115525789526020808a209551600292831b90960180546001600160a01b039788166001600160a01b03199182161782559351600182018054919098169416939093179095559151818301559151600390920191909155825485019092558285525260408320805483019055337f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f78480a480f35b634e487b7160e01b8a52603260045260248afd5b634e487b7160e01b8a52604160045260248afd5b8161158491613ea4565b610ef157835f611479565b634e487b7160e01b86526011600452602486fd5b50346102b65760203660031901126102b6576115d760406115e3926115c66141a9565b506004358152600760205220613fe6565b60405191829182613ced565b0390f35b50346102b657806003193601126102b657602090604051908152f35b50346102b65760203660031901126102b65760043561162061485a565b61271081111580611663575b6116359061427c565b80600c547f2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e108480a3600c5580f35b50600c5481141561162c565b50346102b65760403660031901126102b657611689613c87565b611691613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20604051916116c483613e50565b8154835260018201546020840152600282015460408401526116e860038301613f84565b6060840152600482019182546116fd81613fce565b9361170b6040519586613ea4565b81855283526020808420849186015b83831061179057505050506080840192835260050180549061173b82613fce565b926117496040519485613ea4565b82845290815260208082209084015b838310611772576020868660a08a01525151604051908152f35b6007602060019261178285613fe6565b815201920192019190611758565b600460206001926040516117a381613e6c565b848060a01b038654168152848060a01b03858701541683820152600286015460408201526003860154606082015281520192019201919061171a565b50346102b65760203660031901126102b6576020906040906001600160a01b03611807613c87565b168152600d83522054604051908152f35b50346102b65760403660031901126102b6576040611834613c9d565b9160043581526001602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102b657806003193601126102b65761187b6148a9565b61188361435d565b600160ff198254161781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346102b65760403660031901126102b6576118d5613c87565b6001600160a01b0381168083526003602052604083205460243592906118fd9060ff16613d52565b61190561485a565b612710831015611a7a57818452600960205260408420805461192681613fce565b916119346040519384613ea4565b81835286526020808720879184015b838310611a3c57505050508051905f19820191821161158f5760209161196891614051565b510151918383141580611a33575b156119fb577f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de936119d06119f592604051906119b182613e88565b8082528360208301524260408301528852600960205260408820614219565b60405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a180f35b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964206e6577207261746560801b6044820152606490fd5b50831515611976565b60036020600192604051611a4f81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190611943565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b6044820152606490fd5b50346102b657611abd36613cb3565b9291611ac76141a9565b506001600160a01b038216835260036020526040832054611aea9060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f2060405190611b1c82613e50565b805482526001810154602083015260028101546040830152611b4060038201613f84565b6060830152600481018054611b5481613fce565b91611b626040519384613ea4565b81835285526020808620869184015b838310611bfa57505050506080830152600501805490611b9082613fce565b93611b9e6040519586613ea4565b82855290815260208082209085015b838310611bdc576115e3611bcf888861104160a08a01918083525183106141e5565b5160405191829182613ced565b60076020600192611bec85613fe6565b815201920192019190611bad565b60046020600192604051611c0d81613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190611b71565b50346102b657806003193601126102b6576020600654604051908152f35b50346102b65760203660031901126102b65760209060ff906040906001600160a01b03611c92613c87565b168152600384522054166040519015158152f35b50346102b65760803660031901126102b657611cc0613c87565b611cc8613c9d565b6044356001600160a01b03811691908281036107885760643590338652600a602052611cfb60ff60408820541615613d92565b6001600160a01b038316808752600a6020526040872054909190611d229060ff1615613d92565b848752600a602052611d3b60ff60408920541615613d92565b8482146120ee5782156120a957611d528685614072565b9383851061207a57338314612029576001600160a01b03878116808a52600460208181526040808d20549051636eb1769f60e11b81528686169381019390935233602484015292939192909183916044918391165afa801561201e5786918b91611fe9575b5010611fb8578089526004602052604089205489906001600160a01b0316803b15610ae257604051630f75ba2160e41b81526001600160a01b0385166004820152336024820152604481018890529082908290606490829084905af1801561078c57611f9f575b5052600460208181526040808b205490516323b872dd60e01b81526001600160a01b03858116948201949094528584166024820152604481018890529492859116818c81606481015b03925af1928315611f9457888093611e8892611e8d96611f65575b50614377565b614377565b855260086020526040852060018060a01b0385165f5260205260405f2091825491600184019586549588526008602052604088209060018060a01b03165f5260205260405f2096670de0b6b3a76400008202918204670de0b6b3a764000003610c2e5750611f22611f52959493670de0b6b3a7640000611f1b611f14611f38968396613e15565b8093613e02565b0495613e02565b0492611f2f818854614065565b87558254613df5565b905560018401611f49828254614065565b90558254613df5565b9055600242910155602060405160018152f35b611f869060203d602011611f8d575b611f7e8183613ea4565b810190614191565b505f611e82565b503d611f74565b6040513d8b823e3d90fd5b81611fa991613ea4565b611fb457885f611e1e565b8880fd5b60405162461bcd60e51b8152602060048201526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b9150506020813d602011612016575b8161200560209383613ea4565b8101031261000e578590515f611db7565b3d9150611ff8565b6040513d8c823e3d90fd5b6001600160a01b038781168952600460208181526040808c205490516323b872dd60e01b815233938101939093528584166024840152604483018890529194929091859116818c8160648101611e67565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f66726f6d2063616e206e6f742062652073616d652061732074686520746f00006044820152606490fd5b50346102b65760403660031901126102b65761214d613c87565b612155613c9d565b9061215e61485a565b61216781614a62565b5061217182614a62565b506040516370a0823160e01b81523060048201526001600160a01b03919091169190602081602481865afa801561042e5784906121e6575b6121b5915082846144d1565b6001600160a01b0316907ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f8380a380f35b506020813d602011612212575b8161220060209383613ea4565b8101031261000e576121b590516121a9565b3d91506121f3565b50346102b65760203660031901126102b6576020906001600160a01b0361223f613c87565b16815260058252604060018060a01b0391205416604051908152f35b50346102b657806003193601126102b65760ff60209154166040519015158152f35b50346102b65760203660031901126102b657612297613c87565b61229f61485a565b6001600160a01b0316808252600a602052604082205460ff16156122f857808252600a60205260408220805460ff191690557f1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde88280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08189b1858dadb1a5cdd1959608a1b6044820152606490fd5b50346102b65760203660031901126102b657600435801515809103610ae25761235661485a565b60145460ff8160a81c1615159061236f82841415614110565b60ff60a81b191660a883901b60ff60a81b16176014557f84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce98380a380f35b50346102b657806003193601126102b6576020600f54604051908152f35b50346102b65760603660031901126102b6576123e4613c87565b602435604435916123f361485a565b6001600160a01b0316808452600360205260408420549091906124189060ff16613d52565b80151580612498575b15610ef157818452600d602052817fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260806040872054838852600e60205260408820546040519182526020820152846040820152866060820152a2818452600d60205260408420558252600e602052604082205580f35b50828110612421565b50346102b65760203660031901126102b6576124bb613c87565b6124c361485a565b6001600160a01b0316808252600a602052604082205460ff1661251e57808252600a60205260408220805460ff191660011790557f44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b8789678280a280f35b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e48189b1858dadb1a5cdd1959606a1b6044820152606490fd5b50346102b65760203660031901126102b6576020610848612578613c87565b61414e565b50346102b65760203660031901126102b657612597613c87565b61259f61485a565b6125a881614a62565b50600b546001600160a01b03828116929082169083821461078857604080516001600160a01b0393841681529190921660208201527f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9190a16001600160a01b03191617600b5580f35b50346102b657806003193601126102b65761262b6148a9565b805460ff8116156126695760ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b50346102b65760403660031901126102b657612692613c87565b61269a613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f206040516126cc81613e50565b8154815260018201546020820152600282015460408201526126f060038301613f84565b916060820192835260048101805461270781613fce565b916127156040519384613ea4565b81835286526020808720879184015b8383106127d557505050509060059160808401520190815461274581613fce565b926127536040519485613ea4565b81845285526020808620869185015b8383106127b7575050505060a001525190604051918291602083016020845282518091526020604085019301915b81811061279e575050500390f35b8251845285945060209384019390920191600101612790565b600760206001926127c785613fe6565b815201920192019190612762565b600460206001926040516127e881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612724565b50346102b65760203660031901126102b657600435801515809103610ae25761284b61485a565b60145460ff8160a01c1615159061286482841415614110565b60ff60a01b191660a083901b60ff60a01b16176014557f99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b8380a380f35b50346102b65760403660031901126102b6576128bb613c9d565b336001600160a01b038216036128d757611136906004356149de565b63334bd91960e11b8252600482fd5b50346102b65760403660031901126102b657600490612903613c9d565b6001600160a01b03818116808452602085815260408086205490516318160ddd60e01b81529692939192879290918391165afa938415612a025783946129ce575b508252601060205261295b60408320549130614512565b8361298557505050506020670de0b6b3a764000061297c815b600435613e02565b04604051908152f35b61298e91614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e575061297c6129c9602093670de0b6b3a764000093613e15565b612974565b9093506020813d6020116129fa575b816129ea60209383613ea4565b8101031261000e5751925f612944565b3d91506129dd565b6040513d85823e3d90fd5b50346102b65760403660031901126102b657612a27613c87565b612a2f613c9d565b60018060a01b038216835260086020526040832060018060a01b0382165f5260205260405f2060405190612a6282613e50565b805482526001810154602083015260028101546040830152612a8660038201613f84565b6060830152600481018054612a9a81613fce565b91612aa86040519384613ea4565b81835287526020808820889184015b838310612b35575050505060808301526005018054612ad581613fce565b91612ae36040519384613ea4565b81835286526020808720969083015b828210612b1757602087612b0e88888860a08201525192614512565b01604051908152f35b60076020600192612b278b613fe6565b815201980191019096612af2565b60046020600192604051612b4881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612ab7565b50346102b65760403660031901126102b657611136600435612ba4613c9d565b90612bbe61112c825f526001602052600160405f20015490565b614952565b50346102b65760403660031901126102b657612bdd613c87565b612be5613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f209060405190612c1982613e50565b825482526001830154602083015260028301546040830152612c3d60038401613f84565b606083015260048301928354612c5281613fce565b90612c606040519283613ea4565b80825260208201958452602084209584905b828210612ce4575050506080840152600501805490612c9082613fce565b92612c9e6040519485613ea4565b82845290815260208082209084015b838310612cc6576020858060a089015251604051908152f35b60076020600192612cd685613fe6565b815201920192019190612cad565b60046020600192604051612cf781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096612c72565b50346102b65760403660031901126102b6576020610848612d52613c87565b612d5a613c9d565b90614072565b50346102b65760203660031901126102b6576020906040906001600160a01b03612d88613c87565b168152600e83522054604051908152f35b50346102b65760203660031901126102b65760206108486004355f526001602052600160405f20015490565b50346102b657612dd436613cb3565b919290428311156130125760018060a01b038416825260086020526040822060018060a01b0382165f5260205260405f209160405191612e1383613e50565b835483526001840154602084015260028401549360408401948552612e3a60038201613f84565b6060850152600481018054612e4e81613fce565b91612e5c6040519384613ea4565b81835285526020808620869184015b838310612fc3575050505060808501526005018054612e8981613fce565b91612e976040519384613ea4565b81835284526020808520859184015b838310612fa5575050505060a08401526001600160a01b03811682526009602052604082208054909690612ed981613fce565b97612ee7604051998a613ea4565b8189528452602080852085918a015b838310612f6757505050508651965f19880197881161126c57602097612f1b91614051565b51929451612f4a575b505084612f39644979cb9e0094954290613df5565b925191015102020401604051908152f35b644979cb9e009450612f608792612f3992614512565b9450612f24565b60036020600192604051612f7a81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190612ef6565b60076020600192612fb585613fe6565b815201920192019190612ea6565b60046020600192604051612fd681613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612e6b565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606490fd5b50346102b65760403660031901126102b657613060613c87565b613068613c9d565b9082916130758183614512565b9160018060a01b031684526008602052604084209060018060a01b03165f5260205260405f2092604051936130a985613e50565b8054855260018101546020860152600281015460408601526130cd60038201613f84565b60608601526004810180546130e181613fce565b916130ef6040519384613ea4565b81835284526020808520859184015b8383106131a857505050509060059160808701520193845461311f81613fce565b9561312d6040519788613ea4565b81875283526020808420849188015b83831061318a575050505060a001938452915b8351805184101561317d5760019160a061316c8661317594614051565b51015190614065565b92019161314f565b5060209160405191018152f35b6007602060019261319a85613fe6565b81520192019201919061313c565b600460206001926040516131bb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906130fe565b50346102b65760203660031901126102b6576020906040906001600160a01b0361321f613c87565b168152600283522054604051908152f35b50346102b65760403660031901126102b65761324a613c87565b613252613c9d565b6001600160a01b0381168352600360205260408320549091906132779060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20906040516132a981613e50565b8254815260018301546020820152600283015460408201526132cd60038401613f84565b6060820152600483019283546132e281613fce565b906132f06040519283613ea4565b80825260208201958552602085209585905b82821061337457505050608083015260050180549061332082613fce565b9361332e6040519586613ea4565b82855290815260208082209085015b838310613356576020858760a082015251604051908152f35b6007602060019261336685613fe6565b81520192019201919061333d565b6004602060019260405161338781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096613302565b50346102b65760403660031901126102b6576133dd613c87565b6001600160a01b0381168083526003602052604083205460243592906134059060ff16613d52565b61340d61435d565b338452600a60205261342660ff60408620541615613d92565b60ff60145460a01c166137c657338452600860205260408420825f5260205260405f20906134548133614377565b61345d816143f5565b918054906001810191825487151591826137a9575b5050156107d2576006548752600760205281549587815f19810361376457505050805487818801979355938782555b8615613727578588526010602052604088206134be868254613df5565b90558588526012602052604088206134d7848254613df5565b9055670de0b6b3a76400008702878104670de0b6b3a7640000036107af57889161350091613e15565b86825260046020526024602060018060a01b03604085205416604051928380926370a0823160e01b82523360048301525afa908115612a025783916136f2575b5080821180156136e9575b6136e1575b50868252600460205260408220546001600160a01b0316803b1561079757604051632770a7eb60e21b8152336004820152602481019290925282908290604490829084905af1801561078c576136cc575b5050600c546127100361271081116136b8576135c06127109188613e02565b0490816135d66135d0828a613df5565b9561414e565b1061367e576135e96136459233886144d1565b858852600260205260408820613600868254613df5565b905560056040519161361183613e33565b600183528760208401523360408401528860608401528660808401528460a08401524260c08401524260e084015201613ec6565b604051928352602083015260408201527f25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c28960603392a480f35b60405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b816136d691613ea4565b6107d257865f6135a1565b90505f613550565b5083541561354b565b9250506020823d60201161371f575b8161370e60209383613ea4565b8101031261000e578891515f613540565b3d9150613701565b60405162461bcd60e51b81526020600482015260156024820152746e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b919790959390828110613785575061377d828254613df5565b9055916134a1565b909395506137969189829555613df5565b6137a1818354613df5565b8255936134a1565b018711801591506137bc575b5f80613472565b505f1986146137b5565b60405162461bcd60e51b815260206004820152601a60248201527f666c617368207769746864726177206e6f7420656e61626c65640000000000006044820152606490fd5b50346102b65760203660031901126102b65760043563ffffffff60e01b8116809103610ae257602090637965db0b60e01b8114908115613851575b506040519015158152f35b6301ffc9a760e01b14905082613846565b3461000e57604036600319011261000e5761387b613c87565b6024359060018060a01b03811691825f5260036020526138a160ff60405f205416613d52565b6138a961435d565b335f52600a6020526138c260ff60405f20541615613d92565b6138cc8233614377565b6138d5826143f5565b90335f52600860205260405f20845f5260205260405f2093845493600186019485548415159182613c6a575b505015613c34576006545f52600760205260405f2090835f908754955f1981145f14613bed5750505086545f818601959755945f88555b60048301968755600383019586558415613bb05760038801600654815491600160401b831015613b9c578261062591600161397595018155613dcc565b8554845f52601060205261398e60405f20918254613df5565b90558654845f5260126020526139a960405f20918254613df5565b9055670de0b6b3a76400008502858104670de0b6b3a764000003613b88576024916139d391613e15565b97845f526004602052602060018060a01b0360405f205416604051938480926370a0823160e01b82523360048301525afa918215613b37575f92613b54575b50818911908115613b4a575b50613b42575b505f838152600460205260409020546001600160a01b0316803b1561000e57604051632770a7eb60e21b815233600482015260248101989098525f908890604490829084905af1908115613b3757602097613aa192613b27575b508254610100600160a81b03191660089190911b610100600160a81b0316178255565b600181810180546001600160a01b03191633908117909155600283018590554260058401819055600f54016006938401558254918201909255935494546040805192835260208301969096529481019490945291928392907ff74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba90606090a4604051908152f35b5f613b3191613ea4565b5f613a7e565b6040513d5f823e3d90fd5b965087613a24565b9050541589613a1e565b9091506020813d602011613b80575b81613b7060209383613ea4565b8101031261000e57519089613a12565b3d9150613b63565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b81526020600482015260156024820152744e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b9196979095828110155f14613c105750613c08828254613df5565b905595613938565b90979650613c21915f829955613df5565b613c2c818954613df5565b885594613938565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b01841180159150613c7d575b8780613901565b505f198314613c76565b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b606090600319011261000e576004356001600160a01b038116810361000e57906024356001600160a01b038116810361000e579060443590565b91909160e08061010083019480511515845260018060a01b03602082015116602085015260018060a01b036040820151166040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b15613d5957565b60405162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b6044820152606490fd5b15613d9957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b8054821015613de1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211613b8857565b81810292918115918404141715613b8857565b8115613e1f570490565b634e487b7160e01b5f52601260045260245ffd5b610100810190811067ffffffffffffffff821117613b9c57604052565b60c0810190811067ffffffffffffffff821117613b9c57604052565b6080810190811067ffffffffffffffff821117613b9c57604052565b6060810190811067ffffffffffffffff821117613b9c57604052565b90601f8019910116810190811067ffffffffffffffff821117613b9c57604052565b805490600160401b821015613b9c5760018201808255821015613de1575f90815260209081902083516007909302018054918401516001600160a81b031990921660ff931515939093169290921760089190911b610100600160a81b03161781559060069060e09060408101516001850180546001600160a01b0319166001600160a01b0392909216919091179055606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b90604051918281549182825260208201905f5260205f20925f5b818110613fb5575050613fb392500383613ea4565b565b8454835260019485019487945060209093019201613f9e565b67ffffffffffffffff8111613b9c5760051b60200190565b90604051613ff381613e33565b825460ff81161515825260081c6001600160a01b03908116602083015260018401541660408201526002830154606082015260038301546080820152600483015460a0820152600583015460c08201526006929092015460e0830152565b8051821015613de15760209160051b010190565b91908201809211613b8857565b6001600160a01b039091165f818152600360205260409020546140979060ff16613d52565b5f526004602052602060018060a01b0360405f205416916024604051809481936370a0823160e01b835260018060a01b031660048301525afa908115613b37575f916140e1575090565b90506020813d602011614108575b816140fc60209383613ea4565b8101031261000e575190565b3d91506140ef565b1561411757565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd1a1a5b99c818da185b99d959608a1b6044820152606490fd5b602060249161415c81614a62565b506040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115613b37575f916140e1575090565b9081602091031261000e5751801515810361000e5790565b604051906141b682613e33565b5f60e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b156141ec57565b60405162461bcd60e51b81526020600482015260056024820152640d2dcc8caf60db1b6044820152606490fd5b805490600160401b821015613b9c5760018201808255821015613de1576002916040915f52600360205f209102019260018060a01b0360018060a01b03825116166001600160601b0360a01b855416178455602081015160018501550151910155565b1561428357565b60405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606490fd5b156142b957565b60405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606490fd5b156142ef57565b60405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606490fd5b80548015614349575f1901906143388282613dcc565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b60ff5f541661436857565b63d93c066560e01b5f5260045ffd5b9060018060a01b0382165f52600860205260405f2060018060a01b0382165f5260205260405f20915f82600285019283546143e4575b506143ba60019130614512565b94015542905560018060a01b0316805f5260116020524260405f20555f52601260205260405f2055565b6143ee9250614512565b825f6143ad565b6001600160a01b039081165f818152600460208181526040928390205492516318160ddd60e01b81529490928592918391165afa918215613b37575f9261449d575b508161444b575050670de0b6b3a764000090565b8061446f915f52601060205260405f2054905f52601260205260405f205490614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715613b885761449a91613e15565b90565b9091506020813d6020116144c9575b816144b960209383613ea4565b8101031261000e5751905f614437565b3d91506144ac565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613fb39161450d606483613ea4565b614a8d565b9091906001600160a01b0316308114614827575f52600860205260405f2060018060a01b0383165f5260205260405f209160405161454f81613e50565b83548152600184015490602081019182526002850154946040820195865261457960038201613f84565b606083015260048101805461458d81613fce565b9161459b6040519384613ea4565b81835260208301905f5260205f205f915b8383106147d85750505050608083015260050180546145ca81613fce565b916145d86040519384613ea4565b81835260208301905f5260205f205f915b8383106147ba575050505060a08201525193519051915b60018060a01b03165f52600960205260405f2090815461461f81613fce565b9261462d6040519485613ea4565b81845260208401905f5260205f205f915b83831061477c57505050508151915f198301838111613b88576146619082614051565b5192821561477257604084019183835111155f146146a0575050509061449a93946020614694644979cb9e009442613df5565b92015102020490614065565b5f939293925f5b838110614744575b505b8284106146d557505050509061449a93946020614694644979cb9e00945142613df5565b83969192931561473a576146f79060406146ef8986614051565b510151613df5565b5f198701878111613b88576001916020614717644979cb9e009387614051565b5101518b020204604061472a8986614051565b5101519201965b019291906146b1565b9095600190614731565b60406147538285969795614051565b510151821061476857600101939291936146a7565b939291505f6146af565b505f955050505050565b6003602060019260405161478f81613e88565b848060a01b03865416815284860154838201526002860154604082015281520192019201919061463e565b600760206001926147ca85613fe6565b8152019201920191906145e9565b600460206001926040516147eb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906145ac565b506001600160a01b0382165f90815260106020908152604080832054601183528184205460129093529220549193614600565b335f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff161561489257565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8602052604090205460ff16156148e157565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260016020908152604080832033845290915290205460ff161561493c5750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff166149d8575f8181526001602081815260408084206001600160a01b0396909616808552959091528220805460ff19169091179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff16156149d8575f8181526001602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b15614a6c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b905f602091828151910182855af115613b37575f513d614adc57506001600160a01b0381163b155b614abc5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614ab556fea2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c0033","recompiledBytecode":"0x60806040526004361015610012575b5f80fd5b5f5f3560e01c806301e51e971461386257806301ffc9a71461380b57806304d3a96d146133c35780630db14e95146132305780630f40517a146131f75780631a9be40a146130465780632169678314612dc5578063248a9ca314612d99578063251d6ec314612d605780632647d92914612d335780632d4abd2d14612bc35780632f2ff15d14612b8457806332cf58c414612a0d57806336103291146128e657806336568abe146128a157806339de62a6146128245780633a33a4f8146126785780633f4ba83a14612612578063403f37311461257d57806343ab265f1461255957806344337ea1146124a157806348d832cb146123ca5780634d2b1444146123ac5780634f8fe1f11461232f578063537df3b61461227d5780635c975abb1461225b5780635f2567571461221a5780636382d9ad1461213357806366fd9d6514611ca657806368c4ac2614611c675780636c0a188e14611c495780637c395b1314611aae578063812a71d5146118bb5780638456cb591461186257806391d148541461181857806395d322b0146117df5780639ed9e4831461166f578063a1bab44714611603578063a217fddf146115e7578063abd42922146115a3578063adc9772e146112f8578063cb0b8fe5146112bf578063d295fa9a1461117b578063d40549c01461113a578063d547741f146110f2578063da57c7d714610f0a578063ddd5e1b214610c80578063e30227ea14610ba1578063e315d80414610b68578063e8690bc2146108b1578063ebc73e6514610850578063f56f4f0f1461081b578063f7192ba8146104a0578063f92396a6146102b95763fe575a8714610278575f80fd5b346102b65760203660031901126102b65760209060ff906040906001600160a01b036102a2613c87565b168152600a84522054166040519015158152f35b80fd5b50346102b65760403660031901126102b6576102d3613c87565b6001600160a01b03168082526003602052604082205460243591906102fa9060ff16613d52565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b8352600160209081526040808520335f908152925290205460ff1615610469578115610439576040516370a0823160e01b8152306004820152602081602481855afa90811561042e5784916103fc575b5082116103c257600b5461038a9083906001600160a01b0316836144d1565b7f9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85602060018060a01b03600b5416604051908152a380f35b60405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b90506020813d602011610426575b8161041760209383613ea4565b8101031261000e57515f61036b565b3d915061040a565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152600860248201526706d757374203e20360c41b6044820152606490fd5b63e2517d3f60e01b8352336004527f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b602452604483fd5b50346102b65760403660031901126102b6576004356104bd613c9d565b906104c661435d565b338352600a6020526104df60ff60408520541615613d92565b60ff60145460a81c166107d657808352600760205261050060408420613fe6565b818452600760205283600660408220828155826001820155826002820155826003820155826004820155826005820155015560018060a01b036020820151169033855260086020526040852060018060a01b0383165f5260205260405f2033865260086020526040862060018060a01b0384165f52602052610587600360405f2001613f84565b946060830151156107d2576040830151336001600160a01b03909116036107d2576105b38351156142b2565b6001600160a01b038116936105c99085146142e8565b865b86518110156107c357856105df8289614051565b51146105ed576001016105cb565b9091929394958051905f1982019182116107af579161063d610616610642936106809695614051565b51610625600388019384613dcc565b90919082549060031b91821b915f19901b1916179055565b614322565b60a0608085015194015192610658858254614065565b815560018101610669858254614065565b905560024291015561067b8133614377565b6143f5565b61068a8284614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561079b5786916106b691613e15565b8482526010602052604082206106cd858254614065565b90558482526012602052604082206106e6848254614065565b9055848252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c57610773575b505061074391614065565b916040519081527f16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b1860203392a480f35b8161077d91613ea4565b61078857845f610738565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b89526011600452602489fd5b50610680919293949550610642565b8680fd5b60405162461bcd60e51b815260206004820152601860248201527f63616e63656c20636c61696d206e6f7420656e61626c656400000000000000006044820152606490fd5b50346102b65760403660031901126102b657602061084861083a613c87565b610842613c9d565b90614512565b604051908152f35b50346102b65760203660031901126102b65760043561086d61485a565b7fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd399692296040600f5461089f8185141561427c565b8151908152836020820152a1600f5580f35b50346102b65760a03660031901126102b6576108cb613c87565b60243590604435906084356001600160a01b0381169160643591839003610b64576108f461485a565b6108fd81614a62565b506001600160a01b03168086526003602052604086205490929060ff16610b3357612710821080610b2a575b15610aef57828652600360205260408620805460ff19166001179055859061094f61485a565b838252600360205261096760ff604084205416613d52565b85151580610ae6575b15610ae257837fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd60407f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de98606098847fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260808983610acd9b52600d602052868082205491858152600e6020522054875191825260208201528587820152848e820152a2848c52600d60205281838d2055848c52600e60205280838d205582519182526020820152a283875260046020526040872060018060a01b0382166001600160601b0360a01b825416179055808752600560205260408720846001600160601b0360a01b825416179055604051907fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f38880a2610aad81613e88565b838152826020820152426040820152838752600960205260408720614219565b6040519182528460208301526040820152a180f35b5080fd5b50848610610970565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c696420726577617264207261746560681b6044820152606490fd5b50811515610929565b60405162461bcd60e51b815260206004820152600960248201526814dd5c1c1bdc9d195960ba1b6044820152606490fd5b8580fd5b50346102b65760203660031901126102b6576020906040906001600160a01b03610b90613c87565b168152601283522054604051908152f35b50346102b65760203660031901126102b6576001600160a01b03610bc3613c87565b1681526009602052604081208054610bda81613fce565b91610be86040519384613ea4565b81835283526020808420849184015b838310610c425785858051915f198301928311610c2e5760406020610c1c8585614051565b51015181519081526127106020820152f35b634e487b7160e01b81526011600452602490fd5b60036020600192604051610c5581613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190610bf7565b50346102b65760403660031901126102b657600435610c9d613c9d565b90610ca661435d565b338352600a602052610cbf60ff60408520541615613d92565b8083526007602052610cd360408420613fe6565b60208181015133808752600880845260408089206001600160a01b039094165f818152948652818520938a52918552808920828552909452929091209094919290610d2090600301613f84565b946060820192835115610f065760e08301514210610f06576040830151336001600160a01b0390911603610f0657610d6d90610d5d8451156142b2565b6001600160a01b031685146142e8565b848752600760205260408720805460ff19166001179055865b8651811015610ef55785610d9a8289614051565b5114610da857600101610d86565b9091929394958051905f1982019182116107af5760059261063d610dd4610e50979694610de394614051565b51610625600386019384613dcc565b60808301928351878a526002602052610e0160408b20918254613df5565b9055855193519060c060a08201519101519160405195610e2087613e33565b600187528960208801523360408801526060870152608086015260a085015260c08401524260e084015201613ec6565b601454815185916001600160a01b0316803b15610797576040516317d5759960e31b81526001600160a01b0386166004820152336024820152604481019290925282908290606490829084905af1801561078c57610edc575b505051916040519081527fdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd60203392a480f35b81610ee691613ea4565b610ef157835f610ea9565b8380fd5b50610e509293949550600590610de3565b8780fd5b50346102b657610f1936613cb3565b91836060604051610f2981613e6c565b828152826020820152826040820152015260018060a01b03821684526003602052610f5a60ff604086205416613d52565b60018060a01b031683526008602052604083209060018060a01b03165f5260205260405f20604051610f8b81613e50565b815481526001820154602082015260028201546040820152610faf60038301613f84565b606082015260048201918254610fc481613fce565b93610fd26040519586613ea4565b81855286526020808720879186015b83831061109d5750505050600590608083019384520190815461100381613fce565b926110116040519485613ea4565b81845286526020808720969084015b82821061107f57608061104788888860a089015261104181515183106141e5565b51614051565b5160606040519160018060a01b03815116835260018060a01b0360208201511660208401526040810151604084015201516060820152f35b6007602060019261108f8b613fe6565b815201980191019096611020565b6004602060019260409b989b516110b381613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190979497610fe1565b50346102b65760403660031901126102b657611136600435611112613c9d565b9061113161112c825f526001602052600160405f20015490565b614918565b6149de565b5080f35b50346102b65760203660031901126102b6576020906001600160a01b0361115f613c87565b16815260048252604060018060a01b0391205416604051908152f35b50346102b65760403660031901126102b657600435600461119a613c9d565b6001600160a01b03818116808652602084815260408088205490516318160ddd60e01b81529592939192869290918391165afa9283156112b4578593611280575b50845260106020526111f260408520549130614512565b8261123257505050670de0b6b3a7640000915b670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e5760206108488484613e15565b61123b91614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561126c579061126691613e15565b91611205565b634e487b7160e01b84526011600452602484fd5b9092506020813d6020116112ac575b8161129c60209383613ea4565b8101031261000e5751915f6111db565b3d915061128f565b6040513d87823e3d90fd5b50346102b65760203660031901126102b6576020906040906001600160a01b036112e7613c87565b168152601083522054604051908152f35b50346102b65760403660031901126102b657611312613c87565b6001600160a01b03811680835260036020526040832054602435929061133a9060ff16613d52565b61134261435d565b338452600a60205261135b60ff60408620541615613d92565b338452600860205260408420825f5260205260405f209083825401838652600d60205260408620548110610b6457838652600e602052604086205410610788576040516323b872dd60e01b6020820152336024820152306044820152606480820186905281526113e591906113db906113d5608482613ea4565b85614a8d565b61067b8133614377565b8285526010602052604085206113fc858254614065565b9055670de0b6b3a76400008402848104670de0b6b3a7640000148515171561158f57859161142991613e15565b838252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c5761157a575b50506040516004820161148b82613e6c565b8382526020820133815260408301908682526060840192428452805490600160401b82101561156657600182018082558210156115525789526020808a209551600292831b90960180546001600160a01b039788166001600160a01b03199182161782559351600182018054919098169416939093179095559151818301559151600390920191909155825485019092558285525260408320805483019055337f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f78480a480f35b634e487b7160e01b8a52603260045260248afd5b634e487b7160e01b8a52604160045260248afd5b8161158491613ea4565b610ef157835f611479565b634e487b7160e01b86526011600452602486fd5b50346102b65760203660031901126102b6576115d760406115e3926115c66141a9565b506004358152600760205220613fe6565b60405191829182613ced565b0390f35b50346102b657806003193601126102b657602090604051908152f35b50346102b65760203660031901126102b65760043561162061485a565b61271081111580611663575b6116359061427c565b80600c547f2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e108480a3600c5580f35b50600c5481141561162c565b50346102b65760403660031901126102b657611689613c87565b611691613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20604051916116c483613e50565b8154835260018201546020840152600282015460408401526116e860038301613f84565b6060840152600482019182546116fd81613fce565b9361170b6040519586613ea4565b81855283526020808420849186015b83831061179057505050506080840192835260050180549061173b82613fce565b926117496040519485613ea4565b82845290815260208082209084015b838310611772576020868660a08a01525151604051908152f35b6007602060019261178285613fe6565b815201920192019190611758565b600460206001926040516117a381613e6c565b848060a01b038654168152848060a01b03858701541683820152600286015460408201526003860154606082015281520192019201919061171a565b50346102b65760203660031901126102b6576020906040906001600160a01b03611807613c87565b168152600d83522054604051908152f35b50346102b65760403660031901126102b6576040611834613c9d565b9160043581526001602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102b657806003193601126102b65761187b6148a9565b61188361435d565b600160ff198254161781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346102b65760403660031901126102b6576118d5613c87565b6001600160a01b0381168083526003602052604083205460243592906118fd9060ff16613d52565b61190561485a565b612710831015611a7a57818452600960205260408420805461192681613fce565b916119346040519384613ea4565b81835286526020808720879184015b838310611a3c57505050508051905f19820191821161158f5760209161196891614051565b510151918383141580611a33575b156119fb577f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de936119d06119f592604051906119b182613e88565b8082528360208301524260408301528852600960205260408820614219565b60405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a180f35b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964206e6577207261746560801b6044820152606490fd5b50831515611976565b60036020600192604051611a4f81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190611943565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b6044820152606490fd5b50346102b657611abd36613cb3565b9291611ac76141a9565b506001600160a01b038216835260036020526040832054611aea9060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f2060405190611b1c82613e50565b805482526001810154602083015260028101546040830152611b4060038201613f84565b6060830152600481018054611b5481613fce565b91611b626040519384613ea4565b81835285526020808620869184015b838310611bfa57505050506080830152600501805490611b9082613fce565b93611b9e6040519586613ea4565b82855290815260208082209085015b838310611bdc576115e3611bcf888861104160a08a01918083525183106141e5565b5160405191829182613ced565b60076020600192611bec85613fe6565b815201920192019190611bad565b60046020600192604051611c0d81613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190611b71565b50346102b657806003193601126102b6576020600654604051908152f35b50346102b65760203660031901126102b65760209060ff906040906001600160a01b03611c92613c87565b168152600384522054166040519015158152f35b50346102b65760803660031901126102b657611cc0613c87565b611cc8613c9d565b6044356001600160a01b03811691908281036107885760643590338652600a602052611cfb60ff60408820541615613d92565b6001600160a01b038316808752600a6020526040872054909190611d229060ff1615613d92565b848752600a602052611d3b60ff60408920541615613d92565b8482146120ee5782156120a957611d528685614072565b9383851061207a57338314612029576001600160a01b03878116808a52600460208181526040808d20549051636eb1769f60e11b81528686169381019390935233602484015292939192909183916044918391165afa801561201e5786918b91611fe9575b5010611fb8578089526004602052604089205489906001600160a01b0316803b15610ae257604051630f75ba2160e41b81526001600160a01b0385166004820152336024820152604481018890529082908290606490829084905af1801561078c57611f9f575b5052600460208181526040808b205490516323b872dd60e01b81526001600160a01b03858116948201949094528584166024820152604481018890529492859116818c81606481015b03925af1928315611f9457888093611e8892611e8d96611f65575b50614377565b614377565b855260086020526040852060018060a01b0385165f5260205260405f2091825491600184019586549588526008602052604088209060018060a01b03165f5260205260405f2096670de0b6b3a76400008202918204670de0b6b3a764000003610c2e5750611f22611f52959493670de0b6b3a7640000611f1b611f14611f38968396613e15565b8093613e02565b0495613e02565b0492611f2f818854614065565b87558254613df5565b905560018401611f49828254614065565b90558254613df5565b9055600242910155602060405160018152f35b611f869060203d602011611f8d575b611f7e8183613ea4565b810190614191565b505f611e82565b503d611f74565b6040513d8b823e3d90fd5b81611fa991613ea4565b611fb457885f611e1e565b8880fd5b60405162461bcd60e51b8152602060048201526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b9150506020813d602011612016575b8161200560209383613ea4565b8101031261000e578590515f611db7565b3d9150611ff8565b6040513d8c823e3d90fd5b6001600160a01b038781168952600460208181526040808c205490516323b872dd60e01b815233938101939093528584166024840152604483018890529194929091859116818c8160648101611e67565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f66726f6d2063616e206e6f742062652073616d652061732074686520746f00006044820152606490fd5b50346102b65760403660031901126102b65761214d613c87565b612155613c9d565b9061215e61485a565b61216781614a62565b5061217182614a62565b506040516370a0823160e01b81523060048201526001600160a01b03919091169190602081602481865afa801561042e5784906121e6575b6121b5915082846144d1565b6001600160a01b0316907ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f8380a380f35b506020813d602011612212575b8161220060209383613ea4565b8101031261000e576121b590516121a9565b3d91506121f3565b50346102b65760203660031901126102b6576020906001600160a01b0361223f613c87565b16815260058252604060018060a01b0391205416604051908152f35b50346102b657806003193601126102b65760ff60209154166040519015158152f35b50346102b65760203660031901126102b657612297613c87565b61229f61485a565b6001600160a01b0316808252600a602052604082205460ff16156122f857808252600a60205260408220805460ff191690557f1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde88280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08189b1858dadb1a5cdd1959608a1b6044820152606490fd5b50346102b65760203660031901126102b657600435801515809103610ae25761235661485a565b60145460ff8160a81c1615159061236f82841415614110565b60ff60a81b191660a883901b60ff60a81b16176014557f84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce98380a380f35b50346102b657806003193601126102b6576020600f54604051908152f35b50346102b65760603660031901126102b6576123e4613c87565b602435604435916123f361485a565b6001600160a01b0316808452600360205260408420549091906124189060ff16613d52565b80151580612498575b15610ef157818452600d602052817fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260806040872054838852600e60205260408820546040519182526020820152846040820152866060820152a2818452600d60205260408420558252600e602052604082205580f35b50828110612421565b50346102b65760203660031901126102b6576124bb613c87565b6124c361485a565b6001600160a01b0316808252600a602052604082205460ff1661251e57808252600a60205260408220805460ff191660011790557f44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b8789678280a280f35b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e48189b1858dadb1a5cdd1959606a1b6044820152606490fd5b50346102b65760203660031901126102b6576020610848612578613c87565b61414e565b50346102b65760203660031901126102b657612597613c87565b61259f61485a565b6125a881614a62565b50600b546001600160a01b03828116929082169083821461078857604080516001600160a01b0393841681529190921660208201527f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9190a16001600160a01b03191617600b5580f35b50346102b657806003193601126102b65761262b6148a9565b805460ff8116156126695760ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b50346102b65760403660031901126102b657612692613c87565b61269a613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f206040516126cc81613e50565b8154815260018201546020820152600282015460408201526126f060038301613f84565b916060820192835260048101805461270781613fce565b916127156040519384613ea4565b81835286526020808720879184015b8383106127d557505050509060059160808401520190815461274581613fce565b926127536040519485613ea4565b81845285526020808620869185015b8383106127b7575050505060a001525190604051918291602083016020845282518091526020604085019301915b81811061279e575050500390f35b8251845285945060209384019390920191600101612790565b600760206001926127c785613fe6565b815201920192019190612762565b600460206001926040516127e881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612724565b50346102b65760203660031901126102b657600435801515809103610ae25761284b61485a565b60145460ff8160a01c1615159061286482841415614110565b60ff60a01b191660a083901b60ff60a01b16176014557f99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b8380a380f35b50346102b65760403660031901126102b6576128bb613c9d565b336001600160a01b038216036128d757611136906004356149de565b63334bd91960e11b8252600482fd5b50346102b65760403660031901126102b657600490612903613c9d565b6001600160a01b03818116808452602085815260408086205490516318160ddd60e01b81529692939192879290918391165afa938415612a025783946129ce575b508252601060205261295b60408320549130614512565b8361298557505050506020670de0b6b3a764000061297c815b600435613e02565b04604051908152f35b61298e91614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e575061297c6129c9602093670de0b6b3a764000093613e15565b612974565b9093506020813d6020116129fa575b816129ea60209383613ea4565b8101031261000e5751925f612944565b3d91506129dd565b6040513d85823e3d90fd5b50346102b65760403660031901126102b657612a27613c87565b612a2f613c9d565b60018060a01b038216835260086020526040832060018060a01b0382165f5260205260405f2060405190612a6282613e50565b805482526001810154602083015260028101546040830152612a8660038201613f84565b6060830152600481018054612a9a81613fce565b91612aa86040519384613ea4565b81835287526020808820889184015b838310612b35575050505060808301526005018054612ad581613fce565b91612ae36040519384613ea4565b81835286526020808720969083015b828210612b1757602087612b0e88888860a08201525192614512565b01604051908152f35b60076020600192612b278b613fe6565b815201980191019096612af2565b60046020600192604051612b4881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612ab7565b50346102b65760403660031901126102b657611136600435612ba4613c9d565b90612bbe61112c825f526001602052600160405f20015490565b614952565b50346102b65760403660031901126102b657612bdd613c87565b612be5613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f209060405190612c1982613e50565b825482526001830154602083015260028301546040830152612c3d60038401613f84565b606083015260048301928354612c5281613fce565b90612c606040519283613ea4565b80825260208201958452602084209584905b828210612ce4575050506080840152600501805490612c9082613fce565b92612c9e6040519485613ea4565b82845290815260208082209084015b838310612cc6576020858060a089015251604051908152f35b60076020600192612cd685613fe6565b815201920192019190612cad565b60046020600192604051612cf781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096612c72565b50346102b65760403660031901126102b6576020610848612d52613c87565b612d5a613c9d565b90614072565b50346102b65760203660031901126102b6576020906040906001600160a01b03612d88613c87565b168152600e83522054604051908152f35b50346102b65760203660031901126102b65760206108486004355f526001602052600160405f20015490565b50346102b657612dd436613cb3565b919290428311156130125760018060a01b038416825260086020526040822060018060a01b0382165f5260205260405f209160405191612e1383613e50565b835483526001840154602084015260028401549360408401948552612e3a60038201613f84565b6060850152600481018054612e4e81613fce565b91612e5c6040519384613ea4565b81835285526020808620869184015b838310612fc3575050505060808501526005018054612e8981613fce565b91612e976040519384613ea4565b81835284526020808520859184015b838310612fa5575050505060a08401526001600160a01b03811682526009602052604082208054909690612ed981613fce565b97612ee7604051998a613ea4565b8189528452602080852085918a015b838310612f6757505050508651965f19880197881161126c57602097612f1b91614051565b51929451612f4a575b505084612f39644979cb9e0094954290613df5565b925191015102020401604051908152f35b644979cb9e009450612f608792612f3992614512565b9450612f24565b60036020600192604051612f7a81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190612ef6565b60076020600192612fb585613fe6565b815201920192019190612ea6565b60046020600192604051612fd681613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612e6b565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606490fd5b50346102b65760403660031901126102b657613060613c87565b613068613c9d565b9082916130758183614512565b9160018060a01b031684526008602052604084209060018060a01b03165f5260205260405f2092604051936130a985613e50565b8054855260018101546020860152600281015460408601526130cd60038201613f84565b60608601526004810180546130e181613fce565b916130ef6040519384613ea4565b81835284526020808520859184015b8383106131a857505050509060059160808701520193845461311f81613fce565b9561312d6040519788613ea4565b81875283526020808420849188015b83831061318a575050505060a001938452915b8351805184101561317d5760019160a061316c8661317594614051565b51015190614065565b92019161314f565b5060209160405191018152f35b6007602060019261319a85613fe6565b81520192019201919061313c565b600460206001926040516131bb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906130fe565b50346102b65760203660031901126102b6576020906040906001600160a01b0361321f613c87565b168152600283522054604051908152f35b50346102b65760403660031901126102b65761324a613c87565b613252613c9d565b6001600160a01b0381168352600360205260408320549091906132779060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20906040516132a981613e50565b8254815260018301546020820152600283015460408201526132cd60038401613f84565b6060820152600483019283546132e281613fce565b906132f06040519283613ea4565b80825260208201958552602085209585905b82821061337457505050608083015260050180549061332082613fce565b9361332e6040519586613ea4565b82855290815260208082209085015b838310613356576020858760a082015251604051908152f35b6007602060019261336685613fe6565b81520192019201919061333d565b6004602060019260405161338781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096613302565b50346102b65760403660031901126102b6576133dd613c87565b6001600160a01b0381168083526003602052604083205460243592906134059060ff16613d52565b61340d61435d565b338452600a60205261342660ff60408620541615613d92565b60ff60145460a01c166137c657338452600860205260408420825f5260205260405f20906134548133614377565b61345d816143f5565b918054906001810191825487151591826137a9575b5050156107d2576006548752600760205281549587815f19810361376457505050805487818801979355938782555b8615613727578588526010602052604088206134be868254613df5565b90558588526012602052604088206134d7848254613df5565b9055670de0b6b3a76400008702878104670de0b6b3a7640000036107af57889161350091613e15565b86825260046020526024602060018060a01b03604085205416604051928380926370a0823160e01b82523360048301525afa908115612a025783916136f2575b5080821180156136e9575b6136e1575b50868252600460205260408220546001600160a01b0316803b1561079757604051632770a7eb60e21b8152336004820152602481019290925282908290604490829084905af1801561078c576136cc575b5050600c546127100361271081116136b8576135c06127109188613e02565b0490816135d66135d0828a613df5565b9561414e565b1061367e576135e96136459233886144d1565b858852600260205260408820613600868254613df5565b905560056040519161361183613e33565b600183528760208401523360408401528860608401528660808401528460a08401524260c08401524260e084015201613ec6565b604051928352602083015260408201527f25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c28960603392a480f35b60405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b816136d691613ea4565b6107d257865f6135a1565b90505f613550565b5083541561354b565b9250506020823d60201161371f575b8161370e60209383613ea4565b8101031261000e578891515f613540565b3d9150613701565b60405162461bcd60e51b81526020600482015260156024820152746e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b919790959390828110613785575061377d828254613df5565b9055916134a1565b909395506137969189829555613df5565b6137a1818354613df5565b8255936134a1565b018711801591506137bc575b5f80613472565b505f1986146137b5565b60405162461bcd60e51b815260206004820152601a60248201527f666c617368207769746864726177206e6f7420656e61626c65640000000000006044820152606490fd5b50346102b65760203660031901126102b65760043563ffffffff60e01b8116809103610ae257602090637965db0b60e01b8114908115613851575b506040519015158152f35b6301ffc9a760e01b14905082613846565b3461000e57604036600319011261000e5761387b613c87565b6024359060018060a01b03811691825f5260036020526138a160ff60405f205416613d52565b6138a961435d565b335f52600a6020526138c260ff60405f20541615613d92565b6138cc8233614377565b6138d5826143f5565b90335f52600860205260405f20845f5260205260405f2093845493600186019485548415159182613c6a575b505015613c34576006545f52600760205260405f2090835f908754955f1981145f14613bed5750505086545f818601959755945f88555b60048301968755600383019586558415613bb05760038801600654815491600160401b831015613b9c578261062591600161397595018155613dcc565b8554845f52601060205261398e60405f20918254613df5565b90558654845f5260126020526139a960405f20918254613df5565b9055670de0b6b3a76400008502858104670de0b6b3a764000003613b88576024916139d391613e15565b97845f526004602052602060018060a01b0360405f205416604051938480926370a0823160e01b82523360048301525afa918215613b37575f92613b54575b50818911908115613b4a575b50613b42575b505f838152600460205260409020546001600160a01b0316803b1561000e57604051632770a7eb60e21b815233600482015260248101989098525f908890604490829084905af1908115613b3757602097613aa192613b27575b508254610100600160a81b03191660089190911b610100600160a81b0316178255565b600181810180546001600160a01b03191633908117909155600283018590554260058401819055600f54016006938401558254918201909255935494546040805192835260208301969096529481019490945291928392907ff74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba90606090a4604051908152f35b5f613b3191613ea4565b5f613a7e565b6040513d5f823e3d90fd5b965087613a24565b9050541589613a1e565b9091506020813d602011613b80575b81613b7060209383613ea4565b8101031261000e57519089613a12565b3d9150613b63565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b81526020600482015260156024820152744e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b9196979095828110155f14613c105750613c08828254613df5565b905595613938565b90979650613c21915f829955613df5565b613c2c818954613df5565b885594613938565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b01841180159150613c7d575b8780613901565b505f198314613c76565b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b606090600319011261000e576004356001600160a01b038116810361000e57906024356001600160a01b038116810361000e579060443590565b91909160e08061010083019480511515845260018060a01b03602082015116602085015260018060a01b036040820151166040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b15613d5957565b60405162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b6044820152606490fd5b15613d9957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b8054821015613de1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211613b8857565b81810292918115918404141715613b8857565b8115613e1f570490565b634e487b7160e01b5f52601260045260245ffd5b610100810190811067ffffffffffffffff821117613b9c57604052565b60c0810190811067ffffffffffffffff821117613b9c57604052565b6080810190811067ffffffffffffffff821117613b9c57604052565b6060810190811067ffffffffffffffff821117613b9c57604052565b90601f8019910116810190811067ffffffffffffffff821117613b9c57604052565b805490600160401b821015613b9c5760018201808255821015613de1575f90815260209081902083516007909302018054918401516001600160a81b031990921660ff931515939093169290921760089190911b610100600160a81b03161781559060069060e09060408101516001850180546001600160a01b0319166001600160a01b0392909216919091179055606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b90604051918281549182825260208201905f5260205f20925f5b818110613fb5575050613fb392500383613ea4565b565b8454835260019485019487945060209093019201613f9e565b67ffffffffffffffff8111613b9c5760051b60200190565b90604051613ff381613e33565b825460ff81161515825260081c6001600160a01b03908116602083015260018401541660408201526002830154606082015260038301546080820152600483015460a0820152600583015460c08201526006929092015460e0830152565b8051821015613de15760209160051b010190565b91908201809211613b8857565b6001600160a01b039091165f818152600360205260409020546140979060ff16613d52565b5f526004602052602060018060a01b0360405f205416916024604051809481936370a0823160e01b835260018060a01b031660048301525afa908115613b37575f916140e1575090565b90506020813d602011614108575b816140fc60209383613ea4565b8101031261000e575190565b3d91506140ef565b1561411757565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd1a1a5b99c818da185b99d959608a1b6044820152606490fd5b602060249161415c81614a62565b506040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115613b37575f916140e1575090565b9081602091031261000e5751801515810361000e5790565b604051906141b682613e33565b5f60e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b156141ec57565b60405162461bcd60e51b81526020600482015260056024820152640d2dcc8caf60db1b6044820152606490fd5b805490600160401b821015613b9c5760018201808255821015613de1576002916040915f52600360205f209102019260018060a01b0360018060a01b03825116166001600160601b0360a01b855416178455602081015160018501550151910155565b1561428357565b60405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606490fd5b156142b957565b60405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606490fd5b156142ef57565b60405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606490fd5b80548015614349575f1901906143388282613dcc565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b60ff5f541661436857565b63d93c066560e01b5f5260045ffd5b9060018060a01b0382165f52600860205260405f2060018060a01b0382165f5260205260405f20915f82600285019283546143e4575b506143ba60019130614512565b94015542905560018060a01b0316805f5260116020524260405f20555f52601260205260405f2055565b6143ee9250614512565b825f6143ad565b6001600160a01b039081165f818152600460208181526040928390205492516318160ddd60e01b81529490928592918391165afa918215613b37575f9261449d575b508161444b575050670de0b6b3a764000090565b8061446f915f52601060205260405f2054905f52601260205260405f205490614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715613b885761449a91613e15565b90565b9091506020813d6020116144c9575b816144b960209383613ea4565b8101031261000e5751905f614437565b3d91506144ac565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613fb39161450d606483613ea4565b614a8d565b9091906001600160a01b0316308114614827575f52600860205260405f2060018060a01b0383165f5260205260405f209160405161454f81613e50565b83548152600184015490602081019182526002850154946040820195865261457960038201613f84565b606083015260048101805461458d81613fce565b9161459b6040519384613ea4565b81835260208301905f5260205f205f915b8383106147d85750505050608083015260050180546145ca81613fce565b916145d86040519384613ea4565b81835260208301905f5260205f205f915b8383106147ba575050505060a08201525193519051915b60018060a01b03165f52600960205260405f2090815461461f81613fce565b9261462d6040519485613ea4565b81845260208401905f5260205f205f915b83831061477c57505050508151915f198301838111613b88576146619082614051565b5192821561477257604084019183835111155f146146a0575050509061449a93946020614694644979cb9e009442613df5565b92015102020490614065565b5f939293925f5b838110614744575b505b8284106146d557505050509061449a93946020614694644979cb9e00945142613df5565b83969192931561473a576146f79060406146ef8986614051565b510151613df5565b5f198701878111613b88576001916020614717644979cb9e009387614051565b5101518b020204604061472a8986614051565b5101519201965b019291906146b1565b9095600190614731565b60406147538285969795614051565b510151821061476857600101939291936146a7565b939291505f6146af565b505f955050505050565b6003602060019260405161478f81613e88565b848060a01b03865416815284860154838201526002860154604082015281520192019201919061463e565b600760206001926147ca85613fe6565b8152019201920191906145e9565b600460206001926040516147eb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906145ac565b506001600160a01b0382165f90815260106020908152604080832054601183528184205460129093529220549193614600565b335f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff161561489257565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8602052604090205460ff16156148e157565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260016020908152604080832033845290915290205460ff161561493c5750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff166149d8575f8181526001602081815260408084206001600160a01b0396909616808552959091528220805460ff19169091179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff16156149d8575f8181526001602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b15614a6c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b905f602091828151910182855af115613b37575f513d614adc57506001600160a01b0381163b155b614abc5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614ab556fea2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c0033","sourceMap":"472:36530:11:-:0;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;36915:10;472:36530;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;1396:21;472:36530;;2930:6:0;472:36530:11;;;;;;;;735:10:7;-1:-1:-1;472:36530:11;;;;;;;;;;3495:23:0;3491:108;;827:238:15;;472:36530:11;;;;-1:-1:-1;;;21701:39:11;;21734:4;472:36530;21701:39;;472:36530;;;;;21701:39;;;;;;;;;;;;472:36530;21690:50;;;472:36530;;21802:9;472:36530;21813:7;;472:36530;;-1:-1:-1;;;;;472:36530:11;21813:7;;:::i;:::-;21837:44;472:36530;;;;;;21802:9;472:36530;;;;;;;21837:44;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;21701:39;;;472:36530;21701:39;;472:36530;21701:39;;;;;;472:36530;21701:39;;;:::i;:::-;;;472:36530;;;;;21701:39;;;;;;-1:-1:-1;21701:39:11;;;472:36530;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;3491:108:0;-1:-1:-1;;;3541:47:0;;735:10:7;472:36530:11;;1396:21;472:36530;;;3541:47:0;;472:36530:11;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;1315:72:8;;;:::i;:::-;10454:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;472:36530;5360:15;472:36530;;;;;;;;;10522:10;472:36530;;;;;;;:::i;:::-;;;;10522:10;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10606:15;;1755:6;472:36530;10454:10;;472:36530;;10663:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;10454:10;472:36530;;10663:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;-1:-1:-1;472:36530:11;10746:54;472:36530;:::i;:::-;10845:21;;;;1755:6;472:36530;;;;10886:14;;1755:6;10454:10;-1:-1:-1;;;;;472:36530:11;;;10886:28;472:36530;;10925:37;1755:6;;472:36530;10925:37;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;10972:39;;10980:15;;10972:39;:::i;:::-;11026:13;11074:3;472:36530;;11041:31;;;;;11096:23;;;;;:::i;:::-;1755:6;11096:35;11093:239;;472:36530;;11026:13;;11093:239;472:36530;;;;;;;;8905:17;;;472:36530;;;;;;;11188:51;11151:88;11188:51;11257:35;11188:51;11682:24;11188:51;;;:::i;:::-;1755:6;11151:34;472:36530;11151:31;;:34;;;:::i;:::-;:88;472:36530;;;;;;;;;;8905:17;;;472:36530;;;;;;;;11151:88;11257:35;:::i;:::-;11424:22;11372:25;;;1755:6;11424:22;;1755:6;472:36530;11457:36;472:36530;;;11457:36;:::i;:::-;472:36530;;;11503:28;;:38;472:36530;;;11503:38;:::i;:::-;472:36530;;;11585:15;11551:31;;472:36530;11642:6;10454:10;;11642:6;:::i;:::-;11682:24;:::i;:::-;11740:18;;;;:::i;:::-;11762:4;472:36530;;;;;;11762:4;472:36530;;;;;;;11739:42;;;;;:::i;:::-;472:36530;;;11792:23;472:36530;;;;;11792:44;472:36530;;;11792:44;:::i;:::-;472:36530;;;;;11846:25;472:36530;;;;;11846:43;472:36530;;;11846:43;:::i;:::-;472:36530;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;11900:62;;;;;472:36530;;-1:-1:-1;;;11900:62:11;;10454:10;472:36530;11900:62;;472:36530;;;;;;;;;;;;;;;;;;11900:62;;;;;;;;11022:320;12010:18;;;;;:::i;:::-;472:36530;;;;;;11978:61;472:36530;10454:10;11978:61;;472:36530;;11900:62;;;;;:::i;:::-;472:36530;;11900:62;;;;472:36530;;;;11900:62;472:36530;;;;;;;;;11900:62;472:36530;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;11041:31;;11682:24;11041:31;;;;;;;;472:36530;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;32354:35;472:36530;;:::i;:::-;;;:::i;:::-;32354:35;;:::i;:::-;472:36530;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;2484:4:0;;:::i;:::-;26377:48:11;472:36530;26337:12;472:36530;26310:51;26318:31;;;;26310:51;:::i;:::-;472:36530;;;;;;;;;;26377:48;26337:12;472:36530;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;2484:4:0;;:::i;:::-;23400:32:11;;;:::i;:::-;-1:-1:-1;;;;;;472:36530:11;;;;23451:15;472:36530;;;;;;;;;;;;;1755:6;23506:18;;:60;;;472:36530;;;;;;;23451:15;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;472:36530;1755:6;;;472:36530;;2484:4:0;;:::i;:::-;472:36530:11;;;23451:15;472:36530;;5121:53;472:36530;;;;;;5121:53;:::i;:::-;827:238:15;;;25933:64:11;;;472:36530;;;;;23740:49;472:36530;24287:40;472:36530;;;;26014:96;472:36530;;;24228:44;472:36530;;26039:14;472:36530;;;;;;;;;;;26063:14;472:36530;;;;;;;;;;;;;;;;;;;;;;;26014:96;472:36530;;;26039:14;472:36530;;;;;;;;;;26063:14;472:36530;;;;;;;;;;;;;;;;23740:49;472:36530;;;;;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;23902:23;472:36530;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;23969:34;;;;;1755:6;;;:::i;:::-;;;;24085:133;472:36530;24085:133;;1755:6;24192:15;472:36530;24085:133;;1755:6;472:36530;;;24228:15;472:36530;;;;;24228:44;:::i;:::-;472:36530;;;;;;;;;;;;;;24287:40;472:36530;;;;;;25933:64;25974:23;;;;25933:64;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;23506:60;827:238:15;;;;23506:60:11;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1896:60;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;36387:15;472:36530;;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;;;36468:53;;;;:::i;:::-;;36540:33;1755:6;472:36530;;;;;1755:6;472:36530;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;1315:72:8;;;:::i;:::-;12139:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;472:36530;;;12190:10;472:36530;;;;;;;:::i;:::-;;12236:15;;;1755:6;12139:10;472:36530;;;12293:14;472:36530;;;;;;;-1:-1:-1;;;;;472:36530:11;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12236:15;472:36530;;12376:54;;472:36530;:::i;:::-;12475:21;;;;1755:6;;;472:36530;;;;12535:19;;1755:6;12516:15;:38;472:36530;;;12573:14;;1755:6;12139:10;-1:-1:-1;;;;;472:36530:11;;;12573:28;472:36530;;12659:39;1755:6;12612:37;1755:6;;472:36530;12612:37;:::i;:::-;-1:-1:-1;;;;;472:36530:11;12667:15;;12659:39;:::i;:::-;472:36530;;;12190:10;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;472:36530;1755:6;;;472:36530;12830:3;472:36530;;12797:31;;;;;12852:23;;;;;:::i;:::-;1755:6;12852:35;12849:239;;472:36530;;12782:13;;12849:239;472:36530;;;;;;;;8905:17;;;472:36530;;;;;;;13157:23;12944:51;12907:88;12944:51;13157:433;12944:51;;;13013:35;12944:51;;:::i;:::-;1755:6;12907:34;12376:54;12907:31;;:34;;;:::i;13013:35::-;13121:25;;;1755:6;;;472:36530;;;13107:3;472:36530;;13107:39;472:36530;;;;;;13107:39;:::i;:::-;472:36530;;1755:6;;;;13447:22;13500:21;13447:22;;;1755:6;13500:21;;1755:6;472:36530;;;1755:6;;;;:::i;:::-;472:36530;1755:6;;13199:381;472:36530;13199:381;;1755:6;12139:10;472:36530;13199:381;;1755:6;12475:21;13199:381;;1755:6;13121:25;13199:381;;1755:6;13447:22;13199:381;;1755:6;13500:21;13199:381;;1755:6;12516:15;472:36530;13199:381;;1755:6;13157:23;:433;:::i;:::-;13600:13;472:36530;1755:6;;472:36530;;-1:-1:-1;;;;;472:36530:11;13600:64;;;;;472:36530;;-1:-1:-1;;;13600:64:11;;-1:-1:-1;;;;;472:36530:11;;;13600:64;;472:36530;12139:10;472:36530;;;;;;;;;;;;;;;;;;;;;13600:64;;;;;;;;12778:320;1755:6;;;472:36530;;;;;;13680:63;472:36530;12139:10;13680:63;;472:36530;;13600:64;;;;;:::i;:::-;472:36530;;13600:64;;;;472:36530;;;;12797:31;;13157:433;12797:31;;;;;13157:23;12797:31;;;472:36530;;;;;;;;;;;;:::i;:::-;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;5129:15;472:36530;;5121:53;472:36530;;;;;;5121:53;:::i;:::-;472:36530;;;;;;;;34873:14;472:36530;;;;;34873:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;5129:15;472:36530;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;;;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;34986:30;472:36530;;;;;;1755:6;34912:56;34929:22;;472:36530;34920:38;;34912:56;:::i;:::-;34986:22;:30;:::i;:::-;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;5129:15;472:36530;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;4723:26:0;472:36530:11;;;;:::i;:::-;4693:18:0;2484:4;4693:18;;-1:-1:-1;472:36530:11;3877:6:0;472:36530:11;;3877:6:0;472:36530:11;-1:-1:-1;472:36530:11;3877:22:0;472:36530:11;3786:120:0;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;;472:36530:11;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;-1:-1:-1;;;18700:45:11;;472:36530;;;;;;;;;;;;18700:45;;;;;;;;;;;472:36530;;;;18777:23;472:36530;;18841:43;472:36530;;;;18870:4;;18841:43;:::i;:::-;18918:23;;;:98;;;18953:4;18918:98;;19050:4;472:36530;;;;;;19050:4;472:36530;;;;;;;;19035:35;;;;:::i;18918:98::-;18961:26;;;:::i;:::-;18991:4;472:36530;;;;;;18991:4;472:36530;;;;;;;18960:56;;;;:::i;:::-;18918:98;;;472:36530;-1:-1:-1;;;472:36530:11;;;;;;;;18700:45;;;;472:36530;18700:45;;472:36530;18700:45;;;;;;472:36530;18700:45;;;:::i;:::-;;;472:36530;;;;;18700:45;;;;;;;-1:-1:-1;18700:45:11;;;472:36530;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1768:58;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;1315:72:8;;:::i;:::-;7049:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;7049:10;472:36530;;7103:14;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;;;;;;7268:14;472:36530;;;;;;7219:71;;472:36530;;;;;7358:14;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;;;472:36530:11;1745:53:6;;;7049:10:11;472:36530;1745:53:6;;472:36530:11;7444:4;472:36530;;;;;;;;;;;1745:53:6;;7547:24:11;;;1745:53:6;;;472:36530:11;;1745:53:6;:::i;:::-;;;:::i;:::-;7507:6:11;7049:10;;7507:6;:::i;7547:24::-;472:36530;;;7582:23;472:36530;;;;;7582:48;472:36530;;;7582:48;:::i;:::-;472:36530;;7677:4;472:36530;;;;;7677:4;472:36530;;;;;;;7661:35;;;;;:::i;:::-;472:36530;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;7706:60;;;;;472:36530;;-1:-1:-1;;;7706:60:11;;7049:10;472:36530;7706:60;;472:36530;;;;;;;;;;;;;;;;;;7706:60;;;;;;;;472:36530;-1:-1:-1;;472:36530:11;;;7802:23;;1755:6;472:36530;1755:6;:::i;:::-;;;;472:36530;7844:178;;7049:10;1755:6;;472:36530;7844:178;;1755:6;;;;7844:178;;;7888:15;;1755:6;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;1755:6;;472:36530;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;-1:-1:-1;;;;;;472:36530:11;;;;;;1755:6;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;1755:6;;472:36530;;;;1755:6;;5129:15;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;7049:10;8174:40;472:36530;;8174:40;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;7706:60;;;;;:::i;:::-;472:36530;;7706:60;;;;472:36530;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;36694:10;472:36530;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;2484:4:0;;:::i;:::-;1755:6:11;25309:15;;;:41;;;472:36530;25301:61;;;:::i;:::-;472:36530;25396:11;472:36530;25378:39;;;;25396:11;472:36530;;;25309:41;-1:-1:-1;25339:11:11;472:36530;25328:22;;;25309:41;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;35529:14;472:36530;;;;;35529:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;;;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;35576:22;472:36530;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1580:49;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;:::i;:::-;;;;;;;;;;2930:29:0;472:36530:11;;;;;;-1:-1:-1;472:36530:11;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;1315:72:8;;:::i;:::-;2408:4;472:36530:11;1755:6;;;;;;;2427:20:8;472:36530:11;;;735:10:7;472:36530:11;;2427:20:8;472:36530:11;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;2484:4:0;;:::i;:::-;1755:6:11;24509:21;;472:36530;;;;;;24601:15;472:36530;;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;;24662:43;;;;:::i;:::-;;:54;1755:6;24734:35;;;;;:80;;;472:36530;;;;25140:59;472:36530;25080:44;25140:59;472:36530;;;1755:6;;;;:::i;:::-;;;;24934:136;472:36530;24934:136;;1755:6;24977:15;472:36530;24934:136;;1755:6;472:36530;;24601:15;472:36530;;;;;25080:44;:::i;:::-;472:36530;;25140:59;;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;25140:59;;;;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;24734:80;827:238:15;;;;24734:80:11;;472:36530;5129:15;472:36530;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;-1:-1:-1;;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;472:36530;;;;;;;;35239:14;472:36530;;;;;35239:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;5129:15;472:36530;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;35352:30;472:36530;;35278:56;472:36530;;;1755:6;;;;472:36530;35286:38;;35278:56;:::i;35352:30::-;;472:36530;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;5129:15;472:36530;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;877:40;472:36530;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;676:47;472:36530;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;19716:10;;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;36915:10;472:36530;;;;;;;;;5480:48;;472:36530;;5488:24;5480:48;:::i;:::-;472:36530;;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;19801:10;;;472:36530;;19864:10;;472:36530;;34391:7;;;;:::i;:::-;19988:21;;;;472:36530;;19716:10;20034:18;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20075:58:11;;472:36530;;;20075:58;;;472:36530;;;;19716:10;472:36530;;;;;;;;;;;;;;;;;20075:58;;;;;;;;;;;;20031:394;20075:68;;472:36530;;;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;20171:72;;;;;472:36530;;-1:-1:-1;;;20171:72:11;;-1:-1:-1;;;;;472:36530:11;;;20171:72;;472:36530;19716:10;472:36530;;;;;;;;;;;;;;;;;;;;;20171:72;;;;;;;;20031:394;-1:-1:-1;472:36530:11;;;;;;;;;;;;;-1:-1:-1;;;20257:61:11;;-1:-1:-1;;;;;472:36530:11;;;20257:61;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;20257:61;;;;;;;;;;;;;20674:5;20257:61;20713:5;20257:61;;;20031:394;;20674:5;:::i;:::-;20713;:::i;:::-;472:36530;;20765:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;20890:32;472:36530;20890:32;;472:36530;;;;;;20765:14;472:36530;;;;;20967:25;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;21030:4;472:36530;;;;;21030:4;472:36530;;;21021:27;21144;21347:47;21021:27;;;21030:4;21081:22;21021:27;21240:42;21021:27;;;;:::i;:::-;21081:22;;;:::i;:::-;472:36530;21144:27;;:::i;:::-;472:36530;;21190:40;472:36530;;;21190:40;:::i;:::-;472:36530;;;;21240:42;:::i;:::-;472:36530;;;21292:30;;:45;472:36530;;;21292:45;:::i;:::-;472:36530;;;;21347:47;:::i;:::-;472:36530;;21404:33;21440:15;21404:33;;472:36530;;;;;;;;20257:61;;;472:36530;20257:61;472:36530;20257:61;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;472:36530;;;;;;;;;20171:72;;;;;:::i;:::-;472:36530;;20171:72;;;;472:36530;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;20075:58;;;;472:36530;20075:58;;472:36530;20075:58;;;;;;472:36530;20075:58;;;:::i;:::-;;;472:36530;;;;;;;20075:58;;;;;;-1:-1:-1;20075:58:11;;;472:36530;;;;;;;;;20031:394;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;-1:-1:-1;;;20347:67:11;;19716:10;20347:67;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20347:67;472:36530;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;2484:4:0;;;:::i;:::-;22458:32:11;;;:::i;:::-;;22500:35;;;:::i;:::-;-1:-1:-1;472:36530:11;;-1:-1:-1;;;22585:39:11;;22618:4;472:36530;22585:39;;472:36530;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;22585:39;;;;;;;;;;472:36530;22585:39;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;22640:38;;;;472:36530;;22585:39;;472:36530;22585:39;;472:36530;22585:39;;;;;;472:36530;22585:39;;;:::i;:::-;;;472:36530;;;;22585:39;472:36530;;22585:39;;;;;-1:-1:-1;22585:39:11;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;812:58;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;2484:4:0;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;36915:10;472:36530;;;;;;;;;;;;;;36915:10;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;;;6559:26;472:36530;;6559:26;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;5940:15:11;472:36530;;;;;;;;5929:26;5921:54;5929:26;;;;5921:54;:::i;:::-;-1:-1:-1;;;;472:36530:11;;;;;-1:-1:-1;;;472:36530:11;;5940:15;472:36530;6069:39;;;;472:36530;;;;;;;;;;;;;;;;1690:27;472:36530;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;;;2484:4:0;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;827:238:15;;;25933:64:11;;;472:36530;;;;;;;26039:14;472:36530;;;26014:96;472:36530;;;;;;;;26063:14;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;26014:96;472:36530;;;26039:14;472:36530;;;;;;;;26063:14;472:36530;;;;;;;;25933:64;25974:23;;;;25933:64;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;2484:4:0;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;36915:10;472:36530;;;;;;;;;;;;;36915:10;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;6301:4;1755:6;;;6321:24;472:36530;;6321:24;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;2484:4:0;;:::i;:::-;25554:39:11;;;:::i;:::-;-1:-1:-1;25628:9:11;472:36530;-1:-1:-1;;;;;472:36530:11;;;;;;;;25611:26;;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;25654:41;;472:36530;25654:41;-1:-1:-1;;;;;;472:36530:11;;25628:9;472:36530;;;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;472:36530:11;;;;;2140:9:8;2136:62;;472:36530:11;1755:6;;;;2674:22:8;472:36530:11;;;735:10:7;472:36530:11;;2674:22:8;472:36530:11;;2136:62:8;-1:-1:-1;;;2172:15:8;;472:36530:11;2172:15:8;;472:36530:11;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;36054:14;472:36530;;;;;36054:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;;1755:6;;;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;36109:31;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;5657:14:11;472:36530;;;;;;;;5646:25;5638:53;5646:25;;;;5638:53;:::i;:::-;-1:-1:-1;;;;472:36530:11;;;;;-1:-1:-1;;;472:36530:11;;5657:14;472:36530;5783:38;;;;472:36530;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;735:10:7;-1:-1:-1;;;;;472:36530:11;;5397:34:0;5393:102;;5505:37;472:36530:11;;;5505:37:0;:::i;5393:102::-;-1:-1:-1;;;5454:30:0;;472:36530:11;5454:30:0;;472:36530:11;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;-1:-1:-1;;;19221:45:11;;472:36530;;;;;;;;;;;;19221:45;;;;;;;;;;;472:36530;;;;19298:23;472:36530;;19362:43;472:36530;;;;19391:4;;19362:43;:::i;:::-;19439:23;;;:98;;;;472:36530;19588:4;19563:21;19439:98;;472:36530;;19563:21;:::i;:::-;472:36530;;;;;;;19439:98;19482:26;;;:::i;:::-;472:36530;19512:4;472:36530;;;;;;19512:4;472:36530;;;;;;;19481:56;19563:21;19481:56;472:36530;19481:56;19588:4;19481:56;;:::i;:::-;19439:98;;19221:45;;;;472:36530;19221:45;;472:36530;19221:45;;;;;;472:36530;19221:45;;;:::i;:::-;;;472:36530;;;;;19221:45;;;;;;;-1:-1:-1;19221:45:11;;;472:36530;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;32083:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;32173:35;472:36530;;;;;;1755:6;;32173:35;;:::i;:::-;472:36530;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;4306:25:0;472:36530:11;;;;:::i;:::-;4276:18:0;2484:4;4276:18;;-1:-1:-1;472:36530:11;3877:6:0;472:36530:11;;3877:6:0;472:36530:11;-1:-1:-1;472:36530:11;3877:22:0;472:36530:11;3786:120:0;;2484:4;4306:25;:::i;472:36530:11:-;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;35750:14;472:36530;;;;;35750:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;34391:7;472:36530;;:::i;:::-;;;:::i;:::-;34391:7;;:::i;472:36530::-;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1635:49;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;472:36530:11;3877:6:0;472:36530:11;;3877:6:0;472:36530:11;-1:-1:-1;472:36530:11;3877:22:0;472:36530:11;3786:120:0;;472:36530:11;;;;;;;;:::i;:::-;33272:15;;;;33258:29;;472:36530;;;;;;;;;;;;33346:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;;1755:6;;;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;-1:-1:-1;;;;;472:36530:11;;;;33428:15;472:36530;;;;;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;;33509:43;;;;:::i;:::-;;33563:32;1755:6;;33605:155;;472:36530;33272:15;;;33792:29;27393:578;33272:15;;;33792:29;;:::i;:::-;1755:6;;33914:33;;1755:6;27393:578;;;472:36530;;;;;;;33605:155;27393:578;33714:35;;;;;33792:29;33714:35;;:::i;:::-;33605:155;;;;472:36530;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;32541:26;;32602:35;;;;;:::i;:::-;472:36530;;;;;;;;;32678:14;472:36530;;;;;32678:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;;;32717:140;32771:3;32740:22;;472:36530;;32736:33;;;;;472:36530;32808:25;472:36530;32808:25;;32790:56;32808:25;;:::i;:::-;;:38;1755:6;32790:56;;:::i;:::-;32771:3;472:36530;32721:13;;;32736:33;;472:36530;32736:33;472:36530;;226:54:15;;472:36530:11;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;36806:3;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;472:36530;;;;;;;;34205:14;472:36530;;;;;34205:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;5129:15;472:36530;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;5129:15;472:36530;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;1315:72:8;;:::i;:::-;13910:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;472:36530;5244:14;472:36530;;;;;;13910:10;472:36530;;13980:14;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;13910:10;14055:6;13910:10;;14055:6;:::i;:::-;14095:24;;;:::i;:::-;472:36530;;;14234:28;472:36530;14234:28;;472:36530;;;827:238:15;;;14294:158:11;;;;472:36530;;;;;;14670:16;472:36530;;;14659:10;472:36530;;;;;;16238:29;-1:-1:-1;;16422:28:11;;8905:17;;472:36530;;;;;;;;;16559:45;472:36530;;;;;;16419:782;14713:15;;472:36530;;;;;14765:23;472:36530;;;;;14765:50;472:36530;;;14765:50;:::i;:::-;472:36530;;;;;14825:25;472:36530;;;;;14825:49;472:36530;;;14825:49;:::i;:::-;472:36530;;14923:4;472:36530;;;;;14923:4;472:36530;;;14908:35;;;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;14973:53;;13910:10;472:36530;14973:53;;472:36530;14973:53;;;;;;;;;;;16419:782;15040:24;;;;:56;;;;16419:782;15037:85;;16419:782;-1:-1:-1;472:36530:11;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;15133:62;;;;;472:36530;;-1:-1:-1;;;15133:62:11;;13910:10;472:36530;15133:62;;472:36530;;;;;;;;;;;;;;;;;;15133:62;;;;;;;;16419:782;472:36530;;15251:11;472:36530;1755:6;472:36530;1755:6;472:36530;;;;15229:34;1755:6;15229:34;;;:::i;:::-;472:36530;15294:26;;15339;15294;;;;:::i;:::-;15339;;:::i;:::-;:42;1755:6;;15455:12;15520:398;13910:10;;15455:12;;:::i;:::-;472:36530;;;15479:3;472:36530;;;;;15479:30;472:36530;;;15479:30;:::i;:::-;472:36530;;15520:23;472:36530;;1755:6;;;;:::i;:::-;472:36530;1755:6;;15562:346;472:36530;15562:346;;1755:6;13910:10;472:36530;15562:346;;1755:6;15562:346;;;;1755:6;15562:346;;;;1755:6;15562:346;472:36530;15562:346;;1755:6;15834:15;15562:346;;;1755:6;15834:15;472:36530;15562:346;;1755:6;15520:23;:398;:::i;:::-;472:36530;;;;;;1755:6;;472:36530;;1755:6;;472:36530;15934:82;15562:346;13910:10;15934:82;;472:36530;;1755:6;472:36530;;-1:-1:-1;;;1755:6:11;;472:36530;;1755:6;;;14825:25;472:36530;1755:6;;472:36530;-1:-1:-1;;;472:36530:11;;;1755:6;;;;472:36530;-1:-1:-1;;;472:36530:11;;;;;;;;15133:62;;;;;:::i;:::-;472:36530;;15133:62;;;;15037:85;15098:24;;15037:85;;;15040:56;472:36530;;;15068:28;15040:56;;14973:53;;;;472:36530;14973:53;;472:36530;14973:53;;;;;;472:36530;14973:53;;;:::i;:::-;;;472:36530;;;;;;;14973:53;;;;;;-1:-1:-1;14973:53:11;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;16419:782;16767:41;;;;;;;;;;;472:36530;16824:39;472:36530;;;16824:39;:::i;:::-;472:36530;;16764:437;16419:782;;16764:437;16930:45;;;;17057:40;16930:45;;;472:36530;;17057:40;:::i;:::-;17111:37;472:36530;;;17111:37;:::i;:::-;472:36530;;16764:437;16419:782;;14294:158;226:54:15;14346:73:11;;;;;-1:-1:-1;14346:105:11;;14294:158;;;;;14346:105;-1:-1:-1;;;14423:28:11;;14346:105;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2649:47:0;;;:87;;;;472:36530:11;;;;;;;;;;2649:87:0;-1:-1:-1;;;829:40:9;;-1:-1:-1;2649:87:0;;;472:36530:11;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;;;;;;;;;;;;;5129:15;472:36530;;5121:53;472:36530;;;;;;5121:53;:::i;:::-;1315:72:8;;:::i;:::-;8369:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;8450:6;8369:10;;8450:6;:::i;:::-;8490:24;;;:::i;:::-;8369:10;;472:36530;;8557:14;472:36530;;;;;;;;;;;;;;;;8705:28;472:36530;8705:28;;472:36530;;;827:238:15;;;8765:158:11;;;;472:36530;;;;;;9016:16;472:36530;;;9005:10;472:36530;;;;;9195:54;16238:29;472:36530;16310:20;472:36530;;8905:17;;;16422:28;;16419:782;8905:17;;;472:36530;;;;;;;;;16559:45;472:36530;;;;;;16419:782;472:36530;17237:22;;472:36530;;;5129:15;17288:25;;472:36530;;;9268:15;;472:36530;;5129:15;9345:31;;9016:16;472:36530;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;:::i;:::-;;;;;;9410:23;472:36530;;9410:60;472:36530;;;;;;9410:60;:::i;:::-;472:36530;;;;;;;9480:25;472:36530;;9480:59;472:36530;;;;;;9480:59;:::i;:::-;472:36530;;9587:4;472:36530;;;;;9587:4;472:36530;;;;9573:33;;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;9636:53;;8369:10;472:36530;9636:53;;472:36530;9636:53;;;;;;;472:36530;9636:53;;;16419:782;9703:24;;;;:56;;;;;16419:782;9700:85;;;16419:782;-1:-1:-1;472:36530:11;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;9796:62;;;;;472:36530;;-1:-1:-1;;;9796:62:11;;8369:10;472:36530;9796:62;;472:36530;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;-1:-1:-1;;9796:62:11;;;;;;;472:36530;9796:62;9893:24;9796:62;;;16419:782;-1:-1:-1;472:36530:11;;-1:-1:-1;;;;;;472:36530:11;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;9893:24;472:36530;9927:14;;;472:36530;;-1:-1:-1;;;;;;472:36530:11;8369:10;472:36530;;;;;;9964:21;;;472:36530;;;10033:15;10009:21;;;472:36530;;;10107:12;472:36530;;9016:16;10058:19;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10241:107;;472:36530;;10241:107;472:36530;;;;;;9796:62;472:36530;9796:62;;;:::i;:::-;472:36530;9796:62;;;472:36530;;;;;;;;;9700:85;9761:24;-1:-1:-1;9700:85:11;;;9703:56;472:36530;;;9731:28;9703:56;;;9636:53;;;;472:36530;9636:53;;472:36530;9636:53;;;;;;472:36530;9636:53;;;:::i;:::-;;;472:36530;;;;;9636:53;;;;;;;-1:-1:-1;9636:53:11;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;16419:782;16767:41;;;;;;;;;16764:437;16767:41;;;472:36530;16824:39;472:36530;;;16824:39;:::i;:::-;472:36530;;16764:437;16419:782;;16764:437;16930:45;;;;17057:40;16930:45;472:36530;16930:45;472:36530;;17057:40;:::i;:::-;17111:37;472:36530;;;17111:37;:::i;:::-;472:36530;;16764:437;16419:782;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;8765:158;226:54:15;8817:73:11;;;;;-1:-1:-1;8817:105:11;;8765:158;;;;;8817:105;-1:-1:-1;;;8894:28:11;;8817:105;;472:36530;;;;-1:-1:-1;;;;;472:36530:11;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;472:36530:11;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;;-1:-1:-1;472:36530:11;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;1755:6;472:36530;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;1745:53:6;;472:36530:11;;;;;;;;;;;;;;;;:::o;1755:6::-;;;;-1:-1:-1;;;1755:6:11;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;1755:6;;;;;;;;;;;;;-1:-1:-1;;;;;;472:36530:11;;;1755:6;472:36530;;;1755:6;;;;472:36530;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;1755:6;;;;;;;;;472:36530;1755:6;;472:36530;;-1:-1:-1;;;;;;472:36530:11;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;1755:6;;;;;;;472:36530;1755:6;;;;;;;472:36530;;1755:6;;;;;;472:36530;1755:6;;;;;;;472:36530;1755:6;;;;472:36530;1755:6::o;472:36530::-;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;1755:6;;472:36530;;-1:-1:-1;;;;;472:36530:11;;;;;;1755:6;472:36530;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;1755:6;472:36530::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5067:125::-;-1:-1:-1;;;;;472:36530:11;;;;;;;5129:15;472:36530;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;472:36530;;34417:23;472:36530;;;;;;;;;;;;;;34417:48;472:36530;;;;;;;;;34417:48;;472:36530;;;;;;34417:23;:48;;472:36530;34417:48;;;;;;;472:36530;34417:48;;;5184:1;5067:125;:::o;34417:48::-;;;472:36530;34417:48;;472:36530;34417:48;;;;;;472:36530;34417:48;;;:::i;:::-;;;472:36530;;;;;5067:125;:::o;34417:48::-;;;-1:-1:-1;34417:48:11;;472:36530;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;34478:179;472:36530;34611:39;34478:179;34562:32;;;:::i;:::-;-1:-1:-1;472:36530:11;;-1:-1:-1;;;34611:39:11;;34644:4;34611:39;;;472:36530;;;;;;-1:-1:-1;;;;;472:36530:11;34611:39;;;;;;;-1:-1:-1;34611:39:11;;;34604:46;34478:179;:::o;472:36530::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;1755:6;;;;:::i;:::-;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;1755:6;;472:36530;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;1755:6;472:36530;;;;;1755:6;472:36530;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;8905:17;;;472:36530;;;;;;;;;:::o;:::-;;;;;;;;;;;;1878:128:8;472:36530:11;1796:7:8;472:36530:11;;1939:61:8;;1878:128::o;1939:61::-;1974:15;;;1796:7;1974:15;;1796:7;1974:15;17414:731:11;;472:36530;;;;;;;-1:-1:-1;472:36530:11;17524:14;472:36530;;;-1:-1:-1;472:36530:11;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;17563:32;-1:-1:-1;17652:31:11;;;;472:36530;;;17649:155;;17414:731;17872:4;17843:43;17897:28;17872:4;;17843:43;:::i;:::-;17897:28;;472:36530;17992:15;472:36530;;;;;;;;;-1:-1:-1;472:36530:11;18018:22;472:36530;;17992:15;472:36530;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;18076:25;472:36530;;;-1:-1:-1;472:36530:11;;17414:731::o;17649:155::-;17758:35;;;;:::i;:::-;17649:155;;;;18151:405;-1:-1:-1;;;;;472:36530:11;;;;;;;18277:23;472:36530;;;;;;;;;;;;-1:-1:-1;;;18277:45:11;;472:36530;;;;;18277:23;472:36530;;;18277:45;;;;;;;472:36530;18277:45;;;18151:405;-1:-1:-1;18336:23:11;;;18375:19;;18390:4;18332:218;18151:405::o;18332:218::-;472:36530;18442:67;472:36530;;;18442:23;472:36530;;;;;;;;;18476:25;472:36530;;;;;;18442:67;;:::i;:::-;472:36530;18513:4;472:36530;;;;;;18513:4;472:36530;;;;;;;18440:99;;;:::i;:::-;18332:218;18151:405::o;18277:45::-;;;;472:36530;18277:45;;472:36530;18277:45;;;;;;472:36530;18277:45;;;:::i;:::-;;;472:36530;;;;;18277:45;;;;;;;-1:-1:-1;18277:45:11;;1219:160:6;472:36530:11;;-1:-1:-1;;;1328:43:6;;;;-1:-1:-1;;;;;472:36530:11;;;;1328:43:6;;;472:36530:11;;;;;;;;;1328:43:6;;;;;;472:36530:11;;1328:43:6;:::i;:::-;;:::i;27983:3935:11:-;;;;-1:-1:-1;;;;;472:36530:11;28215:4;28198:22;;28215:4;;-1:-1:-1;472:36530:11;28266:14;472:36530;;;-1:-1:-1;472:36530:11;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;;1755:6;;;472:36530;;;;;;;;1755:6;;;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;-1:-1:-1;472:36530:11;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;1755:6;;;;;;28195:514;;472:36530;;;;;;-1:-1:-1;472:36530:11;28762:15;472:36530;;;-1:-1:-1;472:36530:11;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;-1:-1:-1;472:36530:11;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;28902:37;;;;:::i;:::-;;28953:21;;;28950:34;;472:36530;29508:34;;1755:6;;;;29508:54;;29505:2407;29508:54;;;29828:15;;;;30061:28;29828:15;;472:36530;29828:34;27393:578;29828:15;;:34;:::i;:::-;29963:33;;1755:6;27393:578;;;30061:28;;:::i;29505:2407::-;-1:-1:-1;30546:22:11;;;30587:13;-1:-1:-1;30602:20:11;;;;;;30582:216;30866:51;30960:20;;;;;;1755:6;;;;;31873:28;1755:6;;472:36530;31622:52;27393:578;1755:6;;31622:15;:52;:::i;30982:3::-;31008:6;;;;;;31005:19;;31069:57;:18;472:36530;31069:18;;;;:::i;:::-;;:30;1755:6;31069:57;:::i;:::-;-1:-1:-1;;472:36530:11;;;;;;;;31243:22;472:36530;31243:22;27393:578;31243:22;;;:::i;:::-;;:33;1755:6;27393:578;;;;472:36530;31376:18;;;;:::i;:::-;;:30;1755:6;472:36530;;30982:3;30936:22;472:36530;30936:22;;;;;31005:19;31016:8;;472:36530;31016:8;;;30624:3;472:36530;30670:18;;;;;;;:::i;:::-;;:30;1755:6;30651:49;;30647:137;;472:36530;;30587:13;;;;;;30647:137;30724:14;30760:5;;-1:-1:-1;30760:5:11;;;28950:34;-1:-1:-1;;;;;;;;28976:8:11:o;472:36530::-;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;28195:514;-1:-1:-1;;;;;;472:36530:11;;-1:-1:-1;472:36530:11;;;28535:23;472:36530;;;;;;;;;28599:22;472:36530;;;;;;28665:25;472:36530;;;;;;;;28195:514;;3175:103:0;735:10:7;472:36530:11;;;;;;;;;;;;;3495:23:0;3491:108;;3175:103::o;3491:108::-;3541:47;;;472:36530:11;3541:47:0;735:10:7;3541:47:0;472:36530:11;;;;;;3541:47:0;3175:103;735:10:7;-1:-1:-1;472:36530:11;;;;;;;;;;;;3495:23:0;3491:108;;3175:103::o;3491:108::-;3541:47;;;-1:-1:-1;3541:47:0;735:10:7;3541:47:0;472:36530:11;1330:24;472:36530;;;-1:-1:-1;3541:47:0;3175:103;-1:-1:-1;472:36530:11;;;2930:6:0;472:36530:11;;;;;;;;735:10:7;472:36530:11;;;;;;;;;;3495:23:0;3491:108;;3175:103;:::o;3491:108::-;3541:47;;;-1:-1:-1;3541:47:0;735:10:7;3541:47:0;472:36530:11;;;;-1:-1:-1;3541:47:0;6155:316;472:36530:11;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;1755:6;;-1:-1:-1;;1755:6:11;;;;;;735:10:7;;472:36530:11;;6346:40:0;;472:36530:11;6346:40:0;2930:6;6400:11;:::o;6248:217::-;6442:12;;472:36530:11;6442:12:0;:::o;6708:317::-;472:36530:11;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;1755:6;;-1:-1:-1;;1755:6:11;;;735:10:7;;472:36530:11;;6900:40:0;;472:36530:11;6900:40:0;2930:6;6954:11;:::o;292:438:15:-;377:326;;;719:4;292:438;:::o;377:326::-;;;;;;;;;;;;;;;8370:720:6;;-1:-1:-1;8507:421:6;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:6;;8942:15;;-1:-1:-1;;;;;;472:36530:11;;8960:26:6;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;-1:-1:-1;;;;9033:40:6;;;-1:-1:-1;;;;;472:36530:11;;;;9033:40:6;472:36530:11;;;9033:40:6;8942:68;9009:1;8994:16;;8942:68;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c0033","offset":19174}},"immutableReferences":{},"transformations":[],"transformationValues":{}},"deployment":{"transactionHash":"0xaec7093d0034b8fdc95b3f983f995f16b27da3c7ff7daa8e6c57a09abf6412bd","blockNumber":"73902846","transactionIndex":"38","deployer":"0xFB4AAB6C21a0740669a83dF0198d7a464D3583E5"},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n    struct RoleData {\n        mapping(address account => bool) hasRole;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 role => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n        return _roles[role].hasRole[account];\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n     * is missing `role`.\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert AccessControlUnauthorizedAccount(account, role);\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n        if (callerConfirmation != _msgSender()) {\n            revert AccessControlBadConfirmation();\n        }\n\n        _revokeRole(role, callerConfirmation);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (!hasRole(role, account)) {\n            _roles[role].hasRole[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (hasRole(role, account)) {\n            _roles[role].hasRole[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n"},"@openzeppelin/contracts/access/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n    /**\n     * @dev The `account` is missing a role.\n     */\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n    /**\n     * @dev The caller of a function is not the expected one.\n     *\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n     */\n    error AccessControlBadConfirmation();\n\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted to signal this.\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"@openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n    bool private _paused;\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"contracts/Vault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\n\nimport \"./interfaces/ILPToken.sol\";\nimport \"./interfaces/IWithdrawVault.sol\";\nimport \"./interfaces/IVault.sol\";\nimport \"./utils/Utils.sol\";\n\ncontract Vault is IVault, Pausable, AccessControl {\n    using SafeERC20 for IERC20;\n    using SafeERC20 for ILPToken;\n\n    // TVL\n    mapping(address => uint256) private tvl;\n\n    // Supported tokens\n    mapping(address => bool) public supportedTokens;\n\n    // LP tokens\n    mapping(address => ILPToken) public supportedTokenToLPToken;\n    mapping(address => address) public lpTokenToSupportedToken;\n\n    uint256 public lastClaimQueueID = 10_000;\n    mapping(uint256 => ClaimItem) private claimQueue;\n\n    // Asset info\n    mapping(address => mapping(address => AssetsInfo)) private userAssetsInfo;\n\n    // Reward rate\n    struct RewardRateState {\n        address token;\n        uint256 rewardRate;\n        uint256 updatedTime;\n    }\n    mapping(address => RewardRateState[]) private rewardRateState;\n\n    // Roles\n    bytes32 private constant PAUSER_ROLE = keccak256(\"PAUSER_ROLE\");\n    bytes32 private constant BOT_ROLE = keccak256(\"BOT_ROLE\");\n\n    // Blacklist\n    mapping(address => bool) private _blacklist;\n\n    // Misc\n    address private custodian;\n    uint256 private penaltyRate = 50; // 0.5%\n    mapping(address => uint256) public minStakeAmount;\n    mapping(address => uint256) public maxStakeAmount;\n    uint256 public WAITING_TIME;\n    uint256 private constant BASE = 10_000;\n\n    mapping(address => uint256) public totalStakeAmountByToken;\n    mapping(address => uint256) private _lastRewardUpdatedTime;\n    mapping(address => uint256) public totalRewardsAmountByToken;\n\n    uint256 private initialTime;\n    IWithdrawVault private withdrawVault;\n\n    bool flashNotEnable = true;\n    bool cancelNotEnable = true;\n\n    constructor(\n        address[] memory _tokens,\n        address[] memory _lpTokens,\n        uint256[] memory _newRewardRate,\n        uint256[] memory _minStakeAmount,\n        uint256[] memory _maxStakeAmount,\n        address _admin,\n        address _bot,\n        address _custodian,\n        uint256 _waitingTime,\n        address payable withdrawVaultAddress\n    ) {\n        Utils.CheckIsZeroAddress(_custodian);\n        Utils.CheckIsZeroAddress(_admin);\n        Utils.CheckIsZeroAddress(_bot);\n\n        uint256 len = _tokens.length;\n        require(Utils.MustGreaterThanZero(len));\n        require(\n            len == _newRewardRate.length &&\n            len == _minStakeAmount.length &&\n            len == _maxStakeAmount.length && \n            len == _lpTokens.length\n        );\n\n        // Grant roles\n        _grantRole(DEFAULT_ADMIN_ROLE, _admin);\n        _grantRole(PAUSER_ROLE, _admin);\n        _grantRole(BOT_ROLE, _bot);\n\n        custodian = _custodian;\n        emit UpdateCustodian(address(0), _custodian);\n\n        WAITING_TIME = _waitingTime;\n        emit UpdateWaitingTime(0, _waitingTime);\n\n        initialTime = block.timestamp;\n\n        // Set the supported tokens and reward rate\n        for (uint256 i = 0; i < len; i++) {\n            require(_minStakeAmount[i] < _maxStakeAmount[i]);\n\n            // supported tokens\n            address token = _tokens[i];\n            minStakeAmount[token] = _minStakeAmount[i];\n            maxStakeAmount[token] = _maxStakeAmount[i];\n            supportedTokens[token] = true;\n            emit AddSupportedToken(token, _minStakeAmount[i], _maxStakeAmount[i]);\n\n            ILPToken tokenTemp = ILPToken(_lpTokens[i]);\n            supportedTokenToLPToken[token] = tokenTemp;\n            lpTokenToSupportedToken[address(tokenTemp)] = token;\n            emit LPTokenCreated(address(tokenTemp));\n\n            // reward rate\n            RewardRateState memory rewardRateItem = RewardRateState({\n                token: token,\n                rewardRate: _newRewardRate[i],\n                updatedTime: block.timestamp\n            });\n            rewardRateState[token].push(rewardRateItem);\n            emit UpdateRewardRate(token, 0, _newRewardRate[i]);\n\n            _lastRewardUpdatedTime[token] = block.timestamp;\n        }\n\n        withdrawVault = IWithdrawVault(withdrawVaultAddress);\n\n        _pause();\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                           Controller                                              ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    event FlashStatusChanged(bool indexed oldStatus, bool indexed newStatus);\n    event CancelStatusChanged(bool indexed oldStatus, bool indexed newStatus);\n    event BlacklistAdded(address indexed _address);\n    event BlacklistRemoved(address indexed _address);\n\n    modifier onlySupportedToken(address _token) {\n        require(supportedTokens[_token], \"Unsupported token\");\n        _;\n    }\n\n    modifier onlyFlashEnable() {\n        require(!flashNotEnable, \"flash withdraw not enabled\");\n        _;\n    }\n\n    modifier onlyCancelEnable() {\n        require(!cancelNotEnable, \"cancel claim not enabled\");\n        _;\n    }\n\n    modifier notBlacklisted(address _address) {\n        require(!isBlacklisted(_address), \"blacklisted\");\n        _;\n    }\n\n    function setFlashEnable(bool _enable) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_enable != flashNotEnable, \"nothing changed\");\n\n        bool oldStatus = flashNotEnable;\n        flashNotEnable = _enable;\n\n        emit FlashStatusChanged(oldStatus, _enable);\n    }\n\n    function setCancelEnable(bool _enable) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_enable != cancelNotEnable, \"nothing changed\");\n\n        bool oldStatus = cancelNotEnable;\n        cancelNotEnable = _enable;\n\n        emit CancelStatusChanged(oldStatus, _enable);\n    }\n\n    function addToBlacklist(address _address) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(!isBlacklisted(_address), \"already blacklisted\");\n\n        _blacklist[_address] = true;\n\n        emit BlacklistAdded(_address);\n    }\n\n    function removeFromBlacklist(address _address) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(isBlacklisted(_address), \"not blacklisted\");\n\n        _blacklist[_address] = false;\n\n        emit BlacklistRemoved(_address);\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                             write                                                 ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function stake(address _token,  uint256 _stakedAmount) external onlySupportedToken(_token) whenNotPaused notBlacklisted(msg.sender) {\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][_token];\n        uint256 currentStakedAmount = assetsInfo.stakedAmount;\n\n        require(Utils.Add(currentStakedAmount, _stakedAmount) >= minStakeAmount[_token]);\n        require(Utils.Add(currentStakedAmount, _stakedAmount) <= maxStakeAmount[_token]);\n\n        IERC20(_token).safeTransferFrom(msg.sender, address(this), _stakedAmount);\n\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n\n        totalStakeAmountByToken[_token] += _stakedAmount;\n        uint256 mintAmount = _stakedAmount * 1e18 / exchangeRate;\n        supportedTokenToLPToken[_token].mint(msg.sender, mintAmount);\n\n        // update status\n        assetsInfo.stakeHistory.push(\n            StakeItem({\n                stakeTimestamp: block.timestamp,\n                amount: _stakedAmount,\n                token: _token,\n                user: msg.sender\n            })\n        );\n        unchecked {\n            assetsInfo.stakedAmount += _stakedAmount;\n            tvl[_token] += _stakedAmount;\n        }\n\n        emit Stake(msg.sender, _token, _stakedAmount);\n    }\n\n    function requestClaim(\n        address _token,\n        uint256 _amount\n    ) external onlySupportedToken(_token) whenNotPaused notBlacklisted(msg.sender) returns (uint256 _returnID) {\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][_token];\n        uint256 currentStakedAmount = assetsInfo.stakedAmount;\n        uint256 currentAccumulatedRewardAmount = assetsInfo.accumulatedReward;\n\n        require(\n            Utils.MustGreaterThanZero(_amount) && \n            (_amount <= Utils.Add(currentStakedAmount, currentAccumulatedRewardAmount) || _amount == type(uint256).max), \n            \"Invalid amount\"\n        );\n\n        ClaimItem storage queueItem = claimQueue[lastClaimQueueID];\n\n        // Withdraw from reward first; if insufficient, continue withdrawing from principal\n        uint256 totalAmount = _amount;\n        (totalAmount, , ) = _handleWithdraw(_amount, assetsInfo, queueItem, false);\n\n        require(totalAmount > 0, \"No assets to withdraw\");\n\n        // update status\n        assetsInfo.pendingClaimQueueIDs.push(lastClaimQueueID);\n\n        totalStakeAmountByToken[_token] -= queueItem.principalAmount;\n        totalRewardsAmountByToken[_token] -= queueItem.rewardAmount;\n\n        uint256 sharesToBurn = totalAmount * 1e18 / exchangeRate;\n        uint256 lpBalance = supportedTokenToLPToken[_token].balanceOf(msg.sender);\n\n        if(sharesToBurn > lpBalance || assetsInfo.stakedAmount == 0) sharesToBurn = lpBalance;\n\n        supportedTokenToLPToken[_token].burn(msg.sender, sharesToBurn);\n\n        // update queue\n        queueItem.token = _token;\n        queueItem.user = msg.sender;\n        queueItem.totalAmount = totalAmount;\n        queueItem.requestTime = block.timestamp;\n        queueItem.claimTime = Utils.Add(block.timestamp, WAITING_TIME);\n\n        unchecked {\n            _returnID = lastClaimQueueID;\n            ++lastClaimQueueID;\n        }\n\n        emit RequestClaim(msg.sender, _token, totalAmount, queueItem.principalAmount, queueItem.rewardAmount, _returnID);\n    }\n\n    function cancelClaim(uint256 _queueId, address _token) external whenNotPaused notBlacklisted(msg.sender) onlyCancelEnable {\n        ClaimItem memory claimItem = claimQueue[_queueId];\n        delete claimQueue[_queueId];\n\n        address token = claimItem.token;\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][token];\n        uint256[] memory pendingClaimQueueIDs = userAssetsInfo[msg.sender][token].pendingClaimQueueIDs;\n\n        require(Utils.MustGreaterThanZero(claimItem.totalAmount));\n        require(claimItem.user == msg.sender);\n        require(!claimItem.isDone, \"claimed\");\n        require(token == _token, \"wrong token\");\n\n        for(uint256 i = 0; i < pendingClaimQueueIDs.length; i++) {\n            if(pendingClaimQueueIDs[i] == _queueId) {\n                assetsInfo.pendingClaimQueueIDs[i] = pendingClaimQueueIDs[pendingClaimQueueIDs.length-1];\n                assetsInfo.pendingClaimQueueIDs.pop();\n                break;\n            }\n        }\n\n        uint256 principal = claimItem.principalAmount;\n        uint256 reward = claimItem.rewardAmount;\n\n        assetsInfo.stakedAmount += principal;\n        assetsInfo.accumulatedReward += reward;\n        assetsInfo.lastRewardUpdateTime = block.timestamp;\n\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n        uint256 amountToMint = (principal + reward) * 1e18 / exchangeRate;\n\n        totalStakeAmountByToken[_token] += principal;\n        totalRewardsAmountByToken[_token] += reward;\n\n        supportedTokenToLPToken[_token].mint(msg.sender, amountToMint);\n\n        emit CancelClaim(msg.sender, _token, principal + reward, _queueId);\n    }\n\n    function claim(uint256 _queueID, address _token) external whenNotPaused notBlacklisted(msg.sender) {\n        ClaimItem memory claimItem = claimQueue[_queueID];\n        address token = claimItem.token;\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][token];\n        uint256[] memory pendingClaimQueueIDs = userAssetsInfo[msg.sender][token].pendingClaimQueueIDs;\n\n        require(Utils.MustGreaterThanZero(claimItem.totalAmount));\n        require(block.timestamp >= claimItem.claimTime);\n        require(claimItem.user == msg.sender);\n        require(!claimItem.isDone, \"claimed\");\n        require(token == _token, \"wrong token\");\n\n        // update status\n        claimQueue[_queueID].isDone = true;\n        for(uint256 i = 0; i < pendingClaimQueueIDs.length; i++) {\n            if(pendingClaimQueueIDs[i] == _queueID) {\n                assetsInfo.pendingClaimQueueIDs[i] = pendingClaimQueueIDs[pendingClaimQueueIDs.length-1];\n                assetsInfo.pendingClaimQueueIDs.pop();\n                break;\n            }\n        }\n        tvl[token] -= claimItem.principalAmount;\n\n        assetsInfo.claimHistory.push(\n            ClaimItem({\n                isDone: true,\n                token: token,\n                user: msg.sender,\n                totalAmount: claimItem.totalAmount,\n                principalAmount: claimItem.principalAmount,\n                rewardAmount: claimItem.rewardAmount,\n                requestTime: claimItem.requestTime,\n                claimTime: block.timestamp\n            })\n        );\n        withdrawVault.transfer(token, msg.sender, claimItem.totalAmount);\n\n        emit ClaimAssets(msg.sender, token, claimItem.totalAmount, _queueID);\n    }\n\n    function flashWithdrawWithPenalty(\n        address _token,\n        uint256 _amount\n    ) external onlySupportedToken(_token) whenNotPaused notBlacklisted(msg.sender) onlyFlashEnable {\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][_token];\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n\n        uint256 currentStakedAmount = assetsInfo.stakedAmount;\n        uint256 currentAccumulatedRewardAmount = assetsInfo.accumulatedReward;\n\n        require(\n            Utils.MustGreaterThanZero(_amount) && \n            (_amount <= Utils.Add(currentStakedAmount, currentAccumulatedRewardAmount) || _amount == type(uint256).max)\n        );\n\n        uint256 totalAmount = _amount;\n        uint256 principalAmount;\n        uint256 rewardAmount;\n        (totalAmount, principalAmount, rewardAmount) = _handleWithdraw(_amount, assetsInfo, claimQueue[lastClaimQueueID], true);\n\n        require(totalAmount > 0, \"no assets to withdraw\");\n\n        totalStakeAmountByToken[_token] -= principalAmount;\n        totalRewardsAmountByToken[_token] -= rewardAmount;\n\n        uint256 sharesToBurn = (totalAmount * 1e18) / exchangeRate;\n        uint256 lpBalance = supportedTokenToLPToken[_token].balanceOf(msg.sender);\n\n        if(sharesToBurn > lpBalance || assetsInfo.stakedAmount == 0) sharesToBurn = lpBalance;\n\n        supportedTokenToLPToken[_token].burn(msg.sender, sharesToBurn);\n\n        uint256 amountToSent = totalAmount * (BASE - penaltyRate) / BASE;\n        uint256 fee = totalAmount - amountToSent;\n\n        require(getContractBalance(_token) >= amountToSent, \"not enough balance\");\n\n        IERC20(_token).safeTransfer(msg.sender, amountToSent);\n\n        tvl[_token] -= principalAmount;\n\n        assetsInfo.claimHistory.push(\n            ClaimItem({\n                isDone: true,\n                token: _token,\n                user: msg.sender,\n                totalAmount: totalAmount,\n                principalAmount: principalAmount,\n                rewardAmount: rewardAmount,\n                requestTime: block.timestamp,\n                claimTime: block.timestamp\n            })\n        );\n\n        emit FlashWithdraw(msg.sender, _token, totalAmount, principalAmount, rewardAmount, fee);\n    }\n\n    function _handleWithdraw(\n        uint256 _amount,\n        AssetsInfo storage assetsInfo,\n        ClaimItem storage queueItem,\n        bool isFlash\n    ) internal returns (uint256, uint256, uint256) {\n        uint256 totalAmount = _amount;\n        uint256 principalAmount;\n        uint256 rewardAmount;\n        uint256 currentAccumulatedRewardAmount = assetsInfo.accumulatedReward;\n        if(_amount == type(uint256).max){\n            totalAmount = Utils.Add(currentAccumulatedRewardAmount, assetsInfo.stakedAmount);\n            rewardAmount = currentAccumulatedRewardAmount;\n\n            assetsInfo.accumulatedReward = 0;\n\n            principalAmount = assetsInfo.stakedAmount;\n            assetsInfo.stakedAmount = 0;\n        }else if(currentAccumulatedRewardAmount >= _amount) {\n            assetsInfo.accumulatedReward -= _amount;\n            rewardAmount = _amount;\n        } else {\n            rewardAmount = currentAccumulatedRewardAmount;\n            assetsInfo.accumulatedReward = 0;\n\n            uint256 difference = _amount - currentAccumulatedRewardAmount;\n            assetsInfo.stakedAmount -= difference;\n            principalAmount = difference;\n        }\n        if(!isFlash) {\n            queueItem.rewardAmount = rewardAmount;\n            queueItem.principalAmount = principalAmount;\n        }\n        return(totalAmount, principalAmount, rewardAmount);\n    }\n\n    function _updateRewardState(address _user, address _token) internal {\n        AssetsInfo storage assetsInfo = userAssetsInfo[_user][_token];\n        uint256 newAccumulatedReward = 0;\n        uint256 newAccumulatedRewardForAll;\n        if(assetsInfo.lastRewardUpdateTime != 0) { // not the first time to stake\n            newAccumulatedReward = _getClaimableRewards(_user, _token);\n        }\n\n        newAccumulatedRewardForAll = _getClaimableRewards(address(this), _token);\n\n        assetsInfo.accumulatedReward = newAccumulatedReward;\n        assetsInfo.lastRewardUpdateTime = block.timestamp;\n\n        _lastRewardUpdatedTime[_token] = block.timestamp;\n        totalRewardsAmountByToken[_token] = newAccumulatedRewardForAll;\n    }\n\n    function _getExchangeRate(address _token) internal view returns (uint256 exchangeRate) {\n        uint256 totalSupplyLPToken = supportedTokenToLPToken[_token].totalSupply();\n        if (totalSupplyLPToken == 0) {\n            exchangeRate = 1e18;\n        } else {\n            exchangeRate = ((totalStakeAmountByToken[_token] + totalRewardsAmountByToken[_token]) * 1e18) / totalSupplyLPToken;\n        }\n    }\n\n    function convertToShares(uint256 tokenAmount, address _token) public view returns (uint256 shares) {\n        uint256 totalSupplyLPToken = supportedTokenToLPToken[_token].totalSupply();\n        uint256 totalStaked = totalStakeAmountByToken[_token];\n        uint256 totalRewards = _getClaimableRewards(address(this), _token);\n\n        uint256 exchangeRate = totalSupplyLPToken == 0 ? \n        1e18 : (totalStaked + totalRewards) * 1e18 / totalSupplyLPToken;\n        shares = (tokenAmount * 1e18) / exchangeRate;\n    }\n\n    function convertToAssets(uint256 shares, address _token) public view returns (uint256 tokenAmount) {\n        uint256 totalSupplyLPToken = supportedTokenToLPToken[_token].totalSupply();\n        uint256 totalStaked = totalStakeAmountByToken[_token];\n        uint256 totalRewards = _getClaimableRewards(address(this), _token);\n\n        uint256 exchangeRate = totalSupplyLPToken == 0 ? \n        1e18 : (totalStaked + totalRewards) * 1e18 / totalSupplyLPToken;\n\n        tokenAmount = (shares * exchangeRate) / 1e18;\n    }\n\n    function transferOrTransferFrom(address token, address from, address to, uint256 amount) public notBlacklisted(msg.sender) notBlacklisted(from) notBlacklisted(to) returns (bool) {\n        require(from != to, \"from can not be same as the to\");\n        require(amount > 0, \"amount must be greater than 0\");\n\n        uint256 tokenBefore = getLPTokenAmount(from, token);\n        require(tokenBefore >= amount, \"balance\");\n        if(msg.sender != from){\n            require(supportedTokenToLPToken[token].allowance(from, msg.sender) >= amount, \"allowance\");\n            supportedTokenToLPToken[token].updateAllowance(from, msg.sender, amount);\n            supportedTokenToLPToken[token].transferFrom(from, to, amount);\n        }else{\n            supportedTokenToLPToken[token].transferFrom(msg.sender, to, amount);\n        }\n\n        _assetsInfoUpdate(token, from, to, amount, tokenBefore);\n\n        return true;\n    }\n\n    function _assetsInfoUpdate(address token, address from, address to, uint256 amount, uint256 tokenBefore) internal {\n        _updateRewardState(from, token);\n        _updateRewardState(to, token);\n        AssetsInfo storage assetsInfoFrom = userAssetsInfo[from][token];\n        uint256 stakedAmount = assetsInfoFrom.stakedAmount;\n        uint256 accumulatedReward = assetsInfoFrom.accumulatedReward;\n\n        AssetsInfo storage assetsInfoTo = userAssetsInfo[to][token];\n\n        uint256 percent = amount * 1e18 / tokenBefore;\n        uint256 deltaStaked = (stakedAmount * percent / 1e18);\n        uint256 deltaReward = (accumulatedReward * percent / 1e18);\n\n        assetsInfoTo.stakedAmount += deltaStaked;\n        assetsInfoFrom.stakedAmount -= deltaStaked;\n        assetsInfoTo.accumulatedReward += deltaReward;\n        assetsInfoFrom.accumulatedReward -= deltaReward;\n        assetsInfoTo.lastRewardUpdateTime = block.timestamp;\n    }\n\n    function transferToCustodian(\n        address _token,\n        uint256 _amount\n    ) external onlySupportedToken(_token) onlyRole(BOT_ROLE) {\n        require(Utils.MustGreaterThanZero(_amount), \"must > 0\");\n        require(_amount <= IERC20(_token).balanceOf(address(this)), \"Not enough balance\");\n\n        IERC20(_token).safeTransfer(custodian, _amount);\n\n        emit CustodianReceive(_token, custodian, _amount);\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                          emergency                                                ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function emergencyWithdraw(address _token, address _receiver) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        // `_token` could be not supported, so that we could sweep the tokens which are sent to this contract accidentally\n        Utils.CheckIsZeroAddress(_token);\n        Utils.CheckIsZeroAddress(_receiver);\n\n        IERC20(_token).safeTransfer(_receiver, IERC20(_token).balanceOf(address(this)));\n        emit EmergencyWithdrawal(_token, _receiver);\n    }\n\n    function pause() external onlyRole(PAUSER_ROLE) {\n        _pause();\n    }\n\n    function unpause() external onlyRole(PAUSER_ROLE) {\n        _unpause();\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                        configuration                                              ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function addSupportedToken(\n        address _token,\n        uint256 _minAmount,\n        uint256 _maxAmount,\n        uint256 _rewardRate,\n        address _lpToken\n    ) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        Utils.CheckIsZeroAddress(_token);\n        require(!supportedTokens[_token], \"Supported\");\n        require(_rewardRate < BASE && Utils.MustGreaterThanZero(_rewardRate), \"Invalid reward rate\");\n\n        // update the supported tokens\n        supportedTokens[_token] = true;\n        setStakeLimit(_token, _minAmount, _maxAmount);\n        emit AddSupportedToken(_token, _minAmount, _maxAmount);\n\n        ILPToken tokenTemp = ILPToken(_lpToken);\n        supportedTokenToLPToken[_token] = tokenTemp;\n        lpTokenToSupportedToken[address(tokenTemp)] = _token;\n        emit LPTokenCreated(address(tokenTemp));\n\n        // set the reward rate\n        RewardRateState memory rewardRateItem = RewardRateState({\n            token: _token,\n            rewardRate: _rewardRate,\n            updatedTime: block.timestamp\n        });\n        rewardRateState[_token].push(rewardRateItem);\n        emit UpdateRewardRate(_token, 0, _rewardRate);\n    }\n\n    function setRewardRate(\n        address _token, \n        uint256 _newRewardRate\n    ) external onlySupportedToken(_token) onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_newRewardRate < BASE, \"Invalid rate\");\n\n        RewardRateState[] memory rewardRateArray = rewardRateState[_token];\n        uint256 currentRewardRate = rewardRateArray[rewardRateArray.length - 1].rewardRate;\n        require(currentRewardRate != _newRewardRate && Utils.MustGreaterThanZero(_newRewardRate), \"Invalid new rate\");\n\n        // add the new reward rate to the array\n        RewardRateState memory rewardRateItem = RewardRateState({\n            updatedTime: block.timestamp,\n            token: _token,\n            rewardRate: _newRewardRate\n        });\n        rewardRateState[_token].push(rewardRateItem);\n\n        emit UpdateRewardRate(_token, currentRewardRate, _newRewardRate);\n    }\n\n    function setPenaltyRate(uint256 newRate) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(newRate <= BASE && newRate != penaltyRate, \"Invalid\");\n\n        emit UpdatePenaltyRate(penaltyRate, newRate);\n        penaltyRate = newRate;\n    }\n\n    function setCustodian(address _newCustodian) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        Utils.CheckIsZeroAddress(_newCustodian);\n        require(_newCustodian != custodian);\n\n        emit UpdateCustodian(custodian, _newCustodian);\n        custodian = _newCustodian;\n    }\n\n    function setStakeLimit(\n        address _token,\n        uint256 _minAmount,\n        uint256 _maxAmount\n    ) public onlyRole(DEFAULT_ADMIN_ROLE) onlySupportedToken(_token) {\n        require(Utils.MustGreaterThanZero(_minAmount) && _minAmount < _maxAmount);\n\n        emit UpdateStakeLimit(_token, minStakeAmount[_token], maxStakeAmount[_token], _minAmount, _maxAmount);\n        minStakeAmount[_token] = _minAmount;\n        maxStakeAmount[_token] = _maxAmount;\n    }\n\n    function setWaitingTime(uint256 _newWaitingTime) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_newWaitingTime != WAITING_TIME, \"Invalid\");\n\n        emit UpdateWaitingTime(WAITING_TIME, _newWaitingTime);\n        WAITING_TIME = _newWaitingTime;        \n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                          view / pure                                              ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function calculateReward(\n        uint256 _stakedAmount, \n        uint256 _rewardRate, \n        uint256 _elapsedTime\n    ) internal pure returns (uint256 result) {\n        // (stakedAmount * rewardRate * elapsedTime) / (ONE_YEAR * 10000)\n        // Parameter descriptions:\n        // - stakedAmount: The amount staked by the user\n        // - rewardRate: The annual reward rate (e.g., 700 means 7%)\n        // - elapsedTime: The time interval over which the reward is calculated, in seconds\n        // - ONE_YEAR: The total number of seconds in one year (365.25 days)\n        assembly {\n            // uint256 ONE_YEAR = uint256(365.25 * 24 * 60 * 60); // 365.25 days per year: 31557600\n            let ONE_YEAR := 31557600\n\n            // Calculate numerator = stakedAmount * rewardRate * elapsedTime\n            let numerator := mul(_stakedAmount, _rewardRate)\n            numerator := mul(numerator, _elapsedTime)\n\n            // Calculate denominator = ONE_YEAR * 10000\n            let denominator := mul(ONE_YEAR, BASE)\n\n            // Perform the division result = numerator / denominator\n            result := div(numerator, denominator)\n        }\n    }\n\n    function _getClaimableRewards(address _user, address _token) internal view returns (uint256) {\n        uint256 currentStakedAmount;\n        uint256 lastRewardUpdate;\n        uint256 currentRewardAmount;\n\n        if(_user != address(this)){\n            AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n            currentStakedAmount = assetsInfo.stakedAmount;\n            lastRewardUpdate = assetsInfo.lastRewardUpdateTime;\n            currentRewardAmount = assetsInfo.accumulatedReward;\n        } else {\n            currentStakedAmount = totalStakeAmountByToken[_token];\n            lastRewardUpdate = _lastRewardUpdatedTime[_token];\n            currentRewardAmount = totalRewardsAmountByToken[_token];\n        }\n\n        RewardRateState[] memory rewardRateArray = rewardRateState[_token];\n        uint256 rewardRateLength = rewardRateArray.length;\n        RewardRateState memory currentRewardRateState = rewardRateArray[rewardRateLength - 1];\n\n        if(lastRewardUpdate == 0) return 0;\n\n        // 1. Retrieve the last deposit time `begin`\n        // 2. Retrieve the current deposit time `end`\n        // 3. Check whether the reward rate changed between time `begin` and time `end`\n        // 4. Determine if the reward rate has changed since the last deposit:\n        //    - If no changes occurred, directly calculate and add the reward.\n        //    - If changes occurred, divide the deposit time into segments based on different rates \n        //      and accumulate the rewards accordingly.\n        if(currentRewardRateState.updatedTime <= lastRewardUpdate){\n            /*\n                   begin                   end\n                    |~~~~~~ position ~~~~~~~|\n                |--------- reward rate 1 --------------|--------- upcoming reward rate 2 --------------|\n            */\n\n            uint256 elapsedTime = block.timestamp - lastRewardUpdate;\n            uint256 reward = calculateReward(\n                currentStakedAmount,\n                currentRewardRateState.rewardRate,\n                elapsedTime\n            );\n\n            return currentRewardAmount + reward;\n        } else {\n            /*\n                   begin                                                       end\n                    |~~~~~~~~~~~~~~~~~~~~~~ position ~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n                |--------- reward rate 1 --------------|-- reward rate 2 --|-------- reward rate 3 --------|\n            */\n\n            // a. based on the reward rate at the time of the last stake, find the corresponding index in the rate array\n            uint256 beginIndex = 0;\n            for (uint256 i = 0; i < rewardRateLength; i++) {\n                if (lastRewardUpdate < rewardRateArray[i].updatedTime) {\n                    beginIndex = i;\n                    break;\n                }\n            }\n\n            // b. iterate to the latest-1 reward rate\n            uint256 tempLastRewardUpdateTime = lastRewardUpdate;\n            for (uint256 i = beginIndex; i < rewardRateLength; i++) {\n                if(i == 0) continue;\n\n                uint256 tempElapsedTime = rewardRateArray[i].updatedTime - tempLastRewardUpdateTime;\n                uint256 tempReward = calculateReward(\n                    currentStakedAmount,\n                    rewardRateArray[i - 1].rewardRate,\n                    tempElapsedTime\n                );\n                tempLastRewardUpdateTime = rewardRateArray[i].updatedTime;\n                unchecked{\n                    currentRewardAmount += tempReward;\n                }\n            }\n\n            // c. the reward generated by the latest reward rate\n            uint256 elapsedTime = block.timestamp - currentRewardRateState.updatedTime;\n            uint256 reward = calculateReward(\n                currentStakedAmount,\n                currentRewardRateState.rewardRate,\n                elapsedTime\n            );\n\n            return currentRewardAmount + reward;\n        }\n    }\n\n    // principal + rewards\n    function getClaimableAssets(address _user, address _token) external view returns (uint256) {\n        AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n        \n        return Utils.Add(assetsInfo.stakedAmount, _getClaimableRewards(_user, _token));\n    }\n\n    // current rewards\n    function getClaimableRewards(address _user, address _token) external view returns (uint256) {\n        return _getClaimableRewards(_user, _token);\n    }\n\n    // history rewards + current rewards\n    function getTotalRewards(address _user, address _token) external view returns (uint256) {\n        uint256 historyRewards = 0;\n        uint256 currentRewards = _getClaimableRewards(_user, _token);\n\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        for(uint256 i = 0; i < stakeInfo.claimHistory.length; i++) {\n            historyRewards += stakeInfo.claimHistory[i].rewardAmount;\n        }\n\n        return Utils.Add(historyRewards, currentRewards);\n    }\n\n    // Calculate the total withdrawable amount for a user at a future time, \n    // based on the user's current staked amount and the current reward rate.\n    function getClaimableRewardsWithTargetTime(\n        address _user,\n        address _token,\n        uint256 _targetTime\n    ) external view returns (uint256) {\n        require(_targetTime > block.timestamp, \"Invalid time\");\n\n        AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n        RewardRateState[] memory rewardRateArray = rewardRateState[_token];\n        RewardRateState memory currentRewardRateState = rewardRateArray[rewardRateArray.length - 1];\n\n        uint256 newAccumulatedReward = 0;\n        if(assetsInfo.lastRewardUpdateTime != 0) { // not the first time to stake\n            newAccumulatedReward = _getClaimableRewards(_user, _token);\n        }\n\n        uint256 elapsedTime = _targetTime - block.timestamp;\n        uint256 reward = calculateReward(\n            assetsInfo.stakedAmount,\n            currentRewardRateState.rewardRate,\n            elapsedTime\n        );\n\n        return Utils.Add(newAccumulatedReward, reward);\n    }\n\n    function getStakedAmount(address _user, address _token) public view onlySupportedToken(_token) returns (uint256) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        return stakeInfo.stakedAmount;\n    }\n\n    function getLPTokenAmount(address _user, address _token) public view onlySupportedToken(_token) returns (uint256) {\n        return supportedTokenToLPToken[_token].balanceOf(_user);\n    }\n\n    function getContractBalance(address _token) public view returns (uint256) {\n        Utils.CheckIsZeroAddress(_token);\n        return IERC20(_token).balanceOf(address(this));\n    }\n\n    function getStakeHistory(\n        address _user,\n        address _token,\n        uint256 _index\n    ) external view onlySupportedToken(_token) returns (StakeItem memory) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        require(_index < stakeInfo.stakeHistory.length, \"index\");\n\n        return stakeInfo.stakeHistory[_index];\n    }\n\n    function getClaimHistory(\n        address _user,\n        address _token,\n        uint256 _index\n    ) external view onlySupportedToken(_token) returns (ClaimItem memory) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        require(_index < stakeInfo.claimHistory.length, \"index\");\n\n        return stakeInfo.claimHistory[_index];\n    }\n\n    function getStakeHistoryLength(address _user, address _token) external view returns (uint256) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n\n        return stakeInfo.stakeHistory.length;\n    }\n\n    function getClaimHistoryLength(address _user, address _token) public view returns (uint256) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n\n        return stakeInfo.claimHistory.length;\n    }\n\n    // Check the current withdrawal request in progress for a specific user\n    function getClaimQueueIDs(address _user, address _token) external view returns (uint256[] memory) {\n        AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n        \n        return assetsInfo.pendingClaimQueueIDs;\n    }\n\n    // Measure the reward rate as a percentage, and return the numerator and denominator\n    function getCurrentRewardRate(address _token) external view returns (uint256, uint256) {\n        RewardRateState[] memory rewardRateStateArray = rewardRateState[_token];\n        RewardRateState memory currentRewardRateState = rewardRateStateArray[rewardRateStateArray.length - 1];\n\n        return (currentRewardRateState.rewardRate, BASE);\n    }\n\n    function getClaimQueueInfo(uint256 _index) external view returns (ClaimItem memory) {\n        return claimQueue[_index];\n    }\n\n    function getTVL(address _token) external view returns (uint256) {\n        return tvl[_token];\n    }\n\n    function isBlacklisted(address _address) public view returns (bool) {\n        return _blacklist[_address];\n    }\n\n    receive() external payable {\n        revert();\n    }\n}\n"},"contracts/interfaces/ILPToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface ILPToken is IERC20 {\n    function mint(address to, uint256 amount) external;\n    function burn(address from, uint256 amount) external;\n    function setMinter(address minter, address vault) external;\n    function updateAllowance(address from, address to, uint256 amount) external;\n}\n"},"contracts/interfaces/IVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n// Main information: stake and claim\nstruct AssetsInfo {\n    uint256 stakedAmount;\n    uint256 accumulatedReward;\n    uint256 lastRewardUpdateTime;\n    uint256[] pendingClaimQueueIDs;\n    StakeItem[] stakeHistory;\n    ClaimItem[] claimHistory;\n}\n\nstruct StakeItem {\n    address token;\n    address user;\n    uint256 amount;\n    uint256 stakeTimestamp;\n}\n\nstruct ClaimItem {\n    bool isDone;\n    address token;\n    address user;\n    uint256 totalAmount;\n    uint256 principalAmount;\n    uint256 rewardAmount;\n    uint256 requestTime;\n    uint256 claimTime;\n}\n\ninterface IVault {\n    event Stake(address indexed _user, address indexed _token, uint256 indexed _amount);\n    event RequestClaim(address _user, address indexed _token, uint256 indexed _amount, uint256 _principalAmount, uint256 _rewardAmount, uint256 indexed _id);\n    event ClaimAssets(address indexed _user, address indexed _token, uint256 indexed _amount, uint256 _id);\n    event UpdateRewardRate(address _token, uint256 _oldRewardRate, uint256 _newRewardRate);\n    event UpdateCustodian(address _oldCustodian, address _newCustodian);\n    event UpdateStakeLimit(address indexed _token, uint256 _oldMinAmount, uint256 _oldMaxAmount, uint256 _newMinAmount, uint256 _newMaxAmount);\n    event CustodianReceive(address indexed _token, address _custodian, uint256 indexed _amount);\n    event AddSupportedToken(address indexed _token, uint256 _minAmount, uint256 _maxAmount);\n    event EmergencyWithdrawal(address indexed _token, address indexed _receiver);\n    event UpdateWaitingTime(uint256 _oldWaitingTime, uint256 _newWaitingTIme);\n    event LPTokenCreated(address indexed _token);\n    event FlashWithdraw(address indexed _user, address indexed _token, uint256 indexed _amount, uint256 _principalAmount, uint256 _rewardAmount, uint _fee);\n    event UpdatePenaltyRate(uint indexed oldRate, uint indexed newRate);\n    event CancelClaim(address indexed user, address indexed _token, uint256 indexed _amount, uint256 _id);\n\n    function stake(address _token, uint256 _stakedAmount) external;\n    function requestClaim(address _token, uint256 _amount) external returns(uint256);\n    function cancelClaim(uint _queueId, address _token) external;\n    function claim(uint256 _queueID, address token) external;\n    function flashWithdrawWithPenalty(address _token, uint256 _amount) external;\n\n    function transferToCustodian(address _token, uint256 _amount) external;\n    function emergencyWithdraw(address _token, address _receiver) external;\n\n    function addSupportedToken(address _token, uint256 _minAmount, uint256 _maxAmount, uint256 _rewardRate, address _lpToken) external;\n    function setRewardRate(address _token, uint256 _newRewardRate) external;\n    function setPenaltyRate(uint256 _newRate) external;\n    function setStakeLimit(address _token, uint256 _minAmount, uint256 _maxAmount) external;\n    function setCustodian(address _newCustodian) external;\n    function setWaitingTime(uint256 _newWaitingTIme) external;\n    function pause() external;\n    function unpause() external;\n\n    function convertToShares(uint tokenAmount, address _token) external view returns (uint256);\n    function convertToAssets(uint shares, address _token) external view returns (uint256);\n    function getClaimableRewardsWithTargetTime(address _user, address _token, uint256 _targetTime) external view returns (uint256);\n    function getClaimableAssets(address _user, address _token) external view returns (uint256);\n    function getClaimableRewards(address _user, address _token) external view returns (uint256);\n    function getTotalRewards(address _user, address _token) external view returns (uint256);\n    function getStakedAmount(address _user, address _token) external view returns (uint256);\n    function getContractBalance(address _token) external view returns (uint256);\n    function getStakeHistory(address _user, address _token, uint256 _index) external view returns (StakeItem memory);\n    function getClaimHistory(address _user, address _token, uint256 _index) external view returns (ClaimItem memory);\n    function getStakeHistoryLength(address _user, address _token) external view returns(uint256);\n    function getClaimHistoryLength(address _user, address _token) external view returns(uint256);\n    function getCurrentRewardRate(address _token) external view returns(uint256, uint256);\n    function getClaimQueueInfo(uint256 _index) external view returns(ClaimItem memory);\n    function getClaimQueueIDs(address _user, address _token) external view returns(uint256[] memory);\n    function getTVL(address _token) external view returns(uint256);\n    function getLPTokenAmount(address _user, address _token) external view returns(uint256);\n    function lastClaimQueueID() external view returns(uint256);\n}\n"},"contracts/interfaces/IWithdrawVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\ninterface IWithdrawVault {\n    function transfer(address, address, uint256) external;\n    function addSupportedToken(address) external;\n    function setVault(address) external;\n    function getSupportedTokens() external view returns (address[] memory);\n    function getBalance(address) external view returns (uint256);\n    function emergencyWithdraw(address, address, uint) external;\n    function transferToCustodian(address token, uint amount)external;\n}\n"},"contracts/utils/Utils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nlibrary Utils {\n    // Use this when we are certain that an overflow will not occur\n    function Add(uint _a, uint _b) internal pure returns (uint256 result) {\n        assembly {\n            result := add(_a, _b)\n        }\n    }\n\n    function CheckIsZeroAddress(address _address) internal pure returns (bool) {\n        assembly (\"memory-safe\") {\n            if iszero(_address) {\n                mstore(0x00, 0x20)\n                mstore(0x20, 0x0c)\n                mstore(0x40, 0x5a65726f20416464726573730000000000000000000000000000000000000000) // load hex of \"Zero Address\" to memory\n                revert(0x00, 0x60)\n            }\n        }\n        return true;\n    }\n\n    function MustGreaterThanZero(uint256 _value) internal pure returns (bool result) {\n        assembly {\n            // The 'iszero' opcode returns 1 if the input is zero, and 0 otherwise.\n            // So, 'iszero(iszero(_value))' returns 1 if value > 0, and 0 if value == 0.\n            result := iszero(iszero(_value))\n        }\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.28+commit.7893614a","compilerSettings":{"viaIR":true,"optimizer":{"runs":200,"enabled":true},"evmVersion":"prague"},"name":"Vault","fullyQualifiedName":"contracts/Vault.sol:Vault"},"abi":[{"type":"constructor","inputs":[{"name":"_tokens","type":"address[]","internalType":"address[]"},{"name":"_lpTokens","type":"address[]","internalType":"address[]"},{"name":"_newRewardRate","type":"uint256[]","internalType":"uint256[]"},{"name":"_minStakeAmount","type":"uint256[]","internalType":"uint256[]"},{"name":"_maxStakeAmount","type":"uint256[]","internalType":"uint256[]"},{"name":"_admin","type":"address","internalType":"address"},{"name":"_bot","type":"address","internalType":"address"},{"name":"_custodian","type":"address","internalType":"address"},{"name":"_waitingTime","type":"uint256","internalType":"uint256"},{"name":"withdrawVaultAddress","type":"address","internalType":"address payable"}],"stateMutability":"nonpayable"},{"name":"AccessControlBadConfirmation","type":"error","inputs":[]},{"name":"AccessControlUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"name":"EnforcedPause","type":"error","inputs":[]},{"name":"ExpectedPause","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"AddSupportedToken","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_minAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_maxAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BlacklistAdded","type":"event","inputs":[{"name":"_address","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"BlacklistRemoved","type":"event","inputs":[{"name":"_address","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"CancelClaim","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_id","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CancelStatusChanged","type":"event","inputs":[{"name":"oldStatus","type":"bool","indexed":true,"internalType":"bool"},{"name":"newStatus","type":"bool","indexed":true,"internalType":"bool"}],"anonymous":false},{"name":"ClaimAssets","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_id","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CustodianReceive","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_custodian","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"EmergencyWithdrawal","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_receiver","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"FlashStatusChanged","type":"event","inputs":[{"name":"oldStatus","type":"bool","indexed":true,"internalType":"bool"},{"name":"newStatus","type":"bool","indexed":true,"internalType":"bool"}],"anonymous":false},{"name":"FlashWithdraw","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_principalAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_rewardAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LPTokenCreated","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"RequestClaim","type":"event","inputs":[{"name":"_user","type":"address","indexed":false,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_principalAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_rewardAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RoleAdminChanged","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"name":"RoleGranted","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RoleRevoked","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Stake","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"UpdateCustodian","type":"event","inputs":[{"name":"_oldCustodian","type":"address","indexed":false,"internalType":"address"},{"name":"_newCustodian","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"UpdatePenaltyRate","type":"event","inputs":[{"name":"oldRate","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newRate","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"UpdateRewardRate","type":"event","inputs":[{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_oldRewardRate","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newRewardRate","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UpdateStakeLimit","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_oldMinAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_oldMaxAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newMinAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newMaxAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UpdateWaitingTime","type":"event","inputs":[{"name":"_oldWaitingTime","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newWaitingTIme","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DEFAULT_ADMIN_ROLE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"WAITING_TIME","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"addSupportedToken","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_minAmount","type":"uint256","internalType":"uint256"},{"name":"_maxAmount","type":"uint256","internalType":"uint256"},{"name":"_rewardRate","type":"uint256","internalType":"uint256"},{"name":"_lpToken","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"addToBlacklist","type":"function","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"cancelClaim","type":"function","inputs":[{"name":"_queueId","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"claim","type":"function","inputs":[{"name":"_queueID","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertToAssets","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"tokenAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"convertToShares","type":"function","inputs":[{"name":"tokenAmount","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"emergencyWithdraw","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_receiver","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"flashWithdrawWithPenalty","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getClaimHistory","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"},{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"isDone","type":"bool","internalType":"bool"},{"name":"token","type":"address","internalType":"address"},{"name":"user","type":"address","internalType":"address"},{"name":"totalAmount","type":"uint256","internalType":"uint256"},{"name":"principalAmount","type":"uint256","internalType":"uint256"},{"name":"rewardAmount","type":"uint256","internalType":"uint256"},{"name":"requestTime","type":"uint256","internalType":"uint256"},{"name":"claimTime","type":"uint256","internalType":"uint256"}],"internalType":"struct ClaimItem"}],"stateMutability":"view"},{"name":"getClaimHistoryLength","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getClaimQueueIDs","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"name":"getClaimQueueInfo","type":"function","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"isDone","type":"bool","internalType":"bool"},{"name":"token","type":"address","internalType":"address"},{"name":"user","type":"address","internalType":"address"},{"name":"totalAmount","type":"uint256","internalType":"uint256"},{"name":"principalAmount","type":"uint256","internalType":"uint256"},{"name":"rewardAmount","type":"uint256","internalType":"uint256"},{"name":"requestTime","type":"uint256","internalType":"uint256"},{"name":"claimTime","type":"uint256","internalType":"uint256"}],"internalType":"struct ClaimItem"}],"stateMutability":"view"},{"name":"getClaimableAssets","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getClaimableRewards","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getClaimableRewardsWithTargetTime","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"},{"name":"_targetTime","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getContractBalance","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getCurrentRewardRate","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getLPTokenAmount","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getRoleAdmin","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"getStakeHistory","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"},{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"token","type":"address","internalType":"address"},{"name":"user","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"stakeTimestamp","type":"uint256","internalType":"uint256"}],"internalType":"struct StakeItem"}],"stateMutability":"view"},{"name":"getStakeHistoryLength","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getStakedAmount","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTVL","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTotalRewards","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"grantRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"hasRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isBlacklisted","type":"function","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastClaimQueueID","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lpTokenToSupportedToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"maxStakeAmount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"minStakeAmount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"removeFromBlacklist","type":"function","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"requestClaim","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"_returnID","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"revokeRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setCancelEnable","type":"function","inputs":[{"name":"_enable","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setCustodian","type":"function","inputs":[{"name":"_newCustodian","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFlashEnable","type":"function","inputs":[{"name":"_enable","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPenaltyRate","type":"function","inputs":[{"name":"newRate","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRewardRate","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_newRewardRate","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setStakeLimit","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_minAmount","type":"uint256","internalType":"uint256"},{"name":"_maxAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setWaitingTime","type":"function","inputs":[{"name":"_newWaitingTime","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stake","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_stakedAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportedTokenToLPToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"contract ILPToken"}],"stateMutability":"view"},{"name":"supportedTokens","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"totalRewardsAmountByToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalStakeAmountByToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferOrTransferFrom","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferToCustodian","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address[]","name":"_lpTokens","type":"address[]"},{"internalType":"uint256[]","name":"_newRewardRate","type":"uint256[]"},{"internalType":"uint256[]","name":"_minStakeAmount","type":"uint256[]"},{"internalType":"uint256[]","name":"_maxStakeAmount","type":"uint256[]"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_bot","type":"address"},{"internalType":"address","name":"_custodian","type":"address"},{"internalType":"uint256","name":"_waitingTime","type":"uint256"},{"internalType":"address payable","name":"withdrawVaultAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_minAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxAmount","type":"uint256"}],"name":"AddSupportedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"BlacklistAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"BlacklistRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"CancelClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"CancelStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ClaimAssets","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"address","name":"_custodian","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"CustodianReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"address","name":"_receiver","type":"address"}],"name":"EmergencyWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"FlashStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_principalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"FlashWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"}],"name":"LPTokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_principalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"RequestClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldCustodian","type":"address"},{"indexed":false,"internalType":"address","name":"_newCustodian","type":"address"}],"name":"UpdateCustodian","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"UpdatePenaltyRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_oldRewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newRewardRate","type":"uint256"}],"name":"UpdateRewardRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_oldMinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_oldMaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newMinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newMaxAmount","type":"uint256"}],"name":"UpdateStakeLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_oldWaitingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newWaitingTIme","type":"uint256"}],"name":"UpdateWaitingTime","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WAITING_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"},{"internalType":"uint256","name":"_rewardRate","type":"uint256"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"addSupportedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_queueId","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"cancelClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_queueID","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"flashWithdrawWithPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getClaimHistory","outputs":[{"components":[{"internalType":"bool","name":"isDone","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"principalAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"requestTime","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct ClaimItem","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getClaimHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getClaimQueueIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getClaimQueueInfo","outputs":[{"components":[{"internalType":"bool","name":"isDone","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"principalAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"requestTime","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"internalType":"struct ClaimItem","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getClaimableAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getClaimableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_targetTime","type":"uint256"}],"name":"getClaimableRewardsWithTargetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getCurrentRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getLPTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getStakeHistory","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakeTimestamp","type":"uint256"}],"internalType":"struct StakeItem","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getStakeHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getTVL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"getTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastClaimQueueID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpTokenToSupportedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestClaim","outputs":[{"internalType":"uint256","name":"_returnID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setCancelEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newCustodian","type":"address"}],"name":"setCustodian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setFlashEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setPenaltyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_newRewardRate","type":"uint256"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"}],"name":"setStakeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWaitingTime","type":"uint256"}],"name":"setWaitingTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_stakedAmount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedTokenToLPToken","outputs":[{"internalType":"contract ILPToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalRewardsAmountByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStakeAmountByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferOrTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToCustodian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"userdoc":{"events":{"FlashStatusChanged(bool,bool)":{"notice":"Controller                                              ///"}},"kind":"user","methods":{"addSupportedToken(address,uint256,uint256,uint256,address)":{"notice":"configuration                                              ///"},"emergencyWithdraw(address,address)":{"notice":"emergency                                                ///"},"stake(address,uint256)":{"notice":"write                                                 ///"}},"version":1}},"settings":{"compilationTarget":{"contracts/Vault.sol":"Vault"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[],"viaIR":true},"sources":{"@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","license":"MIT","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"]},"@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","license":"MIT","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"]},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","license":"MIT","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"]},"@openzeppelin/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","license":"MIT","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"]},"@openzeppelin/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","license":"MIT","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5","license":"MIT","urls":["bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508","dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Pausable.sol":{"keccak256":"0xdb484371dfbb848cb6f5d70464e9ac9b2900e4164ead76bbce4fef0b44bcc68f","license":"MIT","urls":["bzz-raw://f9d6f6f6600a2bec622f699081b58350873b5e63ce05464d17d674a290bb8a7c","dweb:/ipfs/QmQKVzSQY1PM3Bid4QhgVVZyx6B4Jx7XgaQzLKHj38vJz8"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","license":"MIT","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"contracts/Vault.sol":{"keccak256":"0x0861a5ab2aa2c09e17e74d1d73966499b9f8618de2542d469342e0dfbc707568","license":"MIT","urls":["bzz-raw://d2f72459b2e7d4908710531dac390a44185004405d2de569ccc2f690d3338089","dweb:/ipfs/Qmc9kvBSjqhFywkrGuorVMwx7nDHF7PvhR876T8tiCtMcX"]},"contracts/interfaces/ILPToken.sol":{"keccak256":"0x190d0ba1e708efbe300096f40617c1e41b3f6137e450e96cf42f659823934032","license":"MIT","urls":["bzz-raw://ebc7dbf9c6ab46928de1d4d31f349bcfb9ec2939ae8839c3b9f1292d9b4fae57","dweb:/ipfs/QmTQJhvr1A4RUMtrT7Bi8UqqEKyPSUrUfhztk5fuWUBX9p"]},"contracts/interfaces/IVault.sol":{"keccak256":"0x414577334b7cfb92a8f4dbf00611a28fdda351e1aa13be6027e47d04c7594935","license":"MIT","urls":["bzz-raw://303ceb88475a2794b5c2af0266a64223a1257d8245a6148cfce4af4506e7052c","dweb:/ipfs/QmXCvLGanjd64DrZsFHjPft4mZ4MqbEHrfA5RweforarWh"]},"contracts/interfaces/IWithdrawVault.sol":{"keccak256":"0xc2e8074540ec80e7a1461f01d114082e1e06239f4db32c264cd694984dffccf2","license":"MIT","urls":["bzz-raw://4da920997c6efa4e93ab26ba4666bd36a563f9f51f5217600a5a3ca974154256","dweb:/ipfs/Qmc4vP9tG5f5Yf2bjdmeun7AHhqm21Eg3NXfBu8VNgQVRF"]},"contracts/utils/Utils.sol":{"keccak256":"0xbf624bc5e501d01857c18c2d39773d64765aa5ab08f3a8d0822d119828f2e2c8","license":"MIT","urls":["bzz-raw://ebe079c638cba2379280b0e3555f2b150f5a1a5263f405c9e232c3c0d700810b","dweb:/ipfs/QmNkFadzVwA3gpMgUTc57Y7eGDeCpAoTgLM6tvWPyLFh59"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(ILPToken)4530":{"label":"contract ILPToken","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_struct(RoleData)22_storage":{"label":"struct AccessControl.RoleData","members":[{"slot":"0","type":"t_mapping(t_address,t_bool)","astId":19,"label":"hasRole","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_bytes32","astId":21,"label":"adminRole","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"64"},"t_array(t_uint256)dyn_storage":{"base":"t_uint256","label":"uint256[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_contract(IWithdrawVault)5011":{"label":"contract IWithdrawVault","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_address)":{"key":"t_address","label":"mapping(address => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(ClaimItem)4576_storage":{"label":"struct ClaimItem","members":[{"slot":"0","type":"t_bool","astId":4561,"label":"isDone","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"0","type":"t_address","astId":4563,"label":"token","offset":1,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_address","astId":4565,"label":"user","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":4567,"label":"totalAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_uint256","astId":4569,"label":"principalAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"4","type":"t_uint256","astId":4571,"label":"rewardAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"5","type":"t_uint256","astId":4573,"label":"requestTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"6","type":"t_uint256","astId":4575,"label":"claimTime","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"224"},"t_struct(StakeItem)4559_storage":{"label":"struct StakeItem","members":[{"slot":"0","type":"t_address","astId":4552,"label":"token","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_address","astId":4554,"label":"user","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":4556,"label":"amount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_uint256","astId":4558,"label":"stakeTimestamp","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"128"},"t_struct(AssetsInfo)4550_storage":{"label":"struct AssetsInfo","members":[{"slot":"0","type":"t_uint256","astId":4534,"label":"stakedAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_uint256","astId":4536,"label":"accumulatedReward","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":4538,"label":"lastRewardUpdateTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_array(t_uint256)dyn_storage","astId":4541,"label":"pendingClaimQueueIDs","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"4","type":"t_array(t_struct(StakeItem)4559_storage)dyn_storage","astId":4545,"label":"stakeHistory","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"5","type":"t_array(t_struct(ClaimItem)4576_storage)dyn_storage","astId":4549,"label":"claimHistory","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"192"},"t_struct(RewardRateState)1250_storage":{"label":"struct Vault.RewardRateState","members":[{"slot":"0","type":"t_address","astId":1245,"label":"token","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_uint256","astId":1247,"label":"rewardRate","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":1249,"label":"updatedTime","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"96"},"t_mapping(t_address,t_contract(ILPToken)4530)":{"key":"t_address","label":"mapping(address => contract ILPToken)","value":"t_contract(ILPToken)4530","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_struct(RoleData)22_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => struct AccessControl.RoleData)","value":"t_struct(RoleData)22_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(ClaimItem)4576_storage)dyn_storage":{"base":"t_struct(ClaimItem)4576_storage","label":"struct ClaimItem[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_array(t_struct(StakeItem)4559_storage)dyn_storage":{"base":"t_struct(StakeItem)4559_storage","label":"struct StakeItem[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(ClaimItem)4576_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct ClaimItem)","value":"t_struct(ClaimItem)4576_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_struct(AssetsInfo)4550_storage)":{"key":"t_address","label":"mapping(address => struct AssetsInfo)","value":"t_struct(AssetsInfo)4550_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(RewardRateState)1250_storage)dyn_storage":{"base":"t_struct(RewardRateState)1250_storage","label":"struct Vault.RewardRateState[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_struct(AssetsInfo)4550_storage))":{"key":"t_address","label":"mapping(address => mapping(address => struct AssetsInfo))","value":"t_mapping(t_address,t_struct(AssetsInfo)4550_storage)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_struct(RewardRateState)1250_storage)dyn_storage)":{"key":"t_address","label":"mapping(address => struct Vault.RewardRateState[])","value":"t_array(t_struct(RewardRateState)1250_storage)dyn_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_bool","astId":1050,"label":"_paused","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_mapping(t_bytes32,t_struct(RoleData)22_storage)","astId":27,"label":"_roles","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_mapping(t_address,t_uint256)","astId":1215,"label":"tvl","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_mapping(t_address,t_bool)","astId":1219,"label":"supportedTokens","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"4","type":"t_mapping(t_address,t_contract(ILPToken)4530)","astId":1224,"label":"supportedTokenToLPToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"5","type":"t_mapping(t_address,t_address)","astId":1228,"label":"lpTokenToSupportedToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"6","type":"t_uint256","astId":1231,"label":"lastClaimQueueID","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"7","type":"t_mapping(t_uint256,t_struct(ClaimItem)4576_storage)","astId":1236,"label":"claimQueue","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"8","type":"t_mapping(t_address,t_mapping(t_address,t_struct(AssetsInfo)4550_storage))","astId":1243,"label":"userAssetsInfo","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"9","type":"t_mapping(t_address,t_array(t_struct(RewardRateState)1250_storage)dyn_storage)","astId":1256,"label":"rewardRateState","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"10","type":"t_mapping(t_address,t_bool)","astId":1270,"label":"_blacklist","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"11","type":"t_address","astId":1272,"label":"custodian","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"12","type":"t_uint256","astId":1275,"label":"penaltyRate","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"13","type":"t_mapping(t_address,t_uint256)","astId":1279,"label":"minStakeAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"14","type":"t_mapping(t_address,t_uint256)","astId":1283,"label":"maxStakeAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"15","type":"t_uint256","astId":1285,"label":"WAITING_TIME","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"16","type":"t_mapping(t_address,t_uint256)","astId":1292,"label":"totalStakeAmountByToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"17","type":"t_mapping(t_address,t_uint256)","astId":1296,"label":"_lastRewardUpdatedTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"18","type":"t_mapping(t_address,t_uint256)","astId":1300,"label":"totalRewardsAmountByToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"19","type":"t_uint256","astId":1302,"label":"initialTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"20","type":"t_contract(IWithdrawVault)5011","astId":1305,"label":"withdrawVault","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"20","type":"t_bool","astId":1308,"label":"flashNotEnable","offset":20,"contract":"contracts/Vault.sol:Vault"},{"slot":"20","type":"t_bool","astId":1311,"label":"cancelNotEnable","offset":21,"contract":"contracts/Vault.sol:Vault"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","events":{"FlashStatusChanged(bool,bool)":{"notice":"Controller                                              ///"}},"methods":{"stake(address,uint256)":{"notice":"write                                                 ///"},"emergencyWithdraw(address,address)":{"notice":"emergency                                                ///"},"addSupportedToken(address,uint256,uint256,uint256,address)":{"notice":"configuration                                              ///"}},"version":1},"devdoc":{"kind":"dev","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this."}},"methods":{"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."}},"version":1},"sourceIds":{"contracts/Vault.sol":{"id":11},"contracts/utils/Utils.sol":{"id":15},"contracts/interfaces/IVault.sol":{"id":13},"contracts/interfaces/ILPToken.sol":{"id":12},"contracts/interfaces/IWithdrawVault.sol":{"id":14},"@openzeppelin/contracts/utils/Context.sol":{"id":7},"@openzeppelin/contracts/utils/Pausable.sol":{"id":8},"@openzeppelin/contracts/interfaces/IERC20.sol":{"id":4},"@openzeppelin/contracts/interfaces/IERC165.sol":{"id":3},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":5},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"id":2},"@openzeppelin/contracts/access/AccessControl.sol":{"id":0},"@openzeppelin/contracts/access/IAccessControl.sol":{"id":1},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"id":9},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":6},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":10}},"additionalInput":null,"stdJsonInput":{"sources":{"contracts/Vault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\nimport {AccessControl} from \"@openzeppelin/contracts/access/AccessControl.sol\";\n\nimport \"./interfaces/ILPToken.sol\";\nimport \"./interfaces/IWithdrawVault.sol\";\nimport \"./interfaces/IVault.sol\";\nimport \"./utils/Utils.sol\";\n\ncontract Vault is IVault, Pausable, AccessControl {\n    using SafeERC20 for IERC20;\n    using SafeERC20 for ILPToken;\n\n    // TVL\n    mapping(address => uint256) private tvl;\n\n    // Supported tokens\n    mapping(address => bool) public supportedTokens;\n\n    // LP tokens\n    mapping(address => ILPToken) public supportedTokenToLPToken;\n    mapping(address => address) public lpTokenToSupportedToken;\n\n    uint256 public lastClaimQueueID = 10_000;\n    mapping(uint256 => ClaimItem) private claimQueue;\n\n    // Asset info\n    mapping(address => mapping(address => AssetsInfo)) private userAssetsInfo;\n\n    // Reward rate\n    struct RewardRateState {\n        address token;\n        uint256 rewardRate;\n        uint256 updatedTime;\n    }\n    mapping(address => RewardRateState[]) private rewardRateState;\n\n    // Roles\n    bytes32 private constant PAUSER_ROLE = keccak256(\"PAUSER_ROLE\");\n    bytes32 private constant BOT_ROLE = keccak256(\"BOT_ROLE\");\n\n    // Blacklist\n    mapping(address => bool) private _blacklist;\n\n    // Misc\n    address private custodian;\n    uint256 private penaltyRate = 50; // 0.5%\n    mapping(address => uint256) public minStakeAmount;\n    mapping(address => uint256) public maxStakeAmount;\n    uint256 public WAITING_TIME;\n    uint256 private constant BASE = 10_000;\n\n    mapping(address => uint256) public totalStakeAmountByToken;\n    mapping(address => uint256) private _lastRewardUpdatedTime;\n    mapping(address => uint256) public totalRewardsAmountByToken;\n\n    uint256 private initialTime;\n    IWithdrawVault private withdrawVault;\n\n    bool flashNotEnable = true;\n    bool cancelNotEnable = true;\n\n    constructor(\n        address[] memory _tokens,\n        address[] memory _lpTokens,\n        uint256[] memory _newRewardRate,\n        uint256[] memory _minStakeAmount,\n        uint256[] memory _maxStakeAmount,\n        address _admin,\n        address _bot,\n        address _custodian,\n        uint256 _waitingTime,\n        address payable withdrawVaultAddress\n    ) {\n        Utils.CheckIsZeroAddress(_custodian);\n        Utils.CheckIsZeroAddress(_admin);\n        Utils.CheckIsZeroAddress(_bot);\n\n        uint256 len = _tokens.length;\n        require(Utils.MustGreaterThanZero(len));\n        require(\n            len == _newRewardRate.length &&\n            len == _minStakeAmount.length &&\n            len == _maxStakeAmount.length && \n            len == _lpTokens.length\n        );\n\n        // Grant roles\n        _grantRole(DEFAULT_ADMIN_ROLE, _admin);\n        _grantRole(PAUSER_ROLE, _admin);\n        _grantRole(BOT_ROLE, _bot);\n\n        custodian = _custodian;\n        emit UpdateCustodian(address(0), _custodian);\n\n        WAITING_TIME = _waitingTime;\n        emit UpdateWaitingTime(0, _waitingTime);\n\n        initialTime = block.timestamp;\n\n        // Set the supported tokens and reward rate\n        for (uint256 i = 0; i < len; i++) {\n            require(_minStakeAmount[i] < _maxStakeAmount[i]);\n\n            // supported tokens\n            address token = _tokens[i];\n            minStakeAmount[token] = _minStakeAmount[i];\n            maxStakeAmount[token] = _maxStakeAmount[i];\n            supportedTokens[token] = true;\n            emit AddSupportedToken(token, _minStakeAmount[i], _maxStakeAmount[i]);\n\n            ILPToken tokenTemp = ILPToken(_lpTokens[i]);\n            supportedTokenToLPToken[token] = tokenTemp;\n            lpTokenToSupportedToken[address(tokenTemp)] = token;\n            emit LPTokenCreated(address(tokenTemp));\n\n            // reward rate\n            RewardRateState memory rewardRateItem = RewardRateState({\n                token: token,\n                rewardRate: _newRewardRate[i],\n                updatedTime: block.timestamp\n            });\n            rewardRateState[token].push(rewardRateItem);\n            emit UpdateRewardRate(token, 0, _newRewardRate[i]);\n\n            _lastRewardUpdatedTime[token] = block.timestamp;\n        }\n\n        withdrawVault = IWithdrawVault(withdrawVaultAddress);\n\n        _pause();\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                           Controller                                              ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    event FlashStatusChanged(bool indexed oldStatus, bool indexed newStatus);\n    event CancelStatusChanged(bool indexed oldStatus, bool indexed newStatus);\n    event BlacklistAdded(address indexed _address);\n    event BlacklistRemoved(address indexed _address);\n\n    modifier onlySupportedToken(address _token) {\n        require(supportedTokens[_token], \"Unsupported token\");\n        _;\n    }\n\n    modifier onlyFlashEnable() {\n        require(!flashNotEnable, \"flash withdraw not enabled\");\n        _;\n    }\n\n    modifier onlyCancelEnable() {\n        require(!cancelNotEnable, \"cancel claim not enabled\");\n        _;\n    }\n\n    modifier notBlacklisted(address _address) {\n        require(!isBlacklisted(_address), \"blacklisted\");\n        _;\n    }\n\n    function setFlashEnable(bool _enable) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_enable != flashNotEnable, \"nothing changed\");\n\n        bool oldStatus = flashNotEnable;\n        flashNotEnable = _enable;\n\n        emit FlashStatusChanged(oldStatus, _enable);\n    }\n\n    function setCancelEnable(bool _enable) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_enable != cancelNotEnable, \"nothing changed\");\n\n        bool oldStatus = cancelNotEnable;\n        cancelNotEnable = _enable;\n\n        emit CancelStatusChanged(oldStatus, _enable);\n    }\n\n    function addToBlacklist(address _address) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(!isBlacklisted(_address), \"already blacklisted\");\n\n        _blacklist[_address] = true;\n\n        emit BlacklistAdded(_address);\n    }\n\n    function removeFromBlacklist(address _address) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(isBlacklisted(_address), \"not blacklisted\");\n\n        _blacklist[_address] = false;\n\n        emit BlacklistRemoved(_address);\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                             write                                                 ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function stake(address _token,  uint256 _stakedAmount) external onlySupportedToken(_token) whenNotPaused notBlacklisted(msg.sender) {\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][_token];\n        uint256 currentStakedAmount = assetsInfo.stakedAmount;\n\n        require(Utils.Add(currentStakedAmount, _stakedAmount) >= minStakeAmount[_token]);\n        require(Utils.Add(currentStakedAmount, _stakedAmount) <= maxStakeAmount[_token]);\n\n        IERC20(_token).safeTransferFrom(msg.sender, address(this), _stakedAmount);\n\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n\n        totalStakeAmountByToken[_token] += _stakedAmount;\n        uint256 mintAmount = _stakedAmount * 1e18 / exchangeRate;\n        supportedTokenToLPToken[_token].mint(msg.sender, mintAmount);\n\n        // update status\n        assetsInfo.stakeHistory.push(\n            StakeItem({\n                stakeTimestamp: block.timestamp,\n                amount: _stakedAmount,\n                token: _token,\n                user: msg.sender\n            })\n        );\n        unchecked {\n            assetsInfo.stakedAmount += _stakedAmount;\n            tvl[_token] += _stakedAmount;\n        }\n\n        emit Stake(msg.sender, _token, _stakedAmount);\n    }\n\n    function requestClaim(\n        address _token,\n        uint256 _amount\n    ) external onlySupportedToken(_token) whenNotPaused notBlacklisted(msg.sender) returns (uint256 _returnID) {\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][_token];\n        uint256 currentStakedAmount = assetsInfo.stakedAmount;\n        uint256 currentAccumulatedRewardAmount = assetsInfo.accumulatedReward;\n\n        require(\n            Utils.MustGreaterThanZero(_amount) && \n            (_amount <= Utils.Add(currentStakedAmount, currentAccumulatedRewardAmount) || _amount == type(uint256).max), \n            \"Invalid amount\"\n        );\n\n        ClaimItem storage queueItem = claimQueue[lastClaimQueueID];\n\n        // Withdraw from reward first; if insufficient, continue withdrawing from principal\n        uint256 totalAmount = _amount;\n        (totalAmount, , ) = _handleWithdraw(_amount, assetsInfo, queueItem, false);\n\n        require(totalAmount > 0, \"No assets to withdraw\");\n\n        // update status\n        assetsInfo.pendingClaimQueueIDs.push(lastClaimQueueID);\n\n        totalStakeAmountByToken[_token] -= queueItem.principalAmount;\n        totalRewardsAmountByToken[_token] -= queueItem.rewardAmount;\n\n        uint256 sharesToBurn = totalAmount * 1e18 / exchangeRate;\n        uint256 lpBalance = supportedTokenToLPToken[_token].balanceOf(msg.sender);\n\n        if(sharesToBurn > lpBalance || assetsInfo.stakedAmount == 0) sharesToBurn = lpBalance;\n\n        supportedTokenToLPToken[_token].burn(msg.sender, sharesToBurn);\n\n        // update queue\n        queueItem.token = _token;\n        queueItem.user = msg.sender;\n        queueItem.totalAmount = totalAmount;\n        queueItem.requestTime = block.timestamp;\n        queueItem.claimTime = Utils.Add(block.timestamp, WAITING_TIME);\n\n        unchecked {\n            _returnID = lastClaimQueueID;\n            ++lastClaimQueueID;\n        }\n\n        emit RequestClaim(msg.sender, _token, totalAmount, queueItem.principalAmount, queueItem.rewardAmount, _returnID);\n    }\n\n    function cancelClaim(uint256 _queueId, address _token) external whenNotPaused notBlacklisted(msg.sender) onlyCancelEnable {\n        ClaimItem memory claimItem = claimQueue[_queueId];\n        delete claimQueue[_queueId];\n\n        address token = claimItem.token;\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][token];\n        uint256[] memory pendingClaimQueueIDs = userAssetsInfo[msg.sender][token].pendingClaimQueueIDs;\n\n        require(Utils.MustGreaterThanZero(claimItem.totalAmount));\n        require(claimItem.user == msg.sender);\n        require(!claimItem.isDone, \"claimed\");\n        require(token == _token, \"wrong token\");\n\n        for(uint256 i = 0; i < pendingClaimQueueIDs.length; i++) {\n            if(pendingClaimQueueIDs[i] == _queueId) {\n                assetsInfo.pendingClaimQueueIDs[i] = pendingClaimQueueIDs[pendingClaimQueueIDs.length-1];\n                assetsInfo.pendingClaimQueueIDs.pop();\n                break;\n            }\n        }\n\n        uint256 principal = claimItem.principalAmount;\n        uint256 reward = claimItem.rewardAmount;\n\n        assetsInfo.stakedAmount += principal;\n        assetsInfo.accumulatedReward += reward;\n        assetsInfo.lastRewardUpdateTime = block.timestamp;\n\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n        uint256 amountToMint = (principal + reward) * 1e18 / exchangeRate;\n\n        totalStakeAmountByToken[_token] += principal;\n        totalRewardsAmountByToken[_token] += reward;\n\n        supportedTokenToLPToken[_token].mint(msg.sender, amountToMint);\n\n        emit CancelClaim(msg.sender, _token, principal + reward, _queueId);\n    }\n\n    function claim(uint256 _queueID, address _token) external whenNotPaused notBlacklisted(msg.sender) {\n        ClaimItem memory claimItem = claimQueue[_queueID];\n        address token = claimItem.token;\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][token];\n        uint256[] memory pendingClaimQueueIDs = userAssetsInfo[msg.sender][token].pendingClaimQueueIDs;\n\n        require(Utils.MustGreaterThanZero(claimItem.totalAmount));\n        require(block.timestamp >= claimItem.claimTime);\n        require(claimItem.user == msg.sender);\n        require(!claimItem.isDone, \"claimed\");\n        require(token == _token, \"wrong token\");\n\n        // update status\n        claimQueue[_queueID].isDone = true;\n        for(uint256 i = 0; i < pendingClaimQueueIDs.length; i++) {\n            if(pendingClaimQueueIDs[i] == _queueID) {\n                assetsInfo.pendingClaimQueueIDs[i] = pendingClaimQueueIDs[pendingClaimQueueIDs.length-1];\n                assetsInfo.pendingClaimQueueIDs.pop();\n                break;\n            }\n        }\n        tvl[token] -= claimItem.principalAmount;\n\n        assetsInfo.claimHistory.push(\n            ClaimItem({\n                isDone: true,\n                token: token,\n                user: msg.sender,\n                totalAmount: claimItem.totalAmount,\n                principalAmount: claimItem.principalAmount,\n                rewardAmount: claimItem.rewardAmount,\n                requestTime: claimItem.requestTime,\n                claimTime: block.timestamp\n            })\n        );\n        withdrawVault.transfer(token, msg.sender, claimItem.totalAmount);\n\n        emit ClaimAssets(msg.sender, token, claimItem.totalAmount, _queueID);\n    }\n\n    function flashWithdrawWithPenalty(\n        address _token,\n        uint256 _amount\n    ) external onlySupportedToken(_token) whenNotPaused notBlacklisted(msg.sender) onlyFlashEnable {\n        AssetsInfo storage assetsInfo = userAssetsInfo[msg.sender][_token];\n        _updateRewardState(msg.sender, _token);\n        uint256 exchangeRate = _getExchangeRate(_token);\n\n        uint256 currentStakedAmount = assetsInfo.stakedAmount;\n        uint256 currentAccumulatedRewardAmount = assetsInfo.accumulatedReward;\n\n        require(\n            Utils.MustGreaterThanZero(_amount) && \n            (_amount <= Utils.Add(currentStakedAmount, currentAccumulatedRewardAmount) || _amount == type(uint256).max)\n        );\n\n        uint256 totalAmount = _amount;\n        uint256 principalAmount;\n        uint256 rewardAmount;\n        (totalAmount, principalAmount, rewardAmount) = _handleWithdraw(_amount, assetsInfo, claimQueue[lastClaimQueueID], true);\n\n        require(totalAmount > 0, \"no assets to withdraw\");\n\n        totalStakeAmountByToken[_token] -= principalAmount;\n        totalRewardsAmountByToken[_token] -= rewardAmount;\n\n        uint256 sharesToBurn = (totalAmount * 1e18) / exchangeRate;\n        uint256 lpBalance = supportedTokenToLPToken[_token].balanceOf(msg.sender);\n\n        if(sharesToBurn > lpBalance || assetsInfo.stakedAmount == 0) sharesToBurn = lpBalance;\n\n        supportedTokenToLPToken[_token].burn(msg.sender, sharesToBurn);\n\n        uint256 amountToSent = totalAmount * (BASE - penaltyRate) / BASE;\n        uint256 fee = totalAmount - amountToSent;\n\n        require(getContractBalance(_token) >= amountToSent, \"not enough balance\");\n\n        IERC20(_token).safeTransfer(msg.sender, amountToSent);\n\n        tvl[_token] -= principalAmount;\n\n        assetsInfo.claimHistory.push(\n            ClaimItem({\n                isDone: true,\n                token: _token,\n                user: msg.sender,\n                totalAmount: totalAmount,\n                principalAmount: principalAmount,\n                rewardAmount: rewardAmount,\n                requestTime: block.timestamp,\n                claimTime: block.timestamp\n            })\n        );\n\n        emit FlashWithdraw(msg.sender, _token, totalAmount, principalAmount, rewardAmount, fee);\n    }\n\n    function _handleWithdraw(\n        uint256 _amount,\n        AssetsInfo storage assetsInfo,\n        ClaimItem storage queueItem,\n        bool isFlash\n    ) internal returns (uint256, uint256, uint256) {\n        uint256 totalAmount = _amount;\n        uint256 principalAmount;\n        uint256 rewardAmount;\n        uint256 currentAccumulatedRewardAmount = assetsInfo.accumulatedReward;\n        if(_amount == type(uint256).max){\n            totalAmount = Utils.Add(currentAccumulatedRewardAmount, assetsInfo.stakedAmount);\n            rewardAmount = currentAccumulatedRewardAmount;\n\n            assetsInfo.accumulatedReward = 0;\n\n            principalAmount = assetsInfo.stakedAmount;\n            assetsInfo.stakedAmount = 0;\n        }else if(currentAccumulatedRewardAmount >= _amount) {\n            assetsInfo.accumulatedReward -= _amount;\n            rewardAmount = _amount;\n        } else {\n            rewardAmount = currentAccumulatedRewardAmount;\n            assetsInfo.accumulatedReward = 0;\n\n            uint256 difference = _amount - currentAccumulatedRewardAmount;\n            assetsInfo.stakedAmount -= difference;\n            principalAmount = difference;\n        }\n        if(!isFlash) {\n            queueItem.rewardAmount = rewardAmount;\n            queueItem.principalAmount = principalAmount;\n        }\n        return(totalAmount, principalAmount, rewardAmount);\n    }\n\n    function _updateRewardState(address _user, address _token) internal {\n        AssetsInfo storage assetsInfo = userAssetsInfo[_user][_token];\n        uint256 newAccumulatedReward = 0;\n        uint256 newAccumulatedRewardForAll;\n        if(assetsInfo.lastRewardUpdateTime != 0) { // not the first time to stake\n            newAccumulatedReward = _getClaimableRewards(_user, _token);\n        }\n\n        newAccumulatedRewardForAll = _getClaimableRewards(address(this), _token);\n\n        assetsInfo.accumulatedReward = newAccumulatedReward;\n        assetsInfo.lastRewardUpdateTime = block.timestamp;\n\n        _lastRewardUpdatedTime[_token] = block.timestamp;\n        totalRewardsAmountByToken[_token] = newAccumulatedRewardForAll;\n    }\n\n    function _getExchangeRate(address _token) internal view returns (uint256 exchangeRate) {\n        uint256 totalSupplyLPToken = supportedTokenToLPToken[_token].totalSupply();\n        if (totalSupplyLPToken == 0) {\n            exchangeRate = 1e18;\n        } else {\n            exchangeRate = ((totalStakeAmountByToken[_token] + totalRewardsAmountByToken[_token]) * 1e18) / totalSupplyLPToken;\n        }\n    }\n\n    function convertToShares(uint256 tokenAmount, address _token) public view returns (uint256 shares) {\n        uint256 totalSupplyLPToken = supportedTokenToLPToken[_token].totalSupply();\n        uint256 totalStaked = totalStakeAmountByToken[_token];\n        uint256 totalRewards = _getClaimableRewards(address(this), _token);\n\n        uint256 exchangeRate = totalSupplyLPToken == 0 ? \n        1e18 : (totalStaked + totalRewards) * 1e18 / totalSupplyLPToken;\n        shares = (tokenAmount * 1e18) / exchangeRate;\n    }\n\n    function convertToAssets(uint256 shares, address _token) public view returns (uint256 tokenAmount) {\n        uint256 totalSupplyLPToken = supportedTokenToLPToken[_token].totalSupply();\n        uint256 totalStaked = totalStakeAmountByToken[_token];\n        uint256 totalRewards = _getClaimableRewards(address(this), _token);\n\n        uint256 exchangeRate = totalSupplyLPToken == 0 ? \n        1e18 : (totalStaked + totalRewards) * 1e18 / totalSupplyLPToken;\n\n        tokenAmount = (shares * exchangeRate) / 1e18;\n    }\n\n    function transferOrTransferFrom(address token, address from, address to, uint256 amount) public notBlacklisted(msg.sender) notBlacklisted(from) notBlacklisted(to) returns (bool) {\n        require(from != to, \"from can not be same as the to\");\n        require(amount > 0, \"amount must be greater than 0\");\n\n        uint256 tokenBefore = getLPTokenAmount(from, token);\n        require(tokenBefore >= amount, \"balance\");\n        if(msg.sender != from){\n            require(supportedTokenToLPToken[token].allowance(from, msg.sender) >= amount, \"allowance\");\n            supportedTokenToLPToken[token].updateAllowance(from, msg.sender, amount);\n            supportedTokenToLPToken[token].transferFrom(from, to, amount);\n        }else{\n            supportedTokenToLPToken[token].transferFrom(msg.sender, to, amount);\n        }\n\n        _assetsInfoUpdate(token, from, to, amount, tokenBefore);\n\n        return true;\n    }\n\n    function _assetsInfoUpdate(address token, address from, address to, uint256 amount, uint256 tokenBefore) internal {\n        _updateRewardState(from, token);\n        _updateRewardState(to, token);\n        AssetsInfo storage assetsInfoFrom = userAssetsInfo[from][token];\n        uint256 stakedAmount = assetsInfoFrom.stakedAmount;\n        uint256 accumulatedReward = assetsInfoFrom.accumulatedReward;\n\n        AssetsInfo storage assetsInfoTo = userAssetsInfo[to][token];\n\n        uint256 percent = amount * 1e18 / tokenBefore;\n        uint256 deltaStaked = (stakedAmount * percent / 1e18);\n        uint256 deltaReward = (accumulatedReward * percent / 1e18);\n\n        assetsInfoTo.stakedAmount += deltaStaked;\n        assetsInfoFrom.stakedAmount -= deltaStaked;\n        assetsInfoTo.accumulatedReward += deltaReward;\n        assetsInfoFrom.accumulatedReward -= deltaReward;\n        assetsInfoTo.lastRewardUpdateTime = block.timestamp;\n    }\n\n    function transferToCustodian(\n        address _token,\n        uint256 _amount\n    ) external onlySupportedToken(_token) onlyRole(BOT_ROLE) {\n        require(Utils.MustGreaterThanZero(_amount), \"must > 0\");\n        require(_amount <= IERC20(_token).balanceOf(address(this)), \"Not enough balance\");\n\n        IERC20(_token).safeTransfer(custodian, _amount);\n\n        emit CustodianReceive(_token, custodian, _amount);\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                          emergency                                                ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function emergencyWithdraw(address _token, address _receiver) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        // `_token` could be not supported, so that we could sweep the tokens which are sent to this contract accidentally\n        Utils.CheckIsZeroAddress(_token);\n        Utils.CheckIsZeroAddress(_receiver);\n\n        IERC20(_token).safeTransfer(_receiver, IERC20(_token).balanceOf(address(this)));\n        emit EmergencyWithdrawal(_token, _receiver);\n    }\n\n    function pause() external onlyRole(PAUSER_ROLE) {\n        _pause();\n    }\n\n    function unpause() external onlyRole(PAUSER_ROLE) {\n        _unpause();\n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                        configuration                                              ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function addSupportedToken(\n        address _token,\n        uint256 _minAmount,\n        uint256 _maxAmount,\n        uint256 _rewardRate,\n        address _lpToken\n    ) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        Utils.CheckIsZeroAddress(_token);\n        require(!supportedTokens[_token], \"Supported\");\n        require(_rewardRate < BASE && Utils.MustGreaterThanZero(_rewardRate), \"Invalid reward rate\");\n\n        // update the supported tokens\n        supportedTokens[_token] = true;\n        setStakeLimit(_token, _minAmount, _maxAmount);\n        emit AddSupportedToken(_token, _minAmount, _maxAmount);\n\n        ILPToken tokenTemp = ILPToken(_lpToken);\n        supportedTokenToLPToken[_token] = tokenTemp;\n        lpTokenToSupportedToken[address(tokenTemp)] = _token;\n        emit LPTokenCreated(address(tokenTemp));\n\n        // set the reward rate\n        RewardRateState memory rewardRateItem = RewardRateState({\n            token: _token,\n            rewardRate: _rewardRate,\n            updatedTime: block.timestamp\n        });\n        rewardRateState[_token].push(rewardRateItem);\n        emit UpdateRewardRate(_token, 0, _rewardRate);\n    }\n\n    function setRewardRate(\n        address _token, \n        uint256 _newRewardRate\n    ) external onlySupportedToken(_token) onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_newRewardRate < BASE, \"Invalid rate\");\n\n        RewardRateState[] memory rewardRateArray = rewardRateState[_token];\n        uint256 currentRewardRate = rewardRateArray[rewardRateArray.length - 1].rewardRate;\n        require(currentRewardRate != _newRewardRate && Utils.MustGreaterThanZero(_newRewardRate), \"Invalid new rate\");\n\n        // add the new reward rate to the array\n        RewardRateState memory rewardRateItem = RewardRateState({\n            updatedTime: block.timestamp,\n            token: _token,\n            rewardRate: _newRewardRate\n        });\n        rewardRateState[_token].push(rewardRateItem);\n\n        emit UpdateRewardRate(_token, currentRewardRate, _newRewardRate);\n    }\n\n    function setPenaltyRate(uint256 newRate) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(newRate <= BASE && newRate != penaltyRate, \"Invalid\");\n\n        emit UpdatePenaltyRate(penaltyRate, newRate);\n        penaltyRate = newRate;\n    }\n\n    function setCustodian(address _newCustodian) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        Utils.CheckIsZeroAddress(_newCustodian);\n        require(_newCustodian != custodian);\n\n        emit UpdateCustodian(custodian, _newCustodian);\n        custodian = _newCustodian;\n    }\n\n    function setStakeLimit(\n        address _token,\n        uint256 _minAmount,\n        uint256 _maxAmount\n    ) public onlyRole(DEFAULT_ADMIN_ROLE) onlySupportedToken(_token) {\n        require(Utils.MustGreaterThanZero(_minAmount) && _minAmount < _maxAmount);\n\n        emit UpdateStakeLimit(_token, minStakeAmount[_token], maxStakeAmount[_token], _minAmount, _maxAmount);\n        minStakeAmount[_token] = _minAmount;\n        maxStakeAmount[_token] = _maxAmount;\n    }\n\n    function setWaitingTime(uint256 _newWaitingTime) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_newWaitingTime != WAITING_TIME, \"Invalid\");\n\n        emit UpdateWaitingTime(WAITING_TIME, _newWaitingTime);\n        WAITING_TIME = _newWaitingTime;        \n    }\n\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n    ///                                          view / pure                                              ///\n    /////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    function calculateReward(\n        uint256 _stakedAmount, \n        uint256 _rewardRate, \n        uint256 _elapsedTime\n    ) internal pure returns (uint256 result) {\n        // (stakedAmount * rewardRate * elapsedTime) / (ONE_YEAR * 10000)\n        // Parameter descriptions:\n        // - stakedAmount: The amount staked by the user\n        // - rewardRate: The annual reward rate (e.g., 700 means 7%)\n        // - elapsedTime: The time interval over which the reward is calculated, in seconds\n        // - ONE_YEAR: The total number of seconds in one year (365.25 days)\n        assembly {\n            // uint256 ONE_YEAR = uint256(365.25 * 24 * 60 * 60); // 365.25 days per year: 31557600\n            let ONE_YEAR := 31557600\n\n            // Calculate numerator = stakedAmount * rewardRate * elapsedTime\n            let numerator := mul(_stakedAmount, _rewardRate)\n            numerator := mul(numerator, _elapsedTime)\n\n            // Calculate denominator = ONE_YEAR * 10000\n            let denominator := mul(ONE_YEAR, BASE)\n\n            // Perform the division result = numerator / denominator\n            result := div(numerator, denominator)\n        }\n    }\n\n    function _getClaimableRewards(address _user, address _token) internal view returns (uint256) {\n        uint256 currentStakedAmount;\n        uint256 lastRewardUpdate;\n        uint256 currentRewardAmount;\n\n        if(_user != address(this)){\n            AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n            currentStakedAmount = assetsInfo.stakedAmount;\n            lastRewardUpdate = assetsInfo.lastRewardUpdateTime;\n            currentRewardAmount = assetsInfo.accumulatedReward;\n        } else {\n            currentStakedAmount = totalStakeAmountByToken[_token];\n            lastRewardUpdate = _lastRewardUpdatedTime[_token];\n            currentRewardAmount = totalRewardsAmountByToken[_token];\n        }\n\n        RewardRateState[] memory rewardRateArray = rewardRateState[_token];\n        uint256 rewardRateLength = rewardRateArray.length;\n        RewardRateState memory currentRewardRateState = rewardRateArray[rewardRateLength - 1];\n\n        if(lastRewardUpdate == 0) return 0;\n\n        // 1. Retrieve the last deposit time `begin`\n        // 2. Retrieve the current deposit time `end`\n        // 3. Check whether the reward rate changed between time `begin` and time `end`\n        // 4. Determine if the reward rate has changed since the last deposit:\n        //    - If no changes occurred, directly calculate and add the reward.\n        //    - If changes occurred, divide the deposit time into segments based on different rates \n        //      and accumulate the rewards accordingly.\n        if(currentRewardRateState.updatedTime <= lastRewardUpdate){\n            /*\n                   begin                   end\n                    |~~~~~~ position ~~~~~~~|\n                |--------- reward rate 1 --------------|--------- upcoming reward rate 2 --------------|\n            */\n\n            uint256 elapsedTime = block.timestamp - lastRewardUpdate;\n            uint256 reward = calculateReward(\n                currentStakedAmount,\n                currentRewardRateState.rewardRate,\n                elapsedTime\n            );\n\n            return currentRewardAmount + reward;\n        } else {\n            /*\n                   begin                                                       end\n                    |~~~~~~~~~~~~~~~~~~~~~~ position ~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n                |--------- reward rate 1 --------------|-- reward rate 2 --|-------- reward rate 3 --------|\n            */\n\n            // a. based on the reward rate at the time of the last stake, find the corresponding index in the rate array\n            uint256 beginIndex = 0;\n            for (uint256 i = 0; i < rewardRateLength; i++) {\n                if (lastRewardUpdate < rewardRateArray[i].updatedTime) {\n                    beginIndex = i;\n                    break;\n                }\n            }\n\n            // b. iterate to the latest-1 reward rate\n            uint256 tempLastRewardUpdateTime = lastRewardUpdate;\n            for (uint256 i = beginIndex; i < rewardRateLength; i++) {\n                if(i == 0) continue;\n\n                uint256 tempElapsedTime = rewardRateArray[i].updatedTime - tempLastRewardUpdateTime;\n                uint256 tempReward = calculateReward(\n                    currentStakedAmount,\n                    rewardRateArray[i - 1].rewardRate,\n                    tempElapsedTime\n                );\n                tempLastRewardUpdateTime = rewardRateArray[i].updatedTime;\n                unchecked{\n                    currentRewardAmount += tempReward;\n                }\n            }\n\n            // c. the reward generated by the latest reward rate\n            uint256 elapsedTime = block.timestamp - currentRewardRateState.updatedTime;\n            uint256 reward = calculateReward(\n                currentStakedAmount,\n                currentRewardRateState.rewardRate,\n                elapsedTime\n            );\n\n            return currentRewardAmount + reward;\n        }\n    }\n\n    // principal + rewards\n    function getClaimableAssets(address _user, address _token) external view returns (uint256) {\n        AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n        \n        return Utils.Add(assetsInfo.stakedAmount, _getClaimableRewards(_user, _token));\n    }\n\n    // current rewards\n    function getClaimableRewards(address _user, address _token) external view returns (uint256) {\n        return _getClaimableRewards(_user, _token);\n    }\n\n    // history rewards + current rewards\n    function getTotalRewards(address _user, address _token) external view returns (uint256) {\n        uint256 historyRewards = 0;\n        uint256 currentRewards = _getClaimableRewards(_user, _token);\n\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        for(uint256 i = 0; i < stakeInfo.claimHistory.length; i++) {\n            historyRewards += stakeInfo.claimHistory[i].rewardAmount;\n        }\n\n        return Utils.Add(historyRewards, currentRewards);\n    }\n\n    // Calculate the total withdrawable amount for a user at a future time, \n    // based on the user's current staked amount and the current reward rate.\n    function getClaimableRewardsWithTargetTime(\n        address _user,\n        address _token,\n        uint256 _targetTime\n    ) external view returns (uint256) {\n        require(_targetTime > block.timestamp, \"Invalid time\");\n\n        AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n        RewardRateState[] memory rewardRateArray = rewardRateState[_token];\n        RewardRateState memory currentRewardRateState = rewardRateArray[rewardRateArray.length - 1];\n\n        uint256 newAccumulatedReward = 0;\n        if(assetsInfo.lastRewardUpdateTime != 0) { // not the first time to stake\n            newAccumulatedReward = _getClaimableRewards(_user, _token);\n        }\n\n        uint256 elapsedTime = _targetTime - block.timestamp;\n        uint256 reward = calculateReward(\n            assetsInfo.stakedAmount,\n            currentRewardRateState.rewardRate,\n            elapsedTime\n        );\n\n        return Utils.Add(newAccumulatedReward, reward);\n    }\n\n    function getStakedAmount(address _user, address _token) public view onlySupportedToken(_token) returns (uint256) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        return stakeInfo.stakedAmount;\n    }\n\n    function getLPTokenAmount(address _user, address _token) public view onlySupportedToken(_token) returns (uint256) {\n        return supportedTokenToLPToken[_token].balanceOf(_user);\n    }\n\n    function getContractBalance(address _token) public view returns (uint256) {\n        Utils.CheckIsZeroAddress(_token);\n        return IERC20(_token).balanceOf(address(this));\n    }\n\n    function getStakeHistory(\n        address _user,\n        address _token,\n        uint256 _index\n    ) external view onlySupportedToken(_token) returns (StakeItem memory) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        require(_index < stakeInfo.stakeHistory.length, \"index\");\n\n        return stakeInfo.stakeHistory[_index];\n    }\n\n    function getClaimHistory(\n        address _user,\n        address _token,\n        uint256 _index\n    ) external view onlySupportedToken(_token) returns (ClaimItem memory) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n        require(_index < stakeInfo.claimHistory.length, \"index\");\n\n        return stakeInfo.claimHistory[_index];\n    }\n\n    function getStakeHistoryLength(address _user, address _token) external view returns (uint256) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n\n        return stakeInfo.stakeHistory.length;\n    }\n\n    function getClaimHistoryLength(address _user, address _token) public view returns (uint256) {\n        AssetsInfo memory stakeInfo = userAssetsInfo[_user][_token];\n\n        return stakeInfo.claimHistory.length;\n    }\n\n    // Check the current withdrawal request in progress for a specific user\n    function getClaimQueueIDs(address _user, address _token) external view returns (uint256[] memory) {\n        AssetsInfo memory assetsInfo = userAssetsInfo[_user][_token];\n        \n        return assetsInfo.pendingClaimQueueIDs;\n    }\n\n    // Measure the reward rate as a percentage, and return the numerator and denominator\n    function getCurrentRewardRate(address _token) external view returns (uint256, uint256) {\n        RewardRateState[] memory rewardRateStateArray = rewardRateState[_token];\n        RewardRateState memory currentRewardRateState = rewardRateStateArray[rewardRateStateArray.length - 1];\n\n        return (currentRewardRateState.rewardRate, BASE);\n    }\n\n    function getClaimQueueInfo(uint256 _index) external view returns (ClaimItem memory) {\n        return claimQueue[_index];\n    }\n\n    function getTVL(address _token) external view returns (uint256) {\n        return tvl[_token];\n    }\n\n    function isBlacklisted(address _address) public view returns (bool) {\n        return _blacklist[_address];\n    }\n\n    receive() external payable {\n        revert();\n    }\n}\n"},"contracts/utils/Utils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nlibrary Utils {\n    // Use this when we are certain that an overflow will not occur\n    function Add(uint _a, uint _b) internal pure returns (uint256 result) {\n        assembly {\n            result := add(_a, _b)\n        }\n    }\n\n    function CheckIsZeroAddress(address _address) internal pure returns (bool) {\n        assembly (\"memory-safe\") {\n            if iszero(_address) {\n                mstore(0x00, 0x20)\n                mstore(0x20, 0x0c)\n                mstore(0x40, 0x5a65726f20416464726573730000000000000000000000000000000000000000) // load hex of \"Zero Address\" to memory\n                revert(0x00, 0x60)\n            }\n        }\n        return true;\n    }\n\n    function MustGreaterThanZero(uint256 _value) internal pure returns (bool result) {\n        assembly {\n            // The 'iszero' opcode returns 1 if the input is zero, and 0 otherwise.\n            // So, 'iszero(iszero(_value))' returns 1 if value > 0, and 0 if value == 0.\n            result := iszero(iszero(_value))\n        }\n    }\n}\n"},"contracts/interfaces/IVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n// Main information: stake and claim\nstruct AssetsInfo {\n    uint256 stakedAmount;\n    uint256 accumulatedReward;\n    uint256 lastRewardUpdateTime;\n    uint256[] pendingClaimQueueIDs;\n    StakeItem[] stakeHistory;\n    ClaimItem[] claimHistory;\n}\n\nstruct StakeItem {\n    address token;\n    address user;\n    uint256 amount;\n    uint256 stakeTimestamp;\n}\n\nstruct ClaimItem {\n    bool isDone;\n    address token;\n    address user;\n    uint256 totalAmount;\n    uint256 principalAmount;\n    uint256 rewardAmount;\n    uint256 requestTime;\n    uint256 claimTime;\n}\n\ninterface IVault {\n    event Stake(address indexed _user, address indexed _token, uint256 indexed _amount);\n    event RequestClaim(address _user, address indexed _token, uint256 indexed _amount, uint256 _principalAmount, uint256 _rewardAmount, uint256 indexed _id);\n    event ClaimAssets(address indexed _user, address indexed _token, uint256 indexed _amount, uint256 _id);\n    event UpdateRewardRate(address _token, uint256 _oldRewardRate, uint256 _newRewardRate);\n    event UpdateCustodian(address _oldCustodian, address _newCustodian);\n    event UpdateStakeLimit(address indexed _token, uint256 _oldMinAmount, uint256 _oldMaxAmount, uint256 _newMinAmount, uint256 _newMaxAmount);\n    event CustodianReceive(address indexed _token, address _custodian, uint256 indexed _amount);\n    event AddSupportedToken(address indexed _token, uint256 _minAmount, uint256 _maxAmount);\n    event EmergencyWithdrawal(address indexed _token, address indexed _receiver);\n    event UpdateWaitingTime(uint256 _oldWaitingTime, uint256 _newWaitingTIme);\n    event LPTokenCreated(address indexed _token);\n    event FlashWithdraw(address indexed _user, address indexed _token, uint256 indexed _amount, uint256 _principalAmount, uint256 _rewardAmount, uint _fee);\n    event UpdatePenaltyRate(uint indexed oldRate, uint indexed newRate);\n    event CancelClaim(address indexed user, address indexed _token, uint256 indexed _amount, uint256 _id);\n\n    function stake(address _token, uint256 _stakedAmount) external;\n    function requestClaim(address _token, uint256 _amount) external returns(uint256);\n    function cancelClaim(uint _queueId, address _token) external;\n    function claim(uint256 _queueID, address token) external;\n    function flashWithdrawWithPenalty(address _token, uint256 _amount) external;\n\n    function transferToCustodian(address _token, uint256 _amount) external;\n    function emergencyWithdraw(address _token, address _receiver) external;\n\n    function addSupportedToken(address _token, uint256 _minAmount, uint256 _maxAmount, uint256 _rewardRate, address _lpToken) external;\n    function setRewardRate(address _token, uint256 _newRewardRate) external;\n    function setPenaltyRate(uint256 _newRate) external;\n    function setStakeLimit(address _token, uint256 _minAmount, uint256 _maxAmount) external;\n    function setCustodian(address _newCustodian) external;\n    function setWaitingTime(uint256 _newWaitingTIme) external;\n    function pause() external;\n    function unpause() external;\n\n    function convertToShares(uint tokenAmount, address _token) external view returns (uint256);\n    function convertToAssets(uint shares, address _token) external view returns (uint256);\n    function getClaimableRewardsWithTargetTime(address _user, address _token, uint256 _targetTime) external view returns (uint256);\n    function getClaimableAssets(address _user, address _token) external view returns (uint256);\n    function getClaimableRewards(address _user, address _token) external view returns (uint256);\n    function getTotalRewards(address _user, address _token) external view returns (uint256);\n    function getStakedAmount(address _user, address _token) external view returns (uint256);\n    function getContractBalance(address _token) external view returns (uint256);\n    function getStakeHistory(address _user, address _token, uint256 _index) external view returns (StakeItem memory);\n    function getClaimHistory(address _user, address _token, uint256 _index) external view returns (ClaimItem memory);\n    function getStakeHistoryLength(address _user, address _token) external view returns(uint256);\n    function getClaimHistoryLength(address _user, address _token) external view returns(uint256);\n    function getCurrentRewardRate(address _token) external view returns(uint256, uint256);\n    function getClaimQueueInfo(uint256 _index) external view returns(ClaimItem memory);\n    function getClaimQueueIDs(address _user, address _token) external view returns(uint256[] memory);\n    function getTVL(address _token) external view returns(uint256);\n    function getLPTokenAmount(address _user, address _token) external view returns(uint256);\n    function lastClaimQueueID() external view returns(uint256);\n}\n"},"contracts/interfaces/ILPToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface ILPToken is IERC20 {\n    function mint(address to, uint256 amount) external;\n    function burn(address from, uint256 amount) external;\n    function setMinter(address minter, address vault) external;\n    function updateAllowance(address from, address to, uint256 amount) external;\n}\n"},"contracts/interfaces/IWithdrawVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\ninterface IWithdrawVault {\n    function transfer(address, address, uint256) external;\n    function addSupportedToken(address) external;\n    function setVault(address) external;\n    function getSupportedTokens() external view returns (address[] memory);\n    function getBalance(address) external view returns (uint256);\n    function emergencyWithdraw(address, address, uint) external;\n    function transferToCustodian(address token, uint amount)external;\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n    bool private _paused;\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"@openzeppelin/contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {IERC165, ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n    struct RoleData {\n        mapping(address account => bool) hasRole;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 role => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n        return _roles[role].hasRole[account];\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n     * is missing `role`.\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert AccessControlUnauthorizedAccount(account, role);\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n        if (callerConfirmation != _msgSender()) {\n            revert AccessControlBadConfirmation();\n        }\n\n        _revokeRole(role, callerConfirmation);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (!hasRole(role, account)) {\n            _roles[role].hasRole[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (hasRole(role, account)) {\n            _roles[role].hasRole[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n"},"@openzeppelin/contracts/access/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n    /**\n     * @dev The `account` is missing a role.\n     */\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n    /**\n     * @dev The caller of a function is not the expected one.\n     *\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n     */\n    error AccessControlBadConfirmation();\n\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted to signal this.\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"language":"Solidity","settings":{"viaIR":true,"optimizer":{"runs":200,"enabled":true},"evmVersion":"prague"}},"stdJsonOutput":{"sources":{"contracts/Vault.sol":{"id":11},"contracts/utils/Utils.sol":{"id":15},"contracts/interfaces/IVault.sol":{"id":13},"contracts/interfaces/ILPToken.sol":{"id":12},"contracts/interfaces/IWithdrawVault.sol":{"id":14},"@openzeppelin/contracts/utils/Context.sol":{"id":7},"@openzeppelin/contracts/utils/Pausable.sol":{"id":8},"@openzeppelin/contracts/interfaces/IERC20.sol":{"id":4},"@openzeppelin/contracts/interfaces/IERC165.sol":{"id":3},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":5},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"id":2},"@openzeppelin/contracts/access/AccessControl.sol":{"id":0},"@openzeppelin/contracts/access/IAccessControl.sol":{"id":1},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"id":9},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":6},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":10}},"contracts":{"contracts/Vault.sol":{"Vault":{"abi":[{"type":"constructor","inputs":[{"name":"_tokens","type":"address[]","internalType":"address[]"},{"name":"_lpTokens","type":"address[]","internalType":"address[]"},{"name":"_newRewardRate","type":"uint256[]","internalType":"uint256[]"},{"name":"_minStakeAmount","type":"uint256[]","internalType":"uint256[]"},{"name":"_maxStakeAmount","type":"uint256[]","internalType":"uint256[]"},{"name":"_admin","type":"address","internalType":"address"},{"name":"_bot","type":"address","internalType":"address"},{"name":"_custodian","type":"address","internalType":"address"},{"name":"_waitingTime","type":"uint256","internalType":"uint256"},{"name":"withdrawVaultAddress","type":"address","internalType":"address payable"}],"stateMutability":"nonpayable"},{"name":"AccessControlBadConfirmation","type":"error","inputs":[]},{"name":"AccessControlUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"name":"EnforcedPause","type":"error","inputs":[]},{"name":"ExpectedPause","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"AddSupportedToken","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_minAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_maxAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BlacklistAdded","type":"event","inputs":[{"name":"_address","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"BlacklistRemoved","type":"event","inputs":[{"name":"_address","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"CancelClaim","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_id","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CancelStatusChanged","type":"event","inputs":[{"name":"oldStatus","type":"bool","indexed":true,"internalType":"bool"},{"name":"newStatus","type":"bool","indexed":true,"internalType":"bool"}],"anonymous":false},{"name":"ClaimAssets","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_id","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"CustodianReceive","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_custodian","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"EmergencyWithdrawal","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_receiver","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"FlashStatusChanged","type":"event","inputs":[{"name":"oldStatus","type":"bool","indexed":true,"internalType":"bool"},{"name":"newStatus","type":"bool","indexed":true,"internalType":"bool"}],"anonymous":false},{"name":"FlashWithdraw","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_principalAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_rewardAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"LPTokenCreated","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"RequestClaim","type":"event","inputs":[{"name":"_user","type":"address","indexed":false,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_principalAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_rewardAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_id","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"RoleAdminChanged","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"name":"RoleGranted","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RoleRevoked","type":"event","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Stake","type":"event","inputs":[{"name":"_user","type":"address","indexed":true,"internalType":"address"},{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"UpdateCustodian","type":"event","inputs":[{"name":"_oldCustodian","type":"address","indexed":false,"internalType":"address"},{"name":"_newCustodian","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"UpdatePenaltyRate","type":"event","inputs":[{"name":"oldRate","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newRate","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"UpdateRewardRate","type":"event","inputs":[{"name":"_token","type":"address","indexed":false,"internalType":"address"},{"name":"_oldRewardRate","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newRewardRate","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UpdateStakeLimit","type":"event","inputs":[{"name":"_token","type":"address","indexed":true,"internalType":"address"},{"name":"_oldMinAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_oldMaxAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newMinAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newMaxAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UpdateWaitingTime","type":"event","inputs":[{"name":"_oldWaitingTime","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_newWaitingTIme","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DEFAULT_ADMIN_ROLE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"WAITING_TIME","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"addSupportedToken","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_minAmount","type":"uint256","internalType":"uint256"},{"name":"_maxAmount","type":"uint256","internalType":"uint256"},{"name":"_rewardRate","type":"uint256","internalType":"uint256"},{"name":"_lpToken","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"addToBlacklist","type":"function","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"cancelClaim","type":"function","inputs":[{"name":"_queueId","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"claim","type":"function","inputs":[{"name":"_queueID","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"convertToAssets","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"tokenAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"convertToShares","type":"function","inputs":[{"name":"tokenAmount","type":"uint256","internalType":"uint256"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"emergencyWithdraw","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_receiver","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"flashWithdrawWithPenalty","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"getClaimHistory","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"},{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"isDone","type":"bool","internalType":"bool"},{"name":"token","type":"address","internalType":"address"},{"name":"user","type":"address","internalType":"address"},{"name":"totalAmount","type":"uint256","internalType":"uint256"},{"name":"principalAmount","type":"uint256","internalType":"uint256"},{"name":"rewardAmount","type":"uint256","internalType":"uint256"},{"name":"requestTime","type":"uint256","internalType":"uint256"},{"name":"claimTime","type":"uint256","internalType":"uint256"}],"internalType":"struct ClaimItem"}],"stateMutability":"view"},{"name":"getClaimHistoryLength","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getClaimQueueIDs","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"name":"getClaimQueueInfo","type":"function","inputs":[{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"isDone","type":"bool","internalType":"bool"},{"name":"token","type":"address","internalType":"address"},{"name":"user","type":"address","internalType":"address"},{"name":"totalAmount","type":"uint256","internalType":"uint256"},{"name":"principalAmount","type":"uint256","internalType":"uint256"},{"name":"rewardAmount","type":"uint256","internalType":"uint256"},{"name":"requestTime","type":"uint256","internalType":"uint256"},{"name":"claimTime","type":"uint256","internalType":"uint256"}],"internalType":"struct ClaimItem"}],"stateMutability":"view"},{"name":"getClaimableAssets","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getClaimableRewards","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getClaimableRewardsWithTargetTime","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"},{"name":"_targetTime","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getContractBalance","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getCurrentRewardRate","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getLPTokenAmount","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getRoleAdmin","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"getStakeHistory","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"},{"name":"_index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"token","type":"address","internalType":"address"},{"name":"user","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"stakeTimestamp","type":"uint256","internalType":"uint256"}],"internalType":"struct StakeItem"}],"stateMutability":"view"},{"name":"getStakeHistoryLength","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getStakedAmount","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTVL","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTotalRewards","type":"function","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"grantRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"hasRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isBlacklisted","type":"function","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"lastClaimQueueID","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"lpTokenToSupportedToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"maxStakeAmount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"minStakeAmount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"removeFromBlacklist","type":"function","inputs":[{"name":"_address","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"requestClaim","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"_returnID","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"revokeRole","type":"function","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setCancelEnable","type":"function","inputs":[{"name":"_enable","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setCustodian","type":"function","inputs":[{"name":"_newCustodian","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFlashEnable","type":"function","inputs":[{"name":"_enable","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPenaltyRate","type":"function","inputs":[{"name":"newRate","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setRewardRate","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_newRewardRate","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setStakeLimit","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_minAmount","type":"uint256","internalType":"uint256"},{"name":"_maxAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setWaitingTime","type":"function","inputs":[{"name":"_newWaitingTime","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stake","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_stakedAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportedTokenToLPToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"contract ILPToken"}],"stateMutability":"view"},{"name":"supportedTokens","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"totalRewardsAmountByToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalStakeAmountByToken","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferOrTransferFrom","type":"function","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferToCustodian","type":"function","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_tokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_lpTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_newRewardRate\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_minStakeAmount\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_maxStakeAmount\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bot\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_custodian\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_waitingTime\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"withdrawVaultAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_maxAmount\",\"type\":\"uint256\"}],\"name\":\"AddSupportedToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"BlacklistAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"BlacklistRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"CancelClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"oldStatus\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"newStatus\",\"type\":\"bool\"}],\"name\":\"CancelStatusChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"ClaimAssets\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_custodian\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"CustodianReceive\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"EmergencyWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"oldStatus\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"newStatus\",\"type\":\"bool\"}],\"name\":\"FlashStatusChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_principalAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_rewardAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"FlashWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"LPTokenCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_principalAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_rewardAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"RequestClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Stake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_oldCustodian\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newCustodian\",\"type\":\"address\"}],\"name\":\"UpdateCustodian\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldRate\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newRate\",\"type\":\"uint256\"}],\"name\":\"UpdatePenaltyRate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldRewardRate\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newRewardRate\",\"type\":\"uint256\"}],\"name\":\"UpdateRewardRate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMinAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMinAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxAmount\",\"type\":\"uint256\"}],\"name\":\"UpdateStakeLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldWaitingTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newWaitingTIme\",\"type\":\"uint256\"}],\"name\":\"UpdateWaitingTime\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WAITING_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rewardRate\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_lpToken\",\"type\":\"address\"}],\"name\":\"addSupportedToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"addToBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"cancelClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"convertToAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"convertToShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"emergencyWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"flashWithdrawWithPenalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getClaimHistory\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isDone\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"principalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimTime\",\"type\":\"uint256\"}],\"internalType\":\"struct ClaimItem\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getClaimHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getClaimQueueIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getClaimQueueInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isDone\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"principalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimTime\",\"type\":\"uint256\"}],\"internalType\":\"struct ClaimItem\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getClaimableAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getClaimableRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_targetTime\",\"type\":\"uint256\"}],\"name\":\"getClaimableRewardsWithTargetTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getContractBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getCurrentRewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getLPTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getStakeHistory\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct StakeItem\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getStakeHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getStakedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getTVL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getTotalRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastClaimQueueID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lpTokenToSupportedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"maxStakeAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"minStakeAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"removeFromBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"requestClaim\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_returnID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_enable\",\"type\":\"bool\"}],\"name\":\"setCancelEnable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newCustodian\",\"type\":\"address\"}],\"name\":\"setCustodian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_enable\",\"type\":\"bool\"}],\"name\":\"setFlashEnable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newRate\",\"type\":\"uint256\"}],\"name\":\"setPenaltyRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_newRewardRate\",\"type\":\"uint256\"}],\"name\":\"setRewardRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxAmount\",\"type\":\"uint256\"}],\"name\":\"setStakeLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWaitingTime\",\"type\":\"uint256\"}],\"name\":\"setWaitingTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stakedAmount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"supportedTokenToLPToken\",\"outputs\":[{\"internalType\":\"contract ILPToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"supportedTokens\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"totalRewardsAmountByToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"totalStakeAmountByToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferOrTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferToCustodian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"events\":{\"FlashStatusChanged(bool,bool)\":{\"notice\":\"Controller                                              ///\"}},\"kind\":\"user\",\"methods\":{\"addSupportedToken(address,uint256,uint256,uint256,address)\":{\"notice\":\"configuration                                              ///\"},\"emergencyWithdraw(address,address)\":{\"notice\":\"emergency                                                ///\"},\"stake(address,uint256)\":{\"notice\":\"write                                                 ///\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Vault.sol\":\"Vault\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"@openzeppelin/contracts/utils/Pausable.sol\":{\"keccak256\":\"0xdb484371dfbb848cb6f5d70464e9ac9b2900e4164ead76bbce4fef0b44bcc68f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f9d6f6f6600a2bec622f699081b58350873b5e63ce05464d17d674a290bb8a7c\",\"dweb:/ipfs/QmQKVzSQY1PM3Bid4QhgVVZyx6B4Jx7XgaQzLKHj38vJz8\"]},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"contracts/Vault.sol\":{\"keccak256\":\"0x0861a5ab2aa2c09e17e74d1d73966499b9f8618de2542d469342e0dfbc707568\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f72459b2e7d4908710531dac390a44185004405d2de569ccc2f690d3338089\",\"dweb:/ipfs/Qmc9kvBSjqhFywkrGuorVMwx7nDHF7PvhR876T8tiCtMcX\"]},\"contracts/interfaces/ILPToken.sol\":{\"keccak256\":\"0x190d0ba1e708efbe300096f40617c1e41b3f6137e450e96cf42f659823934032\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebc7dbf9c6ab46928de1d4d31f349bcfb9ec2939ae8839c3b9f1292d9b4fae57\",\"dweb:/ipfs/QmTQJhvr1A4RUMtrT7Bi8UqqEKyPSUrUfhztk5fuWUBX9p\"]},\"contracts/interfaces/IVault.sol\":{\"keccak256\":\"0x414577334b7cfb92a8f4dbf00611a28fdda351e1aa13be6027e47d04c7594935\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://303ceb88475a2794b5c2af0266a64223a1257d8245a6148cfce4af4506e7052c\",\"dweb:/ipfs/QmXCvLGanjd64DrZsFHjPft4mZ4MqbEHrfA5RweforarWh\"]},\"contracts/interfaces/IWithdrawVault.sol\":{\"keccak256\":\"0xc2e8074540ec80e7a1461f01d114082e1e06239f4db32c264cd694984dffccf2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4da920997c6efa4e93ab26ba4666bd36a563f9f51f5217600a5a3ca974154256\",\"dweb:/ipfs/Qmc4vP9tG5f5Yf2bjdmeun7AHhqm21Eg3NXfBu8VNgQVRF\"]},\"contracts/utils/Utils.sol\":{\"keccak256\":\"0xbf624bc5e501d01857c18c2d39773d64765aa5ab08f3a8d0822d119828f2e2c8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebe079c638cba2379280b0e3555f2b150f5a1a5263f405c9e232c3c0d700810b\",\"dweb:/ipfs/QmNkFadzVwA3gpMgUTc57Y7eGDeCpAoTgLM6tvWPyLFh59\"]}},\"version\":1}","userdoc":{"kind":"user","events":{"FlashStatusChanged(bool,bool)":{"notice":"Controller                                              ///"}},"methods":{"stake(address,uint256)":{"notice":"write                                                 ///"},"emergencyWithdraw(address,address)":{"notice":"emergency                                                ///"},"addSupportedToken(address,uint256,uint256,uint256,address)":{"notice":"configuration                                              ///"}},"version":1},"devdoc":{"kind":"dev","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"AccessControlBadConfirmation()":[{"details":"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"AccessControlUnauthorizedAccount(address,bytes32)":[{"details":"The `account` is missing a role."}]},"events":{"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"RoleGranted(bytes32,address,address)":{"details":"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}."},"RoleRevoked(bytes32,address,address)":{"details":"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"},"RoleAdminChanged(bytes32,bytes32,bytes32)":{"details":"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this."}},"methods":{"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(ILPToken)4530":{"label":"contract ILPToken","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_struct(RoleData)22_storage":{"label":"struct AccessControl.RoleData","members":[{"slot":"0","type":"t_mapping(t_address,t_bool)","astId":19,"label":"hasRole","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_bytes32","astId":21,"label":"adminRole","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"64"},"t_array(t_uint256)dyn_storage":{"base":"t_uint256","label":"uint256[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_contract(IWithdrawVault)5011":{"label":"contract IWithdrawVault","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_address)":{"key":"t_address","label":"mapping(address => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(ClaimItem)4576_storage":{"label":"struct ClaimItem","members":[{"slot":"0","type":"t_bool","astId":4561,"label":"isDone","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"0","type":"t_address","astId":4563,"label":"token","offset":1,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_address","astId":4565,"label":"user","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":4567,"label":"totalAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_uint256","astId":4569,"label":"principalAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"4","type":"t_uint256","astId":4571,"label":"rewardAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"5","type":"t_uint256","astId":4573,"label":"requestTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"6","type":"t_uint256","astId":4575,"label":"claimTime","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"224"},"t_struct(StakeItem)4559_storage":{"label":"struct StakeItem","members":[{"slot":"0","type":"t_address","astId":4552,"label":"token","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_address","astId":4554,"label":"user","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":4556,"label":"amount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_uint256","astId":4558,"label":"stakeTimestamp","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"128"},"t_struct(AssetsInfo)4550_storage":{"label":"struct AssetsInfo","members":[{"slot":"0","type":"t_uint256","astId":4534,"label":"stakedAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_uint256","astId":4536,"label":"accumulatedReward","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":4538,"label":"lastRewardUpdateTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_array(t_uint256)dyn_storage","astId":4541,"label":"pendingClaimQueueIDs","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"4","type":"t_array(t_struct(StakeItem)4559_storage)dyn_storage","astId":4545,"label":"stakeHistory","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"5","type":"t_array(t_struct(ClaimItem)4576_storage)dyn_storage","astId":4549,"label":"claimHistory","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"192"},"t_struct(RewardRateState)1250_storage":{"label":"struct Vault.RewardRateState","members":[{"slot":"0","type":"t_address","astId":1245,"label":"token","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_uint256","astId":1247,"label":"rewardRate","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_uint256","astId":1249,"label":"updatedTime","offset":0,"contract":"contracts/Vault.sol:Vault"}],"encoding":"inplace","numberOfBytes":"96"},"t_mapping(t_address,t_contract(ILPToken)4530)":{"key":"t_address","label":"mapping(address => contract ILPToken)","value":"t_contract(ILPToken)4530","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_struct(RoleData)22_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => struct AccessControl.RoleData)","value":"t_struct(RoleData)22_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(ClaimItem)4576_storage)dyn_storage":{"base":"t_struct(ClaimItem)4576_storage","label":"struct ClaimItem[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_array(t_struct(StakeItem)4559_storage)dyn_storage":{"base":"t_struct(StakeItem)4559_storage","label":"struct StakeItem[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(ClaimItem)4576_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct ClaimItem)","value":"t_struct(ClaimItem)4576_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_struct(AssetsInfo)4550_storage)":{"key":"t_address","label":"mapping(address => struct AssetsInfo)","value":"t_struct(AssetsInfo)4550_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(RewardRateState)1250_storage)dyn_storage":{"base":"t_struct(RewardRateState)1250_storage","label":"struct Vault.RewardRateState[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_struct(AssetsInfo)4550_storage))":{"key":"t_address","label":"mapping(address => mapping(address => struct AssetsInfo))","value":"t_mapping(t_address,t_struct(AssetsInfo)4550_storage)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_array(t_struct(RewardRateState)1250_storage)dyn_storage)":{"key":"t_address","label":"mapping(address => struct Vault.RewardRateState[])","value":"t_array(t_struct(RewardRateState)1250_storage)dyn_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_bool","astId":1050,"label":"_paused","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"1","type":"t_mapping(t_bytes32,t_struct(RoleData)22_storage)","astId":27,"label":"_roles","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"2","type":"t_mapping(t_address,t_uint256)","astId":1215,"label":"tvl","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"3","type":"t_mapping(t_address,t_bool)","astId":1219,"label":"supportedTokens","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"4","type":"t_mapping(t_address,t_contract(ILPToken)4530)","astId":1224,"label":"supportedTokenToLPToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"5","type":"t_mapping(t_address,t_address)","astId":1228,"label":"lpTokenToSupportedToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"6","type":"t_uint256","astId":1231,"label":"lastClaimQueueID","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"7","type":"t_mapping(t_uint256,t_struct(ClaimItem)4576_storage)","astId":1236,"label":"claimQueue","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"8","type":"t_mapping(t_address,t_mapping(t_address,t_struct(AssetsInfo)4550_storage))","astId":1243,"label":"userAssetsInfo","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"9","type":"t_mapping(t_address,t_array(t_struct(RewardRateState)1250_storage)dyn_storage)","astId":1256,"label":"rewardRateState","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"10","type":"t_mapping(t_address,t_bool)","astId":1270,"label":"_blacklist","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"11","type":"t_address","astId":1272,"label":"custodian","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"12","type":"t_uint256","astId":1275,"label":"penaltyRate","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"13","type":"t_mapping(t_address,t_uint256)","astId":1279,"label":"minStakeAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"14","type":"t_mapping(t_address,t_uint256)","astId":1283,"label":"maxStakeAmount","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"15","type":"t_uint256","astId":1285,"label":"WAITING_TIME","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"16","type":"t_mapping(t_address,t_uint256)","astId":1292,"label":"totalStakeAmountByToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"17","type":"t_mapping(t_address,t_uint256)","astId":1296,"label":"_lastRewardUpdatedTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"18","type":"t_mapping(t_address,t_uint256)","astId":1300,"label":"totalRewardsAmountByToken","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"19","type":"t_uint256","astId":1302,"label":"initialTime","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"20","type":"t_contract(IWithdrawVault)5011","astId":1305,"label":"withdrawVault","offset":0,"contract":"contracts/Vault.sol:Vault"},{"slot":"20","type":"t_bool","astId":1308,"label":"flashNotEnable","offset":20,"contract":"contracts/Vault.sol:Vault"},{"slot":"20","type":"t_bool","astId":1311,"label":"cancelNotEnable","offset":21,"contract":"contracts/Vault.sol:Vault"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"6080604052346104e957615385803803806100198161050b565b9283398101610140828203126104e95781516001600160401b0381116104e9578161004591840161055b565b60208301519091906001600160401b0381116104e9578161006791850161055b565b60408401519092906001600160401b0381116104e957826100899186016105bb565b60608501519093906001600160401b0381116104e957836100ab9187016105bb565b608086015190936001600160401b0382116104e9576100cb9187016105bb565b926100d860a08701610547565b936100e560c08801610547565b6100f160e08901610547565b610100890151610120909901516001600160a01b03811699908a90036104e9576127106006556032600c556014805461ffff60a01b191661010160a01b17905561013a82610622565b5061014488610622565b5061014e83610622565b5086519788156104e9578951891480610501575b806104f7575b806104ed575b156104e957604080936101d67fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd39969229966101d0856101ca7f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9761064d565b506106c3565b50610756565b50600b80546001600160a01b0319166001600160a01b0392909216918217905581515f81526020810191909152a180600f558151905f82526020820152a1426013555f5b85811061028f57601480546001600160a01b031916891790555f5460ff81166102805760019060ff1916175f557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1604051614b1b90816107ea8239f35b63d93c066560e01b5f5260045ffd5b610299818461060e565b516102a4828461060e565b5111156104e9576001600160a01b036102bd828761060e565b5116906102ca818561060e565b51825f52600d60205260405f20556102e2818461060e565b51825f52600e60205260405f2055815f52600360205260405f20600160ff19825416179055817fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd6040610335848861060e565b51610340858861060e565b5182519182526020820152a26001600160a01b0361035e828761060e565b5116825f52600460205260405f2060018060a01b03821660018060a01b0319825416179055805f52600560205260405f2060018060a01b03841660018060a01b03198254161790557fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f35f80a26103d4818961060e565b51604051909290606081016001600160401b038111828210176104d5576040528181526020810193845260408101428152825f52600960205260405f2090815495680100000000000000008710156104d557600187018084558710156104c1576001966002935f52600360205f2091020193878060a01b0390888060a01b0390511616878060a01b03198554161784555186840155519101557f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de606061049a848c61060e565b51604051908482525f60208301526040820152a15f5260116020524260405f20550161021a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b508651891461016e565b5084518914610168565b5085518914610162565b6040519190601f01601f191682016001600160401b038111838210176104d557604052565b6001600160401b0381116104d55760051b60200190565b51906001600160a01b03821682036104e957565b9080601f830112156104e957815161057a61057582610530565b61050b565b9260208085848152019260051b8201019283116104e957602001905b8282106105a35750505090565b602080916105b084610547565b815201910190610596565b9080601f830112156104e95781516105d561057582610530565b9260208085848152019260051b8201019283116104e957602001905b8282106105fe5750505090565b81518152602091820191016105f1565b80518210156104c15760209160051b010190565b1561062c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b6001600160a01b0381165f9081525f5160206153255f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153255f395f51905f5260205260408120805460ff191660011790553391905f5160206153055f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206153655f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153655f395f51905f5260205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a905f5160206153055f395f51905f529080a4600190565b6001600160a01b0381165f9081525f5160206153455f395f51905f52602052604090205460ff166106be576001600160a01b03165f8181525f5160206153455f395f51905f5260205260408120805460ff191660011790553391907f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b905f5160206153055f395f51905f529080a460019056fe60806040526004361015610012575b5f80fd5b5f5f3560e01c806301e51e971461386257806301ffc9a71461380b57806304d3a96d146133c35780630db14e95146132305780630f40517a146131f75780631a9be40a146130465780632169678314612dc5578063248a9ca314612d99578063251d6ec314612d605780632647d92914612d335780632d4abd2d14612bc35780632f2ff15d14612b8457806332cf58c414612a0d57806336103291146128e657806336568abe146128a157806339de62a6146128245780633a33a4f8146126785780633f4ba83a14612612578063403f37311461257d57806343ab265f1461255957806344337ea1146124a157806348d832cb146123ca5780634d2b1444146123ac5780634f8fe1f11461232f578063537df3b61461227d5780635c975abb1461225b5780635f2567571461221a5780636382d9ad1461213357806366fd9d6514611ca657806368c4ac2614611c675780636c0a188e14611c495780637c395b1314611aae578063812a71d5146118bb5780638456cb591461186257806391d148541461181857806395d322b0146117df5780639ed9e4831461166f578063a1bab44714611603578063a217fddf146115e7578063abd42922146115a3578063adc9772e146112f8578063cb0b8fe5146112bf578063d295fa9a1461117b578063d40549c01461113a578063d547741f146110f2578063da57c7d714610f0a578063ddd5e1b214610c80578063e30227ea14610ba1578063e315d80414610b68578063e8690bc2146108b1578063ebc73e6514610850578063f56f4f0f1461081b578063f7192ba8146104a0578063f92396a6146102b95763fe575a8714610278575f80fd5b346102b65760203660031901126102b65760209060ff906040906001600160a01b036102a2613c87565b168152600a84522054166040519015158152f35b80fd5b50346102b65760403660031901126102b6576102d3613c87565b6001600160a01b03168082526003602052604082205460243591906102fa9060ff16613d52565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b8352600160209081526040808520335f908152925290205460ff1615610469578115610439576040516370a0823160e01b8152306004820152602081602481855afa90811561042e5784916103fc575b5082116103c257600b5461038a9083906001600160a01b0316836144d1565b7f9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85602060018060a01b03600b5416604051908152a380f35b60405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b90506020813d602011610426575b8161041760209383613ea4565b8101031261000e57515f61036b565b3d915061040a565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152600860248201526706d757374203e20360c41b6044820152606490fd5b63e2517d3f60e01b8352336004527f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b602452604483fd5b50346102b65760403660031901126102b6576004356104bd613c9d565b906104c661435d565b338352600a6020526104df60ff60408520541615613d92565b60ff60145460a81c166107d657808352600760205261050060408420613fe6565b818452600760205283600660408220828155826001820155826002820155826003820155826004820155826005820155015560018060a01b036020820151169033855260086020526040852060018060a01b0383165f5260205260405f2033865260086020526040862060018060a01b0384165f52602052610587600360405f2001613f84565b946060830151156107d2576040830151336001600160a01b03909116036107d2576105b38351156142b2565b6001600160a01b038116936105c99085146142e8565b865b86518110156107c357856105df8289614051565b51146105ed576001016105cb565b9091929394958051905f1982019182116107af579161063d610616610642936106809695614051565b51610625600388019384613dcc565b90919082549060031b91821b915f19901b1916179055565b614322565b60a0608085015194015192610658858254614065565b815560018101610669858254614065565b905560024291015561067b8133614377565b6143f5565b61068a8284614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561079b5786916106b691613e15565b8482526010602052604082206106cd858254614065565b90558482526012602052604082206106e6848254614065565b9055848252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c57610773575b505061074391614065565b916040519081527f16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b1860203392a480f35b8161077d91613ea4565b61078857845f610738565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b89526011600452602489fd5b50610680919293949550610642565b8680fd5b60405162461bcd60e51b815260206004820152601860248201527f63616e63656c20636c61696d206e6f7420656e61626c656400000000000000006044820152606490fd5b50346102b65760403660031901126102b657602061084861083a613c87565b610842613c9d565b90614512565b604051908152f35b50346102b65760203660031901126102b65760043561086d61485a565b7fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd399692296040600f5461089f8185141561427c565b8151908152836020820152a1600f5580f35b50346102b65760a03660031901126102b6576108cb613c87565b60243590604435906084356001600160a01b0381169160643591839003610b64576108f461485a565b6108fd81614a62565b506001600160a01b03168086526003602052604086205490929060ff16610b3357612710821080610b2a575b15610aef57828652600360205260408620805460ff19166001179055859061094f61485a565b838252600360205261096760ff604084205416613d52565b85151580610ae6575b15610ae257837fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd60407f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de98606098847fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260808983610acd9b52600d602052868082205491858152600e6020522054875191825260208201528587820152848e820152a2848c52600d60205281838d2055848c52600e60205280838d205582519182526020820152a283875260046020526040872060018060a01b0382166001600160601b0360a01b825416179055808752600560205260408720846001600160601b0360a01b825416179055604051907fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f38880a2610aad81613e88565b838152826020820152426040820152838752600960205260408720614219565b6040519182528460208301526040820152a180f35b5080fd5b50848610610970565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c696420726577617264207261746560681b6044820152606490fd5b50811515610929565b60405162461bcd60e51b815260206004820152600960248201526814dd5c1c1bdc9d195960ba1b6044820152606490fd5b8580fd5b50346102b65760203660031901126102b6576020906040906001600160a01b03610b90613c87565b168152601283522054604051908152f35b50346102b65760203660031901126102b6576001600160a01b03610bc3613c87565b1681526009602052604081208054610bda81613fce565b91610be86040519384613ea4565b81835283526020808420849184015b838310610c425785858051915f198301928311610c2e5760406020610c1c8585614051565b51015181519081526127106020820152f35b634e487b7160e01b81526011600452602490fd5b60036020600192604051610c5581613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190610bf7565b50346102b65760403660031901126102b657600435610c9d613c9d565b90610ca661435d565b338352600a602052610cbf60ff60408520541615613d92565b8083526007602052610cd360408420613fe6565b60208181015133808752600880845260408089206001600160a01b039094165f818152948652818520938a52918552808920828552909452929091209094919290610d2090600301613f84565b946060820192835115610f065760e08301514210610f06576040830151336001600160a01b0390911603610f0657610d6d90610d5d8451156142b2565b6001600160a01b031685146142e8565b848752600760205260408720805460ff19166001179055865b8651811015610ef55785610d9a8289614051565b5114610da857600101610d86565b9091929394958051905f1982019182116107af5760059261063d610dd4610e50979694610de394614051565b51610625600386019384613dcc565b60808301928351878a526002602052610e0160408b20918254613df5565b9055855193519060c060a08201519101519160405195610e2087613e33565b600187528960208801523360408801526060870152608086015260a085015260c08401524260e084015201613ec6565b601454815185916001600160a01b0316803b15610797576040516317d5759960e31b81526001600160a01b0386166004820152336024820152604481019290925282908290606490829084905af1801561078c57610edc575b505051916040519081527fdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd60203392a480f35b81610ee691613ea4565b610ef157835f610ea9565b8380fd5b50610e509293949550600590610de3565b8780fd5b50346102b657610f1936613cb3565b91836060604051610f2981613e6c565b828152826020820152826040820152015260018060a01b03821684526003602052610f5a60ff604086205416613d52565b60018060a01b031683526008602052604083209060018060a01b03165f5260205260405f20604051610f8b81613e50565b815481526001820154602082015260028201546040820152610faf60038301613f84565b606082015260048201918254610fc481613fce565b93610fd26040519586613ea4565b81855286526020808720879186015b83831061109d5750505050600590608083019384520190815461100381613fce565b926110116040519485613ea4565b81845286526020808720969084015b82821061107f57608061104788888860a089015261104181515183106141e5565b51614051565b5160606040519160018060a01b03815116835260018060a01b0360208201511660208401526040810151604084015201516060820152f35b6007602060019261108f8b613fe6565b815201980191019096611020565b6004602060019260409b989b516110b381613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190979497610fe1565b50346102b65760403660031901126102b657611136600435611112613c9d565b9061113161112c825f526001602052600160405f20015490565b614918565b6149de565b5080f35b50346102b65760203660031901126102b6576020906001600160a01b0361115f613c87565b16815260048252604060018060a01b0391205416604051908152f35b50346102b65760403660031901126102b657600435600461119a613c9d565b6001600160a01b03818116808652602084815260408088205490516318160ddd60e01b81529592939192869290918391165afa9283156112b4578593611280575b50845260106020526111f260408520549130614512565b8261123257505050670de0b6b3a7640000915b670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e5760206108488484613e15565b61123b91614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561126c579061126691613e15565b91611205565b634e487b7160e01b84526011600452602484fd5b9092506020813d6020116112ac575b8161129c60209383613ea4565b8101031261000e5751915f6111db565b3d915061128f565b6040513d87823e3d90fd5b50346102b65760203660031901126102b6576020906040906001600160a01b036112e7613c87565b168152601083522054604051908152f35b50346102b65760403660031901126102b657611312613c87565b6001600160a01b03811680835260036020526040832054602435929061133a9060ff16613d52565b61134261435d565b338452600a60205261135b60ff60408620541615613d92565b338452600860205260408420825f5260205260405f209083825401838652600d60205260408620548110610b6457838652600e602052604086205410610788576040516323b872dd60e01b6020820152336024820152306044820152606480820186905281526113e591906113db906113d5608482613ea4565b85614a8d565b61067b8133614377565b8285526010602052604085206113fc858254614065565b9055670de0b6b3a76400008402848104670de0b6b3a7640000148515171561158f57859161142991613e15565b838252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c5761157a575b50506040516004820161148b82613e6c565b8382526020820133815260408301908682526060840192428452805490600160401b82101561156657600182018082558210156115525789526020808a209551600292831b90960180546001600160a01b039788166001600160a01b03199182161782559351600182018054919098169416939093179095559151818301559151600390920191909155825485019092558285525260408320805483019055337f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f78480a480f35b634e487b7160e01b8a52603260045260248afd5b634e487b7160e01b8a52604160045260248afd5b8161158491613ea4565b610ef157835f611479565b634e487b7160e01b86526011600452602486fd5b50346102b65760203660031901126102b6576115d760406115e3926115c66141a9565b506004358152600760205220613fe6565b60405191829182613ced565b0390f35b50346102b657806003193601126102b657602090604051908152f35b50346102b65760203660031901126102b65760043561162061485a565b61271081111580611663575b6116359061427c565b80600c547f2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e108480a3600c5580f35b50600c5481141561162c565b50346102b65760403660031901126102b657611689613c87565b611691613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20604051916116c483613e50565b8154835260018201546020840152600282015460408401526116e860038301613f84565b6060840152600482019182546116fd81613fce565b9361170b6040519586613ea4565b81855283526020808420849186015b83831061179057505050506080840192835260050180549061173b82613fce565b926117496040519485613ea4565b82845290815260208082209084015b838310611772576020868660a08a01525151604051908152f35b6007602060019261178285613fe6565b815201920192019190611758565b600460206001926040516117a381613e6c565b848060a01b038654168152848060a01b03858701541683820152600286015460408201526003860154606082015281520192019201919061171a565b50346102b65760203660031901126102b6576020906040906001600160a01b03611807613c87565b168152600d83522054604051908152f35b50346102b65760403660031901126102b6576040611834613c9d565b9160043581526001602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102b657806003193601126102b65761187b6148a9565b61188361435d565b600160ff198254161781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346102b65760403660031901126102b6576118d5613c87565b6001600160a01b0381168083526003602052604083205460243592906118fd9060ff16613d52565b61190561485a565b612710831015611a7a57818452600960205260408420805461192681613fce565b916119346040519384613ea4565b81835286526020808720879184015b838310611a3c57505050508051905f19820191821161158f5760209161196891614051565b510151918383141580611a33575b156119fb577f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de936119d06119f592604051906119b182613e88565b8082528360208301524260408301528852600960205260408820614219565b60405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a180f35b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964206e6577207261746560801b6044820152606490fd5b50831515611976565b60036020600192604051611a4f81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190611943565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b6044820152606490fd5b50346102b657611abd36613cb3565b9291611ac76141a9565b506001600160a01b038216835260036020526040832054611aea9060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f2060405190611b1c82613e50565b805482526001810154602083015260028101546040830152611b4060038201613f84565b6060830152600481018054611b5481613fce565b91611b626040519384613ea4565b81835285526020808620869184015b838310611bfa57505050506080830152600501805490611b9082613fce565b93611b9e6040519586613ea4565b82855290815260208082209085015b838310611bdc576115e3611bcf888861104160a08a01918083525183106141e5565b5160405191829182613ced565b60076020600192611bec85613fe6565b815201920192019190611bad565b60046020600192604051611c0d81613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190611b71565b50346102b657806003193601126102b6576020600654604051908152f35b50346102b65760203660031901126102b65760209060ff906040906001600160a01b03611c92613c87565b168152600384522054166040519015158152f35b50346102b65760803660031901126102b657611cc0613c87565b611cc8613c9d565b6044356001600160a01b03811691908281036107885760643590338652600a602052611cfb60ff60408820541615613d92565b6001600160a01b038316808752600a6020526040872054909190611d229060ff1615613d92565b848752600a602052611d3b60ff60408920541615613d92565b8482146120ee5782156120a957611d528685614072565b9383851061207a57338314612029576001600160a01b03878116808a52600460208181526040808d20549051636eb1769f60e11b81528686169381019390935233602484015292939192909183916044918391165afa801561201e5786918b91611fe9575b5010611fb8578089526004602052604089205489906001600160a01b0316803b15610ae257604051630f75ba2160e41b81526001600160a01b0385166004820152336024820152604481018890529082908290606490829084905af1801561078c57611f9f575b5052600460208181526040808b205490516323b872dd60e01b81526001600160a01b03858116948201949094528584166024820152604481018890529492859116818c81606481015b03925af1928315611f9457888093611e8892611e8d96611f65575b50614377565b614377565b855260086020526040852060018060a01b0385165f5260205260405f2091825491600184019586549588526008602052604088209060018060a01b03165f5260205260405f2096670de0b6b3a76400008202918204670de0b6b3a764000003610c2e5750611f22611f52959493670de0b6b3a7640000611f1b611f14611f38968396613e15565b8093613e02565b0495613e02565b0492611f2f818854614065565b87558254613df5565b905560018401611f49828254614065565b90558254613df5565b9055600242910155602060405160018152f35b611f869060203d602011611f8d575b611f7e8183613ea4565b810190614191565b505f611e82565b503d611f74565b6040513d8b823e3d90fd5b81611fa991613ea4565b611fb457885f611e1e565b8880fd5b60405162461bcd60e51b8152602060048201526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b9150506020813d602011612016575b8161200560209383613ea4565b8101031261000e578590515f611db7565b3d9150611ff8565b6040513d8c823e3d90fd5b6001600160a01b038781168952600460208181526040808c205490516323b872dd60e01b815233938101939093528584166024840152604483018890529194929091859116818c8160648101611e67565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f66726f6d2063616e206e6f742062652073616d652061732074686520746f00006044820152606490fd5b50346102b65760403660031901126102b65761214d613c87565b612155613c9d565b9061215e61485a565b61216781614a62565b5061217182614a62565b506040516370a0823160e01b81523060048201526001600160a01b03919091169190602081602481865afa801561042e5784906121e6575b6121b5915082846144d1565b6001600160a01b0316907ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f8380a380f35b506020813d602011612212575b8161220060209383613ea4565b8101031261000e576121b590516121a9565b3d91506121f3565b50346102b65760203660031901126102b6576020906001600160a01b0361223f613c87565b16815260058252604060018060a01b0391205416604051908152f35b50346102b657806003193601126102b65760ff60209154166040519015158152f35b50346102b65760203660031901126102b657612297613c87565b61229f61485a565b6001600160a01b0316808252600a602052604082205460ff16156122f857808252600a60205260408220805460ff191690557f1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde88280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08189b1858dadb1a5cdd1959608a1b6044820152606490fd5b50346102b65760203660031901126102b657600435801515809103610ae25761235661485a565b60145460ff8160a81c1615159061236f82841415614110565b60ff60a81b191660a883901b60ff60a81b16176014557f84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce98380a380f35b50346102b657806003193601126102b6576020600f54604051908152f35b50346102b65760603660031901126102b6576123e4613c87565b602435604435916123f361485a565b6001600160a01b0316808452600360205260408420549091906124189060ff16613d52565b80151580612498575b15610ef157818452600d602052817fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260806040872054838852600e60205260408820546040519182526020820152846040820152866060820152a2818452600d60205260408420558252600e602052604082205580f35b50828110612421565b50346102b65760203660031901126102b6576124bb613c87565b6124c361485a565b6001600160a01b0316808252600a602052604082205460ff1661251e57808252600a60205260408220805460ff191660011790557f44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b8789678280a280f35b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e48189b1858dadb1a5cdd1959606a1b6044820152606490fd5b50346102b65760203660031901126102b6576020610848612578613c87565b61414e565b50346102b65760203660031901126102b657612597613c87565b61259f61485a565b6125a881614a62565b50600b546001600160a01b03828116929082169083821461078857604080516001600160a01b0393841681529190921660208201527f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9190a16001600160a01b03191617600b5580f35b50346102b657806003193601126102b65761262b6148a9565b805460ff8116156126695760ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b50346102b65760403660031901126102b657612692613c87565b61269a613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f206040516126cc81613e50565b8154815260018201546020820152600282015460408201526126f060038301613f84565b916060820192835260048101805461270781613fce565b916127156040519384613ea4565b81835286526020808720879184015b8383106127d557505050509060059160808401520190815461274581613fce565b926127536040519485613ea4565b81845285526020808620869185015b8383106127b7575050505060a001525190604051918291602083016020845282518091526020604085019301915b81811061279e575050500390f35b8251845285945060209384019390920191600101612790565b600760206001926127c785613fe6565b815201920192019190612762565b600460206001926040516127e881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612724565b50346102b65760203660031901126102b657600435801515809103610ae25761284b61485a565b60145460ff8160a01c1615159061286482841415614110565b60ff60a01b191660a083901b60ff60a01b16176014557f99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b8380a380f35b50346102b65760403660031901126102b6576128bb613c9d565b336001600160a01b038216036128d757611136906004356149de565b63334bd91960e11b8252600482fd5b50346102b65760403660031901126102b657600490612903613c9d565b6001600160a01b03818116808452602085815260408086205490516318160ddd60e01b81529692939192879290918391165afa938415612a025783946129ce575b508252601060205261295b60408320549130614512565b8361298557505050506020670de0b6b3a764000061297c815b600435613e02565b04604051908152f35b61298e91614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e575061297c6129c9602093670de0b6b3a764000093613e15565b612974565b9093506020813d6020116129fa575b816129ea60209383613ea4565b8101031261000e5751925f612944565b3d91506129dd565b6040513d85823e3d90fd5b50346102b65760403660031901126102b657612a27613c87565b612a2f613c9d565b60018060a01b038216835260086020526040832060018060a01b0382165f5260205260405f2060405190612a6282613e50565b805482526001810154602083015260028101546040830152612a8660038201613f84565b6060830152600481018054612a9a81613fce565b91612aa86040519384613ea4565b81835287526020808820889184015b838310612b35575050505060808301526005018054612ad581613fce565b91612ae36040519384613ea4565b81835286526020808720969083015b828210612b1757602087612b0e88888860a08201525192614512565b01604051908152f35b60076020600192612b278b613fe6565b815201980191019096612af2565b60046020600192604051612b4881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612ab7565b50346102b65760403660031901126102b657611136600435612ba4613c9d565b90612bbe61112c825f526001602052600160405f20015490565b614952565b50346102b65760403660031901126102b657612bdd613c87565b612be5613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f209060405190612c1982613e50565b825482526001830154602083015260028301546040830152612c3d60038401613f84565b606083015260048301928354612c5281613fce565b90612c606040519283613ea4565b80825260208201958452602084209584905b828210612ce4575050506080840152600501805490612c9082613fce565b92612c9e6040519485613ea4565b82845290815260208082209084015b838310612cc6576020858060a089015251604051908152f35b60076020600192612cd685613fe6565b815201920192019190612cad565b60046020600192604051612cf781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096612c72565b50346102b65760403660031901126102b6576020610848612d52613c87565b612d5a613c9d565b90614072565b50346102b65760203660031901126102b6576020906040906001600160a01b03612d88613c87565b168152600e83522054604051908152f35b50346102b65760203660031901126102b65760206108486004355f526001602052600160405f20015490565b50346102b657612dd436613cb3565b919290428311156130125760018060a01b038416825260086020526040822060018060a01b0382165f5260205260405f209160405191612e1383613e50565b835483526001840154602084015260028401549360408401948552612e3a60038201613f84565b6060850152600481018054612e4e81613fce565b91612e5c6040519384613ea4565b81835285526020808620869184015b838310612fc3575050505060808501526005018054612e8981613fce565b91612e976040519384613ea4565b81835284526020808520859184015b838310612fa5575050505060a08401526001600160a01b03811682526009602052604082208054909690612ed981613fce565b97612ee7604051998a613ea4565b8189528452602080852085918a015b838310612f6757505050508651965f19880197881161126c57602097612f1b91614051565b51929451612f4a575b505084612f39644979cb9e0094954290613df5565b925191015102020401604051908152f35b644979cb9e009450612f608792612f3992614512565b9450612f24565b60036020600192604051612f7a81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190612ef6565b60076020600192612fb585613fe6565b815201920192019190612ea6565b60046020600192604051612fd681613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612e6b565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606490fd5b50346102b65760403660031901126102b657613060613c87565b613068613c9d565b9082916130758183614512565b9160018060a01b031684526008602052604084209060018060a01b03165f5260205260405f2092604051936130a985613e50565b8054855260018101546020860152600281015460408601526130cd60038201613f84565b60608601526004810180546130e181613fce565b916130ef6040519384613ea4565b81835284526020808520859184015b8383106131a857505050509060059160808701520193845461311f81613fce565b9561312d6040519788613ea4565b81875283526020808420849188015b83831061318a575050505060a001938452915b8351805184101561317d5760019160a061316c8661317594614051565b51015190614065565b92019161314f565b5060209160405191018152f35b6007602060019261319a85613fe6565b81520192019201919061313c565b600460206001926040516131bb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906130fe565b50346102b65760203660031901126102b6576020906040906001600160a01b0361321f613c87565b168152600283522054604051908152f35b50346102b65760403660031901126102b65761324a613c87565b613252613c9d565b6001600160a01b0381168352600360205260408320549091906132779060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20906040516132a981613e50565b8254815260018301546020820152600283015460408201526132cd60038401613f84565b6060820152600483019283546132e281613fce565b906132f06040519283613ea4565b80825260208201958552602085209585905b82821061337457505050608083015260050180549061332082613fce565b9361332e6040519586613ea4565b82855290815260208082209085015b838310613356576020858760a082015251604051908152f35b6007602060019261336685613fe6565b81520192019201919061333d565b6004602060019260405161338781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096613302565b50346102b65760403660031901126102b6576133dd613c87565b6001600160a01b0381168083526003602052604083205460243592906134059060ff16613d52565b61340d61435d565b338452600a60205261342660ff60408620541615613d92565b60ff60145460a01c166137c657338452600860205260408420825f5260205260405f20906134548133614377565b61345d816143f5565b918054906001810191825487151591826137a9575b5050156107d2576006548752600760205281549587815f19810361376457505050805487818801979355938782555b8615613727578588526010602052604088206134be868254613df5565b90558588526012602052604088206134d7848254613df5565b9055670de0b6b3a76400008702878104670de0b6b3a7640000036107af57889161350091613e15565b86825260046020526024602060018060a01b03604085205416604051928380926370a0823160e01b82523360048301525afa908115612a025783916136f2575b5080821180156136e9575b6136e1575b50868252600460205260408220546001600160a01b0316803b1561079757604051632770a7eb60e21b8152336004820152602481019290925282908290604490829084905af1801561078c576136cc575b5050600c546127100361271081116136b8576135c06127109188613e02565b0490816135d66135d0828a613df5565b9561414e565b1061367e576135e96136459233886144d1565b858852600260205260408820613600868254613df5565b905560056040519161361183613e33565b600183528760208401523360408401528860608401528660808401528460a08401524260c08401524260e084015201613ec6565b604051928352602083015260408201527f25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c28960603392a480f35b60405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b816136d691613ea4565b6107d257865f6135a1565b90505f613550565b5083541561354b565b9250506020823d60201161371f575b8161370e60209383613ea4565b8101031261000e578891515f613540565b3d9150613701565b60405162461bcd60e51b81526020600482015260156024820152746e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b919790959390828110613785575061377d828254613df5565b9055916134a1565b909395506137969189829555613df5565b6137a1818354613df5565b8255936134a1565b018711801591506137bc575b5f80613472565b505f1986146137b5565b60405162461bcd60e51b815260206004820152601a60248201527f666c617368207769746864726177206e6f7420656e61626c65640000000000006044820152606490fd5b50346102b65760203660031901126102b65760043563ffffffff60e01b8116809103610ae257602090637965db0b60e01b8114908115613851575b506040519015158152f35b6301ffc9a760e01b14905082613846565b3461000e57604036600319011261000e5761387b613c87565b6024359060018060a01b03811691825f5260036020526138a160ff60405f205416613d52565b6138a961435d565b335f52600a6020526138c260ff60405f20541615613d92565b6138cc8233614377565b6138d5826143f5565b90335f52600860205260405f20845f5260205260405f2093845493600186019485548415159182613c6a575b505015613c34576006545f52600760205260405f2090835f908754955f1981145f14613bed5750505086545f818601959755945f88555b60048301968755600383019586558415613bb05760038801600654815491600160401b831015613b9c578261062591600161397595018155613dcc565b8554845f52601060205261398e60405f20918254613df5565b90558654845f5260126020526139a960405f20918254613df5565b9055670de0b6b3a76400008502858104670de0b6b3a764000003613b88576024916139d391613e15565b97845f526004602052602060018060a01b0360405f205416604051938480926370a0823160e01b82523360048301525afa918215613b37575f92613b54575b50818911908115613b4a575b50613b42575b505f838152600460205260409020546001600160a01b0316803b1561000e57604051632770a7eb60e21b815233600482015260248101989098525f908890604490829084905af1908115613b3757602097613aa192613b27575b508254610100600160a81b03191660089190911b610100600160a81b0316178255565b600181810180546001600160a01b03191633908117909155600283018590554260058401819055600f54016006938401558254918201909255935494546040805192835260208301969096529481019490945291928392907ff74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba90606090a4604051908152f35b5f613b3191613ea4565b5f613a7e565b6040513d5f823e3d90fd5b965087613a24565b9050541589613a1e565b9091506020813d602011613b80575b81613b7060209383613ea4565b8101031261000e57519089613a12565b3d9150613b63565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b81526020600482015260156024820152744e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b9196979095828110155f14613c105750613c08828254613df5565b905595613938565b90979650613c21915f829955613df5565b613c2c818954613df5565b885594613938565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b01841180159150613c7d575b8780613901565b505f198314613c76565b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b606090600319011261000e576004356001600160a01b038116810361000e57906024356001600160a01b038116810361000e579060443590565b91909160e08061010083019480511515845260018060a01b03602082015116602085015260018060a01b036040820151166040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b15613d5957565b60405162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b6044820152606490fd5b15613d9957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b8054821015613de1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211613b8857565b81810292918115918404141715613b8857565b8115613e1f570490565b634e487b7160e01b5f52601260045260245ffd5b610100810190811067ffffffffffffffff821117613b9c57604052565b60c0810190811067ffffffffffffffff821117613b9c57604052565b6080810190811067ffffffffffffffff821117613b9c57604052565b6060810190811067ffffffffffffffff821117613b9c57604052565b90601f8019910116810190811067ffffffffffffffff821117613b9c57604052565b805490600160401b821015613b9c5760018201808255821015613de1575f90815260209081902083516007909302018054918401516001600160a81b031990921660ff931515939093169290921760089190911b610100600160a81b03161781559060069060e09060408101516001850180546001600160a01b0319166001600160a01b0392909216919091179055606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b90604051918281549182825260208201905f5260205f20925f5b818110613fb5575050613fb392500383613ea4565b565b8454835260019485019487945060209093019201613f9e565b67ffffffffffffffff8111613b9c5760051b60200190565b90604051613ff381613e33565b825460ff81161515825260081c6001600160a01b03908116602083015260018401541660408201526002830154606082015260038301546080820152600483015460a0820152600583015460c08201526006929092015460e0830152565b8051821015613de15760209160051b010190565b91908201809211613b8857565b6001600160a01b039091165f818152600360205260409020546140979060ff16613d52565b5f526004602052602060018060a01b0360405f205416916024604051809481936370a0823160e01b835260018060a01b031660048301525afa908115613b37575f916140e1575090565b90506020813d602011614108575b816140fc60209383613ea4565b8101031261000e575190565b3d91506140ef565b1561411757565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd1a1a5b99c818da185b99d959608a1b6044820152606490fd5b602060249161415c81614a62565b506040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115613b37575f916140e1575090565b9081602091031261000e5751801515810361000e5790565b604051906141b682613e33565b5f60e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b156141ec57565b60405162461bcd60e51b81526020600482015260056024820152640d2dcc8caf60db1b6044820152606490fd5b805490600160401b821015613b9c5760018201808255821015613de1576002916040915f52600360205f209102019260018060a01b0360018060a01b03825116166001600160601b0360a01b855416178455602081015160018501550151910155565b1561428357565b60405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606490fd5b156142b957565b60405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606490fd5b156142ef57565b60405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606490fd5b80548015614349575f1901906143388282613dcc565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b60ff5f541661436857565b63d93c066560e01b5f5260045ffd5b9060018060a01b0382165f52600860205260405f2060018060a01b0382165f5260205260405f20915f82600285019283546143e4575b506143ba60019130614512565b94015542905560018060a01b0316805f5260116020524260405f20555f52601260205260405f2055565b6143ee9250614512565b825f6143ad565b6001600160a01b039081165f818152600460208181526040928390205492516318160ddd60e01b81529490928592918391165afa918215613b37575f9261449d575b508161444b575050670de0b6b3a764000090565b8061446f915f52601060205260405f2054905f52601260205260405f205490614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715613b885761449a91613e15565b90565b9091506020813d6020116144c9575b816144b960209383613ea4565b8101031261000e5751905f614437565b3d91506144ac565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613fb39161450d606483613ea4565b614a8d565b9091906001600160a01b0316308114614827575f52600860205260405f2060018060a01b0383165f5260205260405f209160405161454f81613e50565b83548152600184015490602081019182526002850154946040820195865261457960038201613f84565b606083015260048101805461458d81613fce565b9161459b6040519384613ea4565b81835260208301905f5260205f205f915b8383106147d85750505050608083015260050180546145ca81613fce565b916145d86040519384613ea4565b81835260208301905f5260205f205f915b8383106147ba575050505060a08201525193519051915b60018060a01b03165f52600960205260405f2090815461461f81613fce565b9261462d6040519485613ea4565b81845260208401905f5260205f205f915b83831061477c57505050508151915f198301838111613b88576146619082614051565b5192821561477257604084019183835111155f146146a0575050509061449a93946020614694644979cb9e009442613df5565b92015102020490614065565b5f939293925f5b838110614744575b505b8284106146d557505050509061449a93946020614694644979cb9e00945142613df5565b83969192931561473a576146f79060406146ef8986614051565b510151613df5565b5f198701878111613b88576001916020614717644979cb9e009387614051565b5101518b020204604061472a8986614051565b5101519201965b019291906146b1565b9095600190614731565b60406147538285969795614051565b510151821061476857600101939291936146a7565b939291505f6146af565b505f955050505050565b6003602060019260405161478f81613e88565b848060a01b03865416815284860154838201526002860154604082015281520192019201919061463e565b600760206001926147ca85613fe6565b8152019201920191906145e9565b600460206001926040516147eb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906145ac565b506001600160a01b0382165f90815260106020908152604080832054601183528184205460129093529220549193614600565b335f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff161561489257565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8602052604090205460ff16156148e157565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260016020908152604080832033845290915290205460ff161561493c5750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff166149d8575f8181526001602081815260408084206001600160a01b0396909616808552959091528220805460ff19169091179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff16156149d8575f8181526001602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b15614a6c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b905f602091828151910182855af115613b37575f513d614adc57506001600160a01b0381163b155b614abc5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614ab556fea2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0da6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4923b5fec2089556a6c5b151e34068bfe081a4d2aa094faa466b56d44dbb75c738b9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8","sourceMap":"472:36530:11:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;911:6;;472:36530;1564:2;;472:36530;2061:4;472:36530;;-1:-1:-1;;;;472:36530:11;-1:-1:-1;;;472:36530:11;;;2478:36;;;:::i;:::-;;2524:32;;;:::i;:::-;;2566:30;;;:::i;:::-;;472:36530;;827:238:15;;;472:36530:11;;;;2715:28;;:73;;;-1:-1:-1;2715:118:11;;;-1:-1:-1;2715:158:11;;;-1:-1:-1;472:36530:11;;;;2917:38;;3006:26;3172:34;2917:38;2965:31;2917:38;;3080:39;2917:38;;:::i;:::-;;2965:31;:::i;:::-;;3006:26;:::i;:::-;-1:-1:-1;3043:22:11;1396:21;;-1:-1:-1;;;;;;1396:21:11;-1:-1:-1;;;;;472:36530:11;;;;1396:21;;;;;472:36530;;-1:-1:-1;1396:21:11;;472:36530;1396:21;;;;;;3080:39;472:36530;3130:27;472:36530;;;1396:21;-1:-1:-1;1396:21:11;;472:36530;1396:21;;;3172:34;3231:15;3217:29;472:36530;-1:-1:-1;3329:7:11;;;;;;2061:4;1396:21;;-1:-1:-1;;;;;;1396:21:11;;;;;-1:-1:-1;472:36530:11;1396:21;472:36530;;1939:61:8;;472:36530:11;1396:21;;;;;-1:-1:-1;1396:21:11;2427:20:8;472:36530:11;;;735:10:7;1396:21:11;;2427:20:8;472:36530:11;;;;;;;;;1939:61:8;1974:15;;;-1:-1:-1;1974:15:8;3788:23:11;-1:-1:-1;1974:15:8;3338:3:11;3365:18;;;;:::i;:::-;1396:21;3386:18;;;;:::i;:::-;1396:21;-1:-1:-1;472:36530:11;;;-1:-1:-1;;;;;3468:10:11;;;;:::i;:::-;1396:21;472:36530;3516:18;;;;;:::i;:::-;1396:21;;-1:-1:-1;1396:21:11;3492:14;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;3572:18;;;;:::i;:::-;1396:21;;-1:-1:-1;1396:21:11;3548:14;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;1396:21;-1:-1:-1;1396:21:11;3604:15;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;1396:21;;;;;;;;3677:18;3652:64;472:36530;3677:18;;;;:::i;:::-;1396:21;3697:18;;;;:::i;:::-;1396:21;472:36530;;1396:21;;;472:36530;1396:21;;;3652:64;-1:-1:-1;;;;;3761:12:11;;;;:::i;:::-;1396:21;472:36530;1396:21;-1:-1:-1;1396:21:11;3788:23;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;;;;;;;;;;;;1396:21;;;;;;;;-1:-1:-1;1396:21:11;3844:23;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;472:36530;;;;;;;;;;;;1396:21;;;;;;;3914:34;-1:-1:-1;3914:34:11;;4106:17;;;;:::i;:::-;1396:21;472:36530;;1396:21;;;472:36530;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;1396:21;;;472:36530;4030:154;;1396:21;;;472:36530;4030:154;;3231:15;1396:21;;;-1:-1:-1;1396:21:11;4198:15;472:36530;1396:21;472:36530;-1:-1:-1;1396:21:11;;;;;;;;;;;472:36530;1396:21;;;;;;;;;;472:36530;1396:21;;;-1:-1:-1;1396:21:11;3604:15;472:36530;-1:-1:-1;1396:21:11;;;;472:36530;;;;;;;;;;;;1396:21;;472:36530;;;;;;;1396:21;;;;;;;;;;;472:36530;1396:21;;;472:36530;4260:45;472:36530;4287:17;;;;:::i;:::-;1396:21;472:36530;;1396:21;;;;-1:-1:-1;472:36530:11;1396:21;;;472:36530;1396:21;;;4260:45;-1:-1:-1;1396:21:11;4320:22;472:36530;1396:21;3231:15;472:36530;-1:-1:-1;1396:21:11;472:36530;1396:21;3314:13;;1396:21;472:36530;;;-1:-1:-1;1396:21:11;1564:2;3788:23;1396:21;;-1:-1:-1;1396:21:11;;472:36530;;;-1:-1:-1;472:36530:11;;3788:23;472:36530;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;2715:158;472:36530;;;2850:23;;2715:158;;:118;472:36530;;;2804:29;;2715:118;;:73;472:36530;;;2759:29;;2715:73;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;472:36530:11;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;472:36530:11;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1396:21;472:36530;;1396:21;;;;;;;;;;;;:::o;292:438:15:-;377:326;;;719:4;292:438;:::o;377:326::-;;;;;;;;;;;;;;;6155:316:0;-1:-1:-1;;;;;472:36530:11;;2241:4:0;1396:21:11;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;2241:4:0;1396:21:11;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;;;-1:-1:-1;;1396:21:11;2930:6:0;1396:21:11;;;735:10:7;;472:36530:11;-1:-1:-1;;;;;;;;;;;2241:4:0;;6346:40;2930:6;6400:11;:::o;6248:217::-;6442:12;2241:4;6442:12;:::o;6155:316::-;-1:-1:-1;;;;;472:36530:11;;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;;;-1:-1:-1;;1396:21:11;2930:6:0;1396:21:11;;;735:10:7;;472:36530:11;1330:24;;-1:-1:-1;;;;;;;;;;;6346:40:0;472:36530:11;6346:40:0;2930:6;6400:11;:::o;6155:316::-;-1:-1:-1;;;;;472:36530:11;;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;;1396:21;;;-1:-1:-1;;;;;;;;;;;472:36530:11;1396:21;472:36530;1396:21;;;;-1:-1:-1;;1396:21:11;2930:6:0;1396:21:11;;;735:10:7;;472:36530:11;1396:21;;-1:-1:-1;;;;;;;;;;;6346:40:0;472:36530:11;6346:40:0;2930:6;6400:11;:::o","linkReferences":{}},"deployedBytecode":{"object":"60806040526004361015610012575b5f80fd5b5f5f3560e01c806301e51e971461386257806301ffc9a71461380b57806304d3a96d146133c35780630db14e95146132305780630f40517a146131f75780631a9be40a146130465780632169678314612dc5578063248a9ca314612d99578063251d6ec314612d605780632647d92914612d335780632d4abd2d14612bc35780632f2ff15d14612b8457806332cf58c414612a0d57806336103291146128e657806336568abe146128a157806339de62a6146128245780633a33a4f8146126785780633f4ba83a14612612578063403f37311461257d57806343ab265f1461255957806344337ea1146124a157806348d832cb146123ca5780634d2b1444146123ac5780634f8fe1f11461232f578063537df3b61461227d5780635c975abb1461225b5780635f2567571461221a5780636382d9ad1461213357806366fd9d6514611ca657806368c4ac2614611c675780636c0a188e14611c495780637c395b1314611aae578063812a71d5146118bb5780638456cb591461186257806391d148541461181857806395d322b0146117df5780639ed9e4831461166f578063a1bab44714611603578063a217fddf146115e7578063abd42922146115a3578063adc9772e146112f8578063cb0b8fe5146112bf578063d295fa9a1461117b578063d40549c01461113a578063d547741f146110f2578063da57c7d714610f0a578063ddd5e1b214610c80578063e30227ea14610ba1578063e315d80414610b68578063e8690bc2146108b1578063ebc73e6514610850578063f56f4f0f1461081b578063f7192ba8146104a0578063f92396a6146102b95763fe575a8714610278575f80fd5b346102b65760203660031901126102b65760209060ff906040906001600160a01b036102a2613c87565b168152600a84522054166040519015158152f35b80fd5b50346102b65760403660031901126102b6576102d3613c87565b6001600160a01b03168082526003602052604082205460243591906102fa9060ff16613d52565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b8352600160209081526040808520335f908152925290205460ff1615610469578115610439576040516370a0823160e01b8152306004820152602081602481855afa90811561042e5784916103fc575b5082116103c257600b5461038a9083906001600160a01b0316836144d1565b7f9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85602060018060a01b03600b5416604051908152a380f35b60405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b90506020813d602011610426575b8161041760209383613ea4565b8101031261000e57515f61036b565b3d915061040a565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152600860248201526706d757374203e20360c41b6044820152606490fd5b63e2517d3f60e01b8352336004527f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b602452604483fd5b50346102b65760403660031901126102b6576004356104bd613c9d565b906104c661435d565b338352600a6020526104df60ff60408520541615613d92565b60ff60145460a81c166107d657808352600760205261050060408420613fe6565b818452600760205283600660408220828155826001820155826002820155826003820155826004820155826005820155015560018060a01b036020820151169033855260086020526040852060018060a01b0383165f5260205260405f2033865260086020526040862060018060a01b0384165f52602052610587600360405f2001613f84565b946060830151156107d2576040830151336001600160a01b03909116036107d2576105b38351156142b2565b6001600160a01b038116936105c99085146142e8565b865b86518110156107c357856105df8289614051565b51146105ed576001016105cb565b9091929394958051905f1982019182116107af579161063d610616610642936106809695614051565b51610625600388019384613dcc565b90919082549060031b91821b915f19901b1916179055565b614322565b60a0608085015194015192610658858254614065565b815560018101610669858254614065565b905560024291015561067b8133614377565b6143f5565b61068a8284614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561079b5786916106b691613e15565b8482526010602052604082206106cd858254614065565b90558482526012602052604082206106e6848254614065565b9055848252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c57610773575b505061074391614065565b916040519081527f16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b1860203392a480f35b8161077d91613ea4565b61078857845f610738565b8480fd5b6040513d84823e3d90fd5b8280fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b89526011600452602489fd5b50610680919293949550610642565b8680fd5b60405162461bcd60e51b815260206004820152601860248201527f63616e63656c20636c61696d206e6f7420656e61626c656400000000000000006044820152606490fd5b50346102b65760403660031901126102b657602061084861083a613c87565b610842613c9d565b90614512565b604051908152f35b50346102b65760203660031901126102b65760043561086d61485a565b7fe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd399692296040600f5461089f8185141561427c565b8151908152836020820152a1600f5580f35b50346102b65760a03660031901126102b6576108cb613c87565b60243590604435906084356001600160a01b0381169160643591839003610b64576108f461485a565b6108fd81614a62565b506001600160a01b03168086526003602052604086205490929060ff16610b3357612710821080610b2a575b15610aef57828652600360205260408620805460ff19166001179055859061094f61485a565b838252600360205261096760ff604084205416613d52565b85151580610ae6575b15610ae257837fd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd60407f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de98606098847fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260808983610acd9b52600d602052868082205491858152600e6020522054875191825260208201528587820152848e820152a2848c52600d60205281838d2055848c52600e60205280838d205582519182526020820152a283875260046020526040872060018060a01b0382166001600160601b0360a01b825416179055808752600560205260408720846001600160601b0360a01b825416179055604051907fd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f38880a2610aad81613e88565b838152826020820152426040820152838752600960205260408720614219565b6040519182528460208301526040820152a180f35b5080fd5b50848610610970565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c696420726577617264207261746560681b6044820152606490fd5b50811515610929565b60405162461bcd60e51b815260206004820152600960248201526814dd5c1c1bdc9d195960ba1b6044820152606490fd5b8580fd5b50346102b65760203660031901126102b6576020906040906001600160a01b03610b90613c87565b168152601283522054604051908152f35b50346102b65760203660031901126102b6576001600160a01b03610bc3613c87565b1681526009602052604081208054610bda81613fce565b91610be86040519384613ea4565b81835283526020808420849184015b838310610c425785858051915f198301928311610c2e5760406020610c1c8585614051565b51015181519081526127106020820152f35b634e487b7160e01b81526011600452602490fd5b60036020600192604051610c5581613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190610bf7565b50346102b65760403660031901126102b657600435610c9d613c9d565b90610ca661435d565b338352600a602052610cbf60ff60408520541615613d92565b8083526007602052610cd360408420613fe6565b60208181015133808752600880845260408089206001600160a01b039094165f818152948652818520938a52918552808920828552909452929091209094919290610d2090600301613f84565b946060820192835115610f065760e08301514210610f06576040830151336001600160a01b0390911603610f0657610d6d90610d5d8451156142b2565b6001600160a01b031685146142e8565b848752600760205260408720805460ff19166001179055865b8651811015610ef55785610d9a8289614051565b5114610da857600101610d86565b9091929394958051905f1982019182116107af5760059261063d610dd4610e50979694610de394614051565b51610625600386019384613dcc565b60808301928351878a526002602052610e0160408b20918254613df5565b9055855193519060c060a08201519101519160405195610e2087613e33565b600187528960208801523360408801526060870152608086015260a085015260c08401524260e084015201613ec6565b601454815185916001600160a01b0316803b15610797576040516317d5759960e31b81526001600160a01b0386166004820152336024820152604481019290925282908290606490829084905af1801561078c57610edc575b505051916040519081527fdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd60203392a480f35b81610ee691613ea4565b610ef157835f610ea9565b8380fd5b50610e509293949550600590610de3565b8780fd5b50346102b657610f1936613cb3565b91836060604051610f2981613e6c565b828152826020820152826040820152015260018060a01b03821684526003602052610f5a60ff604086205416613d52565b60018060a01b031683526008602052604083209060018060a01b03165f5260205260405f20604051610f8b81613e50565b815481526001820154602082015260028201546040820152610faf60038301613f84565b606082015260048201918254610fc481613fce565b93610fd26040519586613ea4565b81855286526020808720879186015b83831061109d5750505050600590608083019384520190815461100381613fce565b926110116040519485613ea4565b81845286526020808720969084015b82821061107f57608061104788888860a089015261104181515183106141e5565b51614051565b5160606040519160018060a01b03815116835260018060a01b0360208201511660208401526040810151604084015201516060820152f35b6007602060019261108f8b613fe6565b815201980191019096611020565b6004602060019260409b989b516110b381613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190979497610fe1565b50346102b65760403660031901126102b657611136600435611112613c9d565b9061113161112c825f526001602052600160405f20015490565b614918565b6149de565b5080f35b50346102b65760203660031901126102b6576020906001600160a01b0361115f613c87565b16815260048252604060018060a01b0391205416604051908152f35b50346102b65760403660031901126102b657600435600461119a613c9d565b6001600160a01b03818116808652602084815260408088205490516318160ddd60e01b81529592939192869290918391165afa9283156112b4578593611280575b50845260106020526111f260408520549130614512565b8261123257505050670de0b6b3a7640000915b670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e5760206108488484613e15565b61123b91614065565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561126c579061126691613e15565b91611205565b634e487b7160e01b84526011600452602484fd5b9092506020813d6020116112ac575b8161129c60209383613ea4565b8101031261000e5751915f6111db565b3d915061128f565b6040513d87823e3d90fd5b50346102b65760203660031901126102b6576020906040906001600160a01b036112e7613c87565b168152601083522054604051908152f35b50346102b65760403660031901126102b657611312613c87565b6001600160a01b03811680835260036020526040832054602435929061133a9060ff16613d52565b61134261435d565b338452600a60205261135b60ff60408620541615613d92565b338452600860205260408420825f5260205260405f209083825401838652600d60205260408620548110610b6457838652600e602052604086205410610788576040516323b872dd60e01b6020820152336024820152306044820152606480820186905281526113e591906113db906113d5608482613ea4565b85614a8d565b61067b8133614377565b8285526010602052604085206113fc858254614065565b9055670de0b6b3a76400008402848104670de0b6b3a7640000148515171561158f57859161142991613e15565b838252600460205260408220546001600160a01b0316803b15610797576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af1801561078c5761157a575b50506040516004820161148b82613e6c565b8382526020820133815260408301908682526060840192428452805490600160401b82101561156657600182018082558210156115525789526020808a209551600292831b90960180546001600160a01b039788166001600160a01b03199182161782559351600182018054919098169416939093179095559151818301559151600390920191909155825485019092558285525260408320805483019055337f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f78480a480f35b634e487b7160e01b8a52603260045260248afd5b634e487b7160e01b8a52604160045260248afd5b8161158491613ea4565b610ef157835f611479565b634e487b7160e01b86526011600452602486fd5b50346102b65760203660031901126102b6576115d760406115e3926115c66141a9565b506004358152600760205220613fe6565b60405191829182613ced565b0390f35b50346102b657806003193601126102b657602090604051908152f35b50346102b65760203660031901126102b65760043561162061485a565b61271081111580611663575b6116359061427c565b80600c547f2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e108480a3600c5580f35b50600c5481141561162c565b50346102b65760403660031901126102b657611689613c87565b611691613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20604051916116c483613e50565b8154835260018201546020840152600282015460408401526116e860038301613f84565b6060840152600482019182546116fd81613fce565b9361170b6040519586613ea4565b81855283526020808420849186015b83831061179057505050506080840192835260050180549061173b82613fce565b926117496040519485613ea4565b82845290815260208082209084015b838310611772576020868660a08a01525151604051908152f35b6007602060019261178285613fe6565b815201920192019190611758565b600460206001926040516117a381613e6c565b848060a01b038654168152848060a01b03858701541683820152600286015460408201526003860154606082015281520192019201919061171a565b50346102b65760203660031901126102b6576020906040906001600160a01b03611807613c87565b168152600d83522054604051908152f35b50346102b65760403660031901126102b6576040611834613c9d565b9160043581526001602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102b657806003193601126102b65761187b6148a9565b61188361435d565b600160ff198254161781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346102b65760403660031901126102b6576118d5613c87565b6001600160a01b0381168083526003602052604083205460243592906118fd9060ff16613d52565b61190561485a565b612710831015611a7a57818452600960205260408420805461192681613fce565b916119346040519384613ea4565b81835286526020808720879184015b838310611a3c57505050508051905f19820191821161158f5760209161196891614051565b510151918383141580611a33575b156119fb577f37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de936119d06119f592604051906119b182613e88565b8082528360208301524260408301528852600960205260408820614219565b60405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a180f35b60405162461bcd60e51b815260206004820152601060248201526f496e76616c6964206e6577207261746560801b6044820152606490fd5b50831515611976565b60036020600192604051611a4f81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190611943565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b6044820152606490fd5b50346102b657611abd36613cb3565b9291611ac76141a9565b506001600160a01b038216835260036020526040832054611aea9060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f2060405190611b1c82613e50565b805482526001810154602083015260028101546040830152611b4060038201613f84565b6060830152600481018054611b5481613fce565b91611b626040519384613ea4565b81835285526020808620869184015b838310611bfa57505050506080830152600501805490611b9082613fce565b93611b9e6040519586613ea4565b82855290815260208082209085015b838310611bdc576115e3611bcf888861104160a08a01918083525183106141e5565b5160405191829182613ced565b60076020600192611bec85613fe6565b815201920192019190611bad565b60046020600192604051611c0d81613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190611b71565b50346102b657806003193601126102b6576020600654604051908152f35b50346102b65760203660031901126102b65760209060ff906040906001600160a01b03611c92613c87565b168152600384522054166040519015158152f35b50346102b65760803660031901126102b657611cc0613c87565b611cc8613c9d565b6044356001600160a01b03811691908281036107885760643590338652600a602052611cfb60ff60408820541615613d92565b6001600160a01b038316808752600a6020526040872054909190611d229060ff1615613d92565b848752600a602052611d3b60ff60408920541615613d92565b8482146120ee5782156120a957611d528685614072565b9383851061207a57338314612029576001600160a01b03878116808a52600460208181526040808d20549051636eb1769f60e11b81528686169381019390935233602484015292939192909183916044918391165afa801561201e5786918b91611fe9575b5010611fb8578089526004602052604089205489906001600160a01b0316803b15610ae257604051630f75ba2160e41b81526001600160a01b0385166004820152336024820152604481018890529082908290606490829084905af1801561078c57611f9f575b5052600460208181526040808b205490516323b872dd60e01b81526001600160a01b03858116948201949094528584166024820152604481018890529492859116818c81606481015b03925af1928315611f9457888093611e8892611e8d96611f65575b50614377565b614377565b855260086020526040852060018060a01b0385165f5260205260405f2091825491600184019586549588526008602052604088209060018060a01b03165f5260205260405f2096670de0b6b3a76400008202918204670de0b6b3a764000003610c2e5750611f22611f52959493670de0b6b3a7640000611f1b611f14611f38968396613e15565b8093613e02565b0495613e02565b0492611f2f818854614065565b87558254613df5565b905560018401611f49828254614065565b90558254613df5565b9055600242910155602060405160018152f35b611f869060203d602011611f8d575b611f7e8183613ea4565b810190614191565b505f611e82565b503d611f74565b6040513d8b823e3d90fd5b81611fa991613ea4565b611fb457885f611e1e565b8880fd5b60405162461bcd60e51b8152602060048201526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b9150506020813d602011612016575b8161200560209383613ea4565b8101031261000e578590515f611db7565b3d9150611ff8565b6040513d8c823e3d90fd5b6001600160a01b038781168952600460208181526040808c205490516323b872dd60e01b815233938101939093528584166024840152604483018890529194929091859116818c8160648101611e67565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f66726f6d2063616e206e6f742062652073616d652061732074686520746f00006044820152606490fd5b50346102b65760403660031901126102b65761214d613c87565b612155613c9d565b9061215e61485a565b61216781614a62565b5061217182614a62565b506040516370a0823160e01b81523060048201526001600160a01b03919091169190602081602481865afa801561042e5784906121e6575b6121b5915082846144d1565b6001600160a01b0316907ff5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f8380a380f35b506020813d602011612212575b8161220060209383613ea4565b8101031261000e576121b590516121a9565b3d91506121f3565b50346102b65760203660031901126102b6576020906001600160a01b0361223f613c87565b16815260058252604060018060a01b0391205416604051908152f35b50346102b657806003193601126102b65760ff60209154166040519015158152f35b50346102b65760203660031901126102b657612297613c87565b61229f61485a565b6001600160a01b0316808252600a602052604082205460ff16156122f857808252600a60205260408220805460ff191690557f1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde88280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd08189b1858dadb1a5cdd1959608a1b6044820152606490fd5b50346102b65760203660031901126102b657600435801515809103610ae25761235661485a565b60145460ff8160a81c1615159061236f82841415614110565b60ff60a81b191660a883901b60ff60a81b16176014557f84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce98380a380f35b50346102b657806003193601126102b6576020600f54604051908152f35b50346102b65760603660031901126102b6576123e4613c87565b602435604435916123f361485a565b6001600160a01b0316808452600360205260408420549091906124189060ff16613d52565b80151580612498575b15610ef157818452600d602052817fe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc273838260806040872054838852600e60205260408820546040519182526020820152846040820152866060820152a2818452600d60205260408420558252600e602052604082205580f35b50828110612421565b50346102b65760203660031901126102b6576124bb613c87565b6124c361485a565b6001600160a01b0316808252600a602052604082205460ff1661251e57808252600a60205260408220805460ff191660011790557f44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b8789678280a280f35b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e48189b1858dadb1a5cdd1959606a1b6044820152606490fd5b50346102b65760203660031901126102b6576020610848612578613c87565b61414e565b50346102b65760203660031901126102b657612597613c87565b61259f61485a565b6125a881614a62565b50600b546001600160a01b03828116929082169083821461078857604080516001600160a01b0393841681529190921660208201527f5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e9190a16001600160a01b03191617600b5580f35b50346102b657806003193601126102b65761262b6148a9565b805460ff8116156126695760ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b50346102b65760403660031901126102b657612692613c87565b61269a613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f206040516126cc81613e50565b8154815260018201546020820152600282015460408201526126f060038301613f84565b916060820192835260048101805461270781613fce565b916127156040519384613ea4565b81835286526020808720879184015b8383106127d557505050509060059160808401520190815461274581613fce565b926127536040519485613ea4565b81845285526020808620869185015b8383106127b7575050505060a001525190604051918291602083016020845282518091526020604085019301915b81811061279e575050500390f35b8251845285945060209384019390920191600101612790565b600760206001926127c785613fe6565b815201920192019190612762565b600460206001926040516127e881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612724565b50346102b65760203660031901126102b657600435801515809103610ae25761284b61485a565b60145460ff8160a01c1615159061286482841415614110565b60ff60a01b191660a083901b60ff60a01b16176014557f99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b8380a380f35b50346102b65760403660031901126102b6576128bb613c9d565b336001600160a01b038216036128d757611136906004356149de565b63334bd91960e11b8252600482fd5b50346102b65760403660031901126102b657600490612903613c9d565b6001600160a01b03818116808452602085815260408086205490516318160ddd60e01b81529692939192879290918391165afa938415612a025783946129ce575b508252601060205261295b60408320549130614512565b8361298557505050506020670de0b6b3a764000061297c815b600435613e02565b04604051908152f35b61298e91614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610c2e575061297c6129c9602093670de0b6b3a764000093613e15565b612974565b9093506020813d6020116129fa575b816129ea60209383613ea4565b8101031261000e5751925f612944565b3d91506129dd565b6040513d85823e3d90fd5b50346102b65760403660031901126102b657612a27613c87565b612a2f613c9d565b60018060a01b038216835260086020526040832060018060a01b0382165f5260205260405f2060405190612a6282613e50565b805482526001810154602083015260028101546040830152612a8660038201613f84565b6060830152600481018054612a9a81613fce565b91612aa86040519384613ea4565b81835287526020808820889184015b838310612b35575050505060808301526005018054612ad581613fce565b91612ae36040519384613ea4565b81835286526020808720969083015b828210612b1757602087612b0e88888860a08201525192614512565b01604051908152f35b60076020600192612b278b613fe6565b815201980191019096612af2565b60046020600192604051612b4881613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612ab7565b50346102b65760403660031901126102b657611136600435612ba4613c9d565b90612bbe61112c825f526001602052600160405f20015490565b614952565b50346102b65760403660031901126102b657612bdd613c87565b612be5613c9d565b9060018060a01b031682526008602052604082209060018060a01b03165f5260205260405f209060405190612c1982613e50565b825482526001830154602083015260028301546040830152612c3d60038401613f84565b606083015260048301928354612c5281613fce565b90612c606040519283613ea4565b80825260208201958452602084209584905b828210612ce4575050506080840152600501805490612c9082613fce565b92612c9e6040519485613ea4565b82845290815260208082209084015b838310612cc6576020858060a089015251604051908152f35b60076020600192612cd685613fe6565b815201920192019190612cad565b60046020600192604051612cf781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096612c72565b50346102b65760403660031901126102b6576020610848612d52613c87565b612d5a613c9d565b90614072565b50346102b65760203660031901126102b6576020906040906001600160a01b03612d88613c87565b168152600e83522054604051908152f35b50346102b65760203660031901126102b65760206108486004355f526001602052600160405f20015490565b50346102b657612dd436613cb3565b919290428311156130125760018060a01b038416825260086020526040822060018060a01b0382165f5260205260405f209160405191612e1383613e50565b835483526001840154602084015260028401549360408401948552612e3a60038201613f84565b6060850152600481018054612e4e81613fce565b91612e5c6040519384613ea4565b81835285526020808620869184015b838310612fc3575050505060808501526005018054612e8981613fce565b91612e976040519384613ea4565b81835284526020808520859184015b838310612fa5575050505060a08401526001600160a01b03811682526009602052604082208054909690612ed981613fce565b97612ee7604051998a613ea4565b8189528452602080852085918a015b838310612f6757505050508651965f19880197881161126c57602097612f1b91614051565b51929451612f4a575b505084612f39644979cb9e0094954290613df5565b925191015102020401604051908152f35b644979cb9e009450612f608792612f3992614512565b9450612f24565b60036020600192604051612f7a81613e88565b848060a01b038654168152848601548382015260028601546040820152815201920192019190612ef6565b60076020600192612fb585613fe6565b815201920192019190612ea6565b60046020600192604051612fd681613e6c565b848060a01b038654168152848060a01b038587015416838201526002860154604082015260038601546060820152815201920192019190612e6b565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b6044820152606490fd5b50346102b65760403660031901126102b657613060613c87565b613068613c9d565b9082916130758183614512565b9160018060a01b031684526008602052604084209060018060a01b03165f5260205260405f2092604051936130a985613e50565b8054855260018101546020860152600281015460408601526130cd60038201613f84565b60608601526004810180546130e181613fce565b916130ef6040519384613ea4565b81835284526020808520859184015b8383106131a857505050509060059160808701520193845461311f81613fce565b9561312d6040519788613ea4565b81875283526020808420849188015b83831061318a575050505060a001938452915b8351805184101561317d5760019160a061316c8661317594614051565b51015190614065565b92019161314f565b5060209160405191018152f35b6007602060019261319a85613fe6565b81520192019201919061313c565b600460206001926040516131bb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906130fe565b50346102b65760203660031901126102b6576020906040906001600160a01b0361321f613c87565b168152600283522054604051908152f35b50346102b65760403660031901126102b65761324a613c87565b613252613c9d565b6001600160a01b0381168352600360205260408320549091906132779060ff16613d52565b60018060a01b031682526008602052604082209060018060a01b03165f5260205260405f20906040516132a981613e50565b8254815260018301546020820152600283015460408201526132cd60038401613f84565b6060820152600483019283546132e281613fce565b906132f06040519283613ea4565b80825260208201958552602085209585905b82821061337457505050608083015260050180549061332082613fce565b9361332e6040519586613ea4565b82855290815260208082209085015b838310613356576020858760a082015251604051908152f35b6007602060019261336685613fe6565b81520192019201919061333d565b6004602060019260405161338781613e6c565b848060a01b038c54168152848060a01b03858d0154168382015260028c0154604082015260038c01546060820152815201980191019096613302565b50346102b65760403660031901126102b6576133dd613c87565b6001600160a01b0381168083526003602052604083205460243592906134059060ff16613d52565b61340d61435d565b338452600a60205261342660ff60408620541615613d92565b60ff60145460a01c166137c657338452600860205260408420825f5260205260405f20906134548133614377565b61345d816143f5565b918054906001810191825487151591826137a9575b5050156107d2576006548752600760205281549587815f19810361376457505050805487818801979355938782555b8615613727578588526010602052604088206134be868254613df5565b90558588526012602052604088206134d7848254613df5565b9055670de0b6b3a76400008702878104670de0b6b3a7640000036107af57889161350091613e15565b86825260046020526024602060018060a01b03604085205416604051928380926370a0823160e01b82523360048301525afa908115612a025783916136f2575b5080821180156136e9575b6136e1575b50868252600460205260408220546001600160a01b0316803b1561079757604051632770a7eb60e21b8152336004820152602481019290925282908290604490829084905af1801561078c576136cc575b5050600c546127100361271081116136b8576135c06127109188613e02565b0490816135d66135d0828a613df5565b9561414e565b1061367e576135e96136459233886144d1565b858852600260205260408820613600868254613df5565b905560056040519161361183613e33565b600183528760208401523360408401528860608401528660808401528460a08401524260c08401524260e084015201613ec6565b604051928352602083015260408201527f25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c28960603392a480f35b60405162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b816136d691613ea4565b6107d257865f6135a1565b90505f613550565b5083541561354b565b9250506020823d60201161371f575b8161370e60209383613ea4565b8101031261000e578891515f613540565b3d9150613701565b60405162461bcd60e51b81526020600482015260156024820152746e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b919790959390828110613785575061377d828254613df5565b9055916134a1565b909395506137969189829555613df5565b6137a1818354613df5565b8255936134a1565b018711801591506137bc575b5f80613472565b505f1986146137b5565b60405162461bcd60e51b815260206004820152601a60248201527f666c617368207769746864726177206e6f7420656e61626c65640000000000006044820152606490fd5b50346102b65760203660031901126102b65760043563ffffffff60e01b8116809103610ae257602090637965db0b60e01b8114908115613851575b506040519015158152f35b6301ffc9a760e01b14905082613846565b3461000e57604036600319011261000e5761387b613c87565b6024359060018060a01b03811691825f5260036020526138a160ff60405f205416613d52565b6138a961435d565b335f52600a6020526138c260ff60405f20541615613d92565b6138cc8233614377565b6138d5826143f5565b90335f52600860205260405f20845f5260205260405f2093845493600186019485548415159182613c6a575b505015613c34576006545f52600760205260405f2090835f908754955f1981145f14613bed5750505086545f818601959755945f88555b60048301968755600383019586558415613bb05760038801600654815491600160401b831015613b9c578261062591600161397595018155613dcc565b8554845f52601060205261398e60405f20918254613df5565b90558654845f5260126020526139a960405f20918254613df5565b9055670de0b6b3a76400008502858104670de0b6b3a764000003613b88576024916139d391613e15565b97845f526004602052602060018060a01b0360405f205416604051938480926370a0823160e01b82523360048301525afa918215613b37575f92613b54575b50818911908115613b4a575b50613b42575b505f838152600460205260409020546001600160a01b0316803b1561000e57604051632770a7eb60e21b815233600482015260248101989098525f908890604490829084905af1908115613b3757602097613aa192613b27575b508254610100600160a81b03191660089190911b610100600160a81b0316178255565b600181810180546001600160a01b03191633908117909155600283018590554260058401819055600f54016006938401558254918201909255935494546040805192835260208301969096529481019490945291928392907ff74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba90606090a4604051908152f35b5f613b3191613ea4565b5f613a7e565b6040513d5f823e3d90fd5b965087613a24565b9050541589613a1e565b9091506020813d602011613b80575b81613b7060209383613ea4565b8101031261000e57519089613a12565b3d9150613b63565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b81526020600482015260156024820152744e6f2061737365747320746f20776974686472617760581b6044820152606490fd5b9196979095828110155f14613c105750613c08828254613df5565b905595613938565b90979650613c21915f829955613df5565b613c2c818954613df5565b885594613938565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b01841180159150613c7d575b8780613901565b505f198314613c76565b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b606090600319011261000e576004356001600160a01b038116810361000e57906024356001600160a01b038116810361000e579060443590565b91909160e08061010083019480511515845260018060a01b03602082015116602085015260018060a01b036040820151166040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b15613d5957565b60405162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b6044820152606490fd5b15613d9957565b60405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606490fd5b8054821015613de1575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91908203918211613b8857565b81810292918115918404141715613b8857565b8115613e1f570490565b634e487b7160e01b5f52601260045260245ffd5b610100810190811067ffffffffffffffff821117613b9c57604052565b60c0810190811067ffffffffffffffff821117613b9c57604052565b6080810190811067ffffffffffffffff821117613b9c57604052565b6060810190811067ffffffffffffffff821117613b9c57604052565b90601f8019910116810190811067ffffffffffffffff821117613b9c57604052565b805490600160401b821015613b9c5760018201808255821015613de1575f90815260209081902083516007909302018054918401516001600160a81b031990921660ff931515939093169290921760089190911b610100600160a81b03161781559060069060e09060408101516001850180546001600160a01b0319166001600160a01b0392909216919091179055606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b90604051918281549182825260208201905f5260205f20925f5b818110613fb5575050613fb392500383613ea4565b565b8454835260019485019487945060209093019201613f9e565b67ffffffffffffffff8111613b9c5760051b60200190565b90604051613ff381613e33565b825460ff81161515825260081c6001600160a01b03908116602083015260018401541660408201526002830154606082015260038301546080820152600483015460a0820152600583015460c08201526006929092015460e0830152565b8051821015613de15760209160051b010190565b91908201809211613b8857565b6001600160a01b039091165f818152600360205260409020546140979060ff16613d52565b5f526004602052602060018060a01b0360405f205416916024604051809481936370a0823160e01b835260018060a01b031660048301525afa908115613b37575f916140e1575090565b90506020813d602011614108575b816140fc60209383613ea4565b8101031261000e575190565b3d91506140ef565b1561411757565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd1a1a5b99c818da185b99d959608a1b6044820152606490fd5b602060249161415c81614a62565b506040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115613b37575f916140e1575090565b9081602091031261000e5751801515810361000e5790565b604051906141b682613e33565b5f60e0838281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b156141ec57565b60405162461bcd60e51b81526020600482015260056024820152640d2dcc8caf60db1b6044820152606490fd5b805490600160401b821015613b9c5760018201808255821015613de1576002916040915f52600360205f209102019260018060a01b0360018060a01b03825116166001600160601b0360a01b855416178455602081015160018501550151910155565b1561428357565b60405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606490fd5b156142b957565b60405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606490fd5b156142ef57565b60405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606490fd5b80548015614349575f1901906143388282613dcc565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b60ff5f541661436857565b63d93c066560e01b5f5260045ffd5b9060018060a01b0382165f52600860205260405f2060018060a01b0382165f5260205260405f20915f82600285019283546143e4575b506143ba60019130614512565b94015542905560018060a01b0316805f5260116020524260405f20555f52601260205260405f2055565b6143ee9250614512565b825f6143ad565b6001600160a01b039081165f818152600460208181526040928390205492516318160ddd60e01b81529490928592918391165afa918215613b37575f9261449d575b508161444b575050670de0b6b3a764000090565b8061446f915f52601060205260405f2054905f52601260205260405f205490614065565b90670de0b6b3a7640000820291808304670de0b6b3a76400001490151715613b885761449a91613e15565b90565b9091506020813d6020116144c9575b816144b960209383613ea4565b8101031261000e5751905f614437565b3d91506144ac565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613fb39161450d606483613ea4565b614a8d565b9091906001600160a01b0316308114614827575f52600860205260405f2060018060a01b0383165f5260205260405f209160405161454f81613e50565b83548152600184015490602081019182526002850154946040820195865261457960038201613f84565b606083015260048101805461458d81613fce565b9161459b6040519384613ea4565b81835260208301905f5260205f205f915b8383106147d85750505050608083015260050180546145ca81613fce565b916145d86040519384613ea4565b81835260208301905f5260205f205f915b8383106147ba575050505060a08201525193519051915b60018060a01b03165f52600960205260405f2090815461461f81613fce565b9261462d6040519485613ea4565b81845260208401905f5260205f205f915b83831061477c57505050508151915f198301838111613b88576146619082614051565b5192821561477257604084019183835111155f146146a0575050509061449a93946020614694644979cb9e009442613df5565b92015102020490614065565b5f939293925f5b838110614744575b505b8284106146d557505050509061449a93946020614694644979cb9e00945142613df5565b83969192931561473a576146f79060406146ef8986614051565b510151613df5565b5f198701878111613b88576001916020614717644979cb9e009387614051565b5101518b020204604061472a8986614051565b5101519201965b019291906146b1565b9095600190614731565b60406147538285969795614051565b510151821061476857600101939291936146a7565b939291505f6146af565b505f955050505050565b6003602060019260405161478f81613e88565b848060a01b03865416815284860154838201526002860154604082015281520192019201919061463e565b600760206001926147ca85613fe6565b8152019201920191906145e9565b600460206001926040516147eb81613e6c565b848060a01b038654168152848060a01b0385870154168382015260028601546040820152600386015460608201528152019201920191906145ac565b506001600160a01b0382165f90815260106020908152604080832054601183528184205460129093529220549193614600565b335f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff161561489257565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527fb9cbbae02fe941283ec0eefd7b121e3bc7f89fae077b27bdd75a7fd4cf1543a8602052604090205460ff16156148e157565b63e2517d3f60e01b5f52336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60245260445ffd5b5f81815260016020908152604080832033845290915290205460ff161561493c5750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff166149d8575f8181526001602081815260408084206001600160a01b0396909616808552959091528220805460ff19169091179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181526001602090815260408083206001600160a01b038616845290915290205460ff16156149d8575f8181526001602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b15614a6c57600190565b60205f52600c6020526b5a65726f204164647265737360a01b60405260605ffd5b905f602091828151910182855af115613b37575f513d614adc57506001600160a01b0381163b155b614abc5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614ab556fea2646970667358221220e1378c81bf2b8c5b1dfe6dce3e5ee5e520e32d84ca734eb60da191adc044e80164736f6c634300081c0033","sourceMap":"472:36530:11:-:0;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;36915:10;472:36530;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;1396:21;472:36530;;2930:6:0;472:36530:11;;;;;;;;735:10:7;-1:-1:-1;472:36530:11;;;;;;;;;;3495:23:0;3491:108;;827:238:15;;472:36530:11;;;;-1:-1:-1;;;21701:39:11;;21734:4;472:36530;21701:39;;472:36530;;;;;21701:39;;;;;;;;;;;;472:36530;21690:50;;;472:36530;;21802:9;472:36530;21813:7;;472:36530;;-1:-1:-1;;;;;472:36530:11;21813:7;;:::i;:::-;21837:44;472:36530;;;;;;21802:9;472:36530;;;;;;;21837:44;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;21701:39;;;472:36530;21701:39;;472:36530;21701:39;;;;;;472:36530;21701:39;;;:::i;:::-;;;472:36530;;;;;21701:39;;;;;;-1:-1:-1;21701:39:11;;;472:36530;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;3491:108:0;-1:-1:-1;;;3541:47:0;;735:10:7;472:36530:11;;1396:21;472:36530;;;3541:47:0;;472:36530:11;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;1315:72:8;;;:::i;:::-;10454:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;472:36530;5360:15;472:36530;;;;;;;;;10522:10;472:36530;;;;;;;:::i;:::-;;;;10522:10;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10606:15;;1755:6;472:36530;10454:10;;472:36530;;10663:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;10454:10;472:36530;;10663:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;-1:-1:-1;472:36530:11;10746:54;472:36530;:::i;:::-;10845:21;;;;1755:6;472:36530;;;;10886:14;;1755:6;10454:10;-1:-1:-1;;;;;472:36530:11;;;10886:28;472:36530;;10925:37;1755:6;;472:36530;10925:37;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;10972:39;;10980:15;;10972:39;:::i;:::-;11026:13;11074:3;472:36530;;11041:31;;;;;11096:23;;;;;:::i;:::-;1755:6;11096:35;11093:239;;472:36530;;11026:13;;11093:239;472:36530;;;;;;;;8905:17;;;472:36530;;;;;;;11188:51;11151:88;11188:51;11257:35;11188:51;11682:24;11188:51;;;:::i;:::-;1755:6;11151:34;472:36530;11151:31;;:34;;;:::i;:::-;:88;472:36530;;;;;;;;;;8905:17;;;472:36530;;;;;;;;11151:88;11257:35;:::i;:::-;11424:22;11372:25;;;1755:6;11424:22;;1755:6;472:36530;11457:36;472:36530;;;11457:36;:::i;:::-;472:36530;;;11503:28;;:38;472:36530;;;11503:38;:::i;:::-;472:36530;;;11585:15;11551:31;;472:36530;11642:6;10454:10;;11642:6;:::i;:::-;11682:24;:::i;:::-;11740:18;;;;:::i;:::-;11762:4;472:36530;;;;;;11762:4;472:36530;;;;;;;11739:42;;;;;:::i;:::-;472:36530;;;11792:23;472:36530;;;;;11792:44;472:36530;;;11792:44;:::i;:::-;472:36530;;;;;11846:25;472:36530;;;;;11846:43;472:36530;;;11846:43;:::i;:::-;472:36530;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;11900:62;;;;;472:36530;;-1:-1:-1;;;11900:62:11;;10454:10;472:36530;11900:62;;472:36530;;;;;;;;;;;;;;;;;;11900:62;;;;;;;;11022:320;12010:18;;;;;:::i;:::-;472:36530;;;;;;11978:61;472:36530;10454:10;11978:61;;472:36530;;11900:62;;;;;:::i;:::-;472:36530;;11900:62;;;;472:36530;;;;11900:62;472:36530;;;;;;;;;11900:62;472:36530;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;11041:31;;11682:24;11041:31;;;;;;;;472:36530;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;32354:35;472:36530;;:::i;:::-;;;:::i;:::-;32354:35;;:::i;:::-;472:36530;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;2484:4:0;;:::i;:::-;26377:48:11;472:36530;26337:12;472:36530;26310:51;26318:31;;;;26310:51;:::i;:::-;472:36530;;;;;;;;;;26377:48;26337:12;472:36530;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;2484:4:0;;:::i;:::-;23400:32:11;;;:::i;:::-;-1:-1:-1;;;;;;472:36530:11;;;;23451:15;472:36530;;;;;;;;;;;;;1755:6;23506:18;;:60;;;472:36530;;;;;;;23451:15;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;472:36530;1755:6;;;472:36530;;2484:4:0;;:::i;:::-;472:36530:11;;;23451:15;472:36530;;5121:53;472:36530;;;;;;5121:53;:::i;:::-;827:238:15;;;25933:64:11;;;472:36530;;;;;23740:49;472:36530;24287:40;472:36530;;;;26014:96;472:36530;;;24228:44;472:36530;;26039:14;472:36530;;;;;;;;;;;26063:14;472:36530;;;;;;;;;;;;;;;;;;;;;;;26014:96;472:36530;;;26039:14;472:36530;;;;;;;;;;26063:14;472:36530;;;;;;;;;;;;;;;;23740:49;472:36530;;;;;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;23902:23;472:36530;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;23969:34;;;;;1755:6;;;:::i;:::-;;;;24085:133;472:36530;24085:133;;1755:6;24192:15;472:36530;24085:133;;1755:6;472:36530;;;24228:15;472:36530;;;;;24228:44;:::i;:::-;472:36530;;;;;;;;;;;;;;24287:40;472:36530;;;;;;25933:64;25974:23;;;;25933:64;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;23506:60;827:238:15;;;;23506:60:11;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1896:60;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;36387:15;472:36530;;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;;;36468:53;;;;:::i;:::-;;36540:33;1755:6;472:36530;;;;;1755:6;472:36530;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;1315:72:8;;;:::i;:::-;12139:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;472:36530;;;12190:10;472:36530;;;;;;;:::i;:::-;;12236:15;;;1755:6;12139:10;472:36530;;;12293:14;472:36530;;;;;;;-1:-1:-1;;;;;472:36530:11;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12236:15;472:36530;;12376:54;;472:36530;:::i;:::-;12475:21;;;;1755:6;;;472:36530;;;;12535:19;;1755:6;12516:15;:38;472:36530;;;12573:14;;1755:6;12139:10;-1:-1:-1;;;;;472:36530:11;;;12573:28;472:36530;;12659:39;1755:6;12612:37;1755:6;;472:36530;12612:37;:::i;:::-;-1:-1:-1;;;;;472:36530:11;12667:15;;12659:39;:::i;:::-;472:36530;;;12190:10;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;472:36530;1755:6;;;472:36530;12830:3;472:36530;;12797:31;;;;;12852:23;;;;;:::i;:::-;1755:6;12852:35;12849:239;;472:36530;;12782:13;;12849:239;472:36530;;;;;;;;8905:17;;;472:36530;;;;;;;13157:23;12944:51;12907:88;12944:51;13157:433;12944:51;;;13013:35;12944:51;;:::i;:::-;1755:6;12907:34;12376:54;12907:31;;:34;;;:::i;13013:35::-;13121:25;;;1755:6;;;472:36530;;;13107:3;472:36530;;13107:39;472:36530;;;;;;13107:39;:::i;:::-;472:36530;;1755:6;;;;13447:22;13500:21;13447:22;;;1755:6;13500:21;;1755:6;472:36530;;;1755:6;;;;:::i;:::-;472:36530;1755:6;;13199:381;472:36530;13199:381;;1755:6;12139:10;472:36530;13199:381;;1755:6;12475:21;13199:381;;1755:6;13121:25;13199:381;;1755:6;13447:22;13199:381;;1755:6;13500:21;13199:381;;1755:6;12516:15;472:36530;13199:381;;1755:6;13157:23;:433;:::i;:::-;13600:13;472:36530;1755:6;;472:36530;;-1:-1:-1;;;;;472:36530:11;13600:64;;;;;472:36530;;-1:-1:-1;;;13600:64:11;;-1:-1:-1;;;;;472:36530:11;;;13600:64;;472:36530;12139:10;472:36530;;;;;;;;;;;;;;;;;;;;;13600:64;;;;;;;;12778:320;1755:6;;;472:36530;;;;;;13680:63;472:36530;12139:10;13680:63;;472:36530;;13600:64;;;;;:::i;:::-;472:36530;;13600:64;;;;472:36530;;;;12797:31;;13157:433;12797:31;;;;;13157:23;12797:31;;;472:36530;;;;;;;;;;;;:::i;:::-;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;5129:15;472:36530;;5121:53;472:36530;;;;;;5121:53;:::i;:::-;472:36530;;;;;;;;34873:14;472:36530;;;;;34873:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;5129:15;472:36530;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;;;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;34986:30;472:36530;;;;;;1755:6;34912:56;34929:22;;472:36530;34920:38;;34912:56;:::i;:::-;34986:22;:30;:::i;:::-;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;5129:15;472:36530;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;4723:26:0;472:36530:11;;;;:::i;:::-;4693:18:0;2484:4;4693:18;;-1:-1:-1;472:36530:11;3877:6:0;472:36530:11;;3877:6:0;472:36530:11;-1:-1:-1;472:36530:11;3877:22:0;472:36530:11;3786:120:0;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;;472:36530:11;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;-1:-1:-1;;;18700:45:11;;472:36530;;;;;;;;;;;;18700:45;;;;;;;;;;;472:36530;;;;18777:23;472:36530;;18841:43;472:36530;;;;18870:4;;18841:43;:::i;:::-;18918:23;;;:98;;;18953:4;18918:98;;19050:4;472:36530;;;;;;19050:4;472:36530;;;;;;;;19035:35;;;;:::i;18918:98::-;18961:26;;;:::i;:::-;18991:4;472:36530;;;;;;18991:4;472:36530;;;;;;;18960:56;;;;:::i;:::-;18918:98;;;472:36530;-1:-1:-1;;;472:36530:11;;;;;;;;18700:45;;;;472:36530;18700:45;;472:36530;18700:45;;;;;;472:36530;18700:45;;;:::i;:::-;;;472:36530;;;;;18700:45;;;;;;;-1:-1:-1;18700:45:11;;;472:36530;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1768:58;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;1315:72:8;;:::i;:::-;7049:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;7049:10;472:36530;;7103:14;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;;;;;;7268:14;472:36530;;;;;;7219:71;;472:36530;;;;;7358:14;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;;;472:36530:11;1745:53:6;;;7049:10:11;472:36530;1745:53:6;;472:36530:11;7444:4;472:36530;;;;;;;;;;;1745:53:6;;7547:24:11;;;1745:53:6;;;472:36530:11;;1745:53:6;:::i;:::-;;;:::i;:::-;7507:6:11;7049:10;;7507:6;:::i;7547:24::-;472:36530;;;7582:23;472:36530;;;;;7582:48;472:36530;;;7582:48;:::i;:::-;472:36530;;7677:4;472:36530;;;;;7677:4;472:36530;;;;;;;7661:35;;;;;:::i;:::-;472:36530;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;7706:60;;;;;472:36530;;-1:-1:-1;;;7706:60:11;;7049:10;472:36530;7706:60;;472:36530;;;;;;;;;;;;;;;;;;7706:60;;;;;;;;472:36530;-1:-1:-1;;472:36530:11;;;7802:23;;1755:6;472:36530;1755:6;:::i;:::-;;;;472:36530;7844:178;;7049:10;1755:6;;472:36530;7844:178;;1755:6;;;;7844:178;;;7888:15;;1755:6;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;1755:6;;472:36530;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;-1:-1:-1;;;;;;472:36530:11;;;;;;1755:6;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;1755:6;;472:36530;;;;1755:6;;5129:15;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;7049:10;8174:40;472:36530;;8174:40;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;7706:60;;;;;:::i;:::-;472:36530;;7706:60;;;;472:36530;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;:::i;:::-;;;;;;36694:10;472:36530;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;2484:4:0;;:::i;:::-;1755:6:11;25309:15;;;:41;;;472:36530;25301:61;;;:::i;:::-;472:36530;25396:11;472:36530;25378:39;;;;25396:11;472:36530;;;25309:41;-1:-1:-1;25339:11:11;472:36530;25328:22;;;25309:41;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;35529:14;472:36530;;;;;35529:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;;;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;35576:22;472:36530;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1580:49;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;:::i;:::-;;;;;;;;;;2930:29:0;472:36530:11;;;;;;-1:-1:-1;472:36530:11;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;1315:72:8;;:::i;:::-;2408:4;472:36530:11;1755:6;;;;;;;2427:20:8;472:36530:11;;;735:10:7;472:36530:11;;2427:20:8;472:36530:11;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;2484:4:0;;:::i;:::-;1755:6:11;24509:21;;472:36530;;;;;;24601:15;472:36530;;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;;24662:43;;;;:::i;:::-;;:54;1755:6;24734:35;;;;;:80;;;472:36530;;;;25140:59;472:36530;25080:44;25140:59;472:36530;;;1755:6;;;;:::i;:::-;;;;24934:136;472:36530;24934:136;;1755:6;24977:15;472:36530;24934:136;;1755:6;472:36530;;24601:15;472:36530;;;;;25080:44;:::i;:::-;472:36530;;25140:59;;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;25140:59;;;;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;24734:80;827:238:15;;;;24734:80:11;;472:36530;5129:15;472:36530;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;-1:-1:-1;;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;472:36530;;;;;;;;35239:14;472:36530;;;;;35239:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;5129:15;472:36530;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;35352:30;472:36530;;35278:56;472:36530;;;1755:6;;;;472:36530;35286:38;;35278:56;:::i;35352:30::-;;472:36530;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;5129:15;472:36530;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;877:40;472:36530;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;676:47;472:36530;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;19716:10;;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;36915:10;472:36530;;;;;;;;;5480:48;;472:36530;;5488:24;5480:48;:::i;:::-;472:36530;;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;19801:10;;;472:36530;;19864:10;;472:36530;;34391:7;;;;:::i;:::-;19988:21;;;;472:36530;;19716:10;20034:18;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20075:58:11;;472:36530;;;20075:58;;;472:36530;;;;19716:10;472:36530;;;;;;;;;;;;;;;;;20075:58;;;;;;;;;;;;20031:394;20075:68;;472:36530;;;;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;20171:72;;;;;472:36530;;-1:-1:-1;;;20171:72:11;;-1:-1:-1;;;;;472:36530:11;;;20171:72;;472:36530;19716:10;472:36530;;;;;;;;;;;;;;;;;;;;;20171:72;;;;;;;;20031:394;-1:-1:-1;472:36530:11;;;;;;;;;;;;;-1:-1:-1;;;20257:61:11;;-1:-1:-1;;;;;472:36530:11;;;20257:61;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;20257:61;;;;;;;;;;;;;20674:5;20257:61;20713:5;20257:61;;;20031:394;;20674:5;:::i;:::-;20713;:::i;:::-;472:36530;;20765:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;20890:32;472:36530;20890:32;;472:36530;;;;;;20765:14;472:36530;;;;;20967:25;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;21030:4;472:36530;;;;;21030:4;472:36530;;;21021:27;21144;21347:47;21021:27;;;21030:4;21081:22;21021:27;21240:42;21021:27;;;;:::i;:::-;21081:22;;;:::i;:::-;472:36530;21144:27;;:::i;:::-;472:36530;;21190:40;472:36530;;;21190:40;:::i;:::-;472:36530;;;;21240:42;:::i;:::-;472:36530;;;21292:30;;:45;472:36530;;;21292:45;:::i;:::-;472:36530;;;;21347:47;:::i;:::-;472:36530;;21404:33;21440:15;21404:33;;472:36530;;;;;;;;20257:61;;;472:36530;20257:61;472:36530;20257:61;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;472:36530;;;;;;;;;20171:72;;;;;:::i;:::-;472:36530;;20171:72;;;;472:36530;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;20075:58;;;;472:36530;20075:58;;472:36530;20075:58;;;;;;472:36530;20075:58;;;:::i;:::-;;;472:36530;;;;;;;20075:58;;;;;;-1:-1:-1;20075:58:11;;;472:36530;;;;;;;;;20031:394;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;-1:-1:-1;;;20347:67:11;;19716:10;20347:67;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20347:67;472:36530;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;2484:4:0;;;:::i;:::-;22458:32:11;;;:::i;:::-;;22500:35;;;:::i;:::-;-1:-1:-1;472:36530:11;;-1:-1:-1;;;22585:39:11;;22618:4;472:36530;22585:39;;472:36530;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;22585:39;;;;;;;;;;472:36530;22585:39;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;22640:38;;;;472:36530;;22585:39;;472:36530;22585:39;;472:36530;22585:39;;;;;;472:36530;22585:39;;;:::i;:::-;;;472:36530;;;;22585:39;472:36530;;22585:39;;;;;-1:-1:-1;22585:39:11;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;812:58;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;2484:4:0;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;36915:10;472:36530;;;;;;;;;;;;;;36915:10;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;;;6559:26;472:36530;;6559:26;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;5940:15:11;472:36530;;;;;;;;5929:26;5921:54;5929:26;;;;5921:54;:::i;:::-;-1:-1:-1;;;;472:36530:11;;;;;-1:-1:-1;;;472:36530:11;;5940:15;472:36530;6069:39;;;;472:36530;;;;;;;;;;;;;;;;1690:27;472:36530;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;;;2484:4:0;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;827:238:15;;;25933:64:11;;;472:36530;;;;;;;26039:14;472:36530;;;26014:96;472:36530;;;;;;;;26063:14;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;26014:96;472:36530;;;26039:14;472:36530;;;;;;;;26063:14;472:36530;;;;;;;;25933:64;25974:23;;;;25933:64;;472:36530;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;2484:4:0;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;36915:10;472:36530;;;;;;;;;;;;;36915:10;472:36530;;;;;1755:6;;-1:-1:-1;;1755:6:11;6301:4;1755:6;;;6321:24;472:36530;;6321:24;472:36530;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;2484:4:0;;:::i;:::-;25554:39:11;;;:::i;:::-;-1:-1:-1;25628:9:11;472:36530;-1:-1:-1;;;;;472:36530:11;;;;;;;;25611:26;;;472:36530;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;25654:41;;472:36530;25654:41;-1:-1:-1;;;;;;472:36530:11;;25628:9;472:36530;;;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;472:36530:11;;;;;2140:9:8;2136:62;;472:36530:11;1755:6;;;;2674:22:8;472:36530:11;;;735:10:7;472:36530:11;;2674:22:8;472:36530:11;;2136:62:8;-1:-1:-1;;;2172:15:8;;472:36530:11;2172:15:8;;472:36530:11;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;36054:14;472:36530;;;;;36054:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;;1755:6;;;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;36109:31;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;;;;;2484:4:0;;:::i;:::-;5657:14:11;472:36530;;;;;;;;5646:25;5638:53;5646:25;;;;5638:53;:::i;:::-;-1:-1:-1;;;;472:36530:11;;;;;-1:-1:-1;;;472:36530:11;;5657:14;472:36530;5783:38;;;;472:36530;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;735:10:7;-1:-1:-1;;;;;472:36530:11;;5397:34:0;5393:102;;5505:37;472:36530:11;;;5505:37:0;:::i;5393:102::-;-1:-1:-1;;;5454:30:0;;472:36530:11;5454:30:0;;472:36530:11;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;-1:-1:-1;;;19221:45:11;;472:36530;;;;;;;;;;;;19221:45;;;;;;;;;;;472:36530;;;;19298:23;472:36530;;19362:43;472:36530;;;;19391:4;;19362:43;:::i;:::-;19439:23;;;:98;;;;472:36530;19588:4;19563:21;19439:98;;472:36530;;19563:21;:::i;:::-;472:36530;;;;;;;19439:98;19482:26;;;:::i;:::-;472:36530;19512:4;472:36530;;;;;;19512:4;472:36530;;;;;;;19481:56;19563:21;19481:56;472:36530;19481:56;19588:4;19481:56;;:::i;:::-;19439:98;;19221:45;;;;472:36530;19221:45;;472:36530;19221:45;;;;;;472:36530;19221:45;;;:::i;:::-;;;472:36530;;;;;19221:45;;;;;;;-1:-1:-1;19221:45:11;;;472:36530;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;32083:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;32173:35;472:36530;;;;;;1755:6;;32173:35;;:::i;:::-;472:36530;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;4306:25:0;472:36530:11;;;;:::i;:::-;4276:18:0;2484:4;4276:18;;-1:-1:-1;472:36530:11;3877:6:0;472:36530:11;;3877:6:0;472:36530:11;-1:-1:-1;472:36530:11;3877:22:0;472:36530:11;3786:120:0;;2484:4;4306:25;:::i;472:36530:11:-;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;35750:14;472:36530;;;;;35750:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;34391:7;472:36530;;:::i;:::-;;;:::i;:::-;34391:7;;:::i;472:36530::-;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;1635:49;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;472:36530:11;3877:6:0;472:36530:11;;3877:6:0;472:36530:11;-1:-1:-1;472:36530:11;3877:22:0;472:36530:11;3786:120:0;;472:36530:11;;;;;;;;:::i;:::-;33272:15;;;;33258:29;;472:36530;;;;;;;;;;;;33346:14;472:36530;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;;1755:6;;;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;-1:-1:-1;;;;;472:36530:11;;;;33428:15;472:36530;;;;;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;;33509:43;;;;:::i;:::-;;33563:32;1755:6;;33605:155;;472:36530;33272:15;;;33792:29;27393:578;33272:15;;;33792:29;;:::i;:::-;1755:6;;33914:33;;1755:6;27393:578;;;472:36530;;;;;;;33605:155;27393:578;33714:35;;;;;33792:29;33714:35;;:::i;:::-;33605:155;;;;472:36530;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;32541:26;;32602:35;;;;;:::i;:::-;472:36530;;;;;;;;;32678:14;472:36530;;;;;32678:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;;;32717:140;32771:3;32740:22;;472:36530;;32736:33;;;;;472:36530;32808:25;472:36530;32808:25;;32790:56;32808:25;;:::i;:::-;;:38;1755:6;32790:56;;:::i;:::-;32771:3;472:36530;32721:13;;;32736:33;;472:36530;32736:33;472:36530;;226:54:15;;472:36530:11;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;:::i;:::-;;;;36806:3;472:36530;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;5129:15;472:36530;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;472:36530;;;;;;;;34205:14;472:36530;;;;;34205:29;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;5129:15;472:36530;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;5129:15;472:36530;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;-1:-1:-1;;;;;472:36530:11;;;;;5129:15;472:36530;;;;;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;1315:72:8;;:::i;:::-;13910:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;472:36530;5244:14;472:36530;;;;;;13910:10;472:36530;;13980:14;472:36530;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;13910:10;14055:6;13910:10;;14055:6;:::i;:::-;14095:24;;;:::i;:::-;472:36530;;;14234:28;472:36530;14234:28;;472:36530;;;827:238:15;;;14294:158:11;;;;472:36530;;;;;;14670:16;472:36530;;;14659:10;472:36530;;;;;;16238:29;-1:-1:-1;;16422:28:11;;8905:17;;472:36530;;;;;;;;;16559:45;472:36530;;;;;;16419:782;14713:15;;472:36530;;;;;14765:23;472:36530;;;;;14765:50;472:36530;;;14765:50;:::i;:::-;472:36530;;;;;14825:25;472:36530;;;;;14825:49;472:36530;;;14825:49;:::i;:::-;472:36530;;14923:4;472:36530;;;;;14923:4;472:36530;;;14908:35;;;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;14973:53;;13910:10;472:36530;14973:53;;472:36530;14973:53;;;;;;;;;;;16419:782;15040:24;;;;:56;;;;16419:782;15037:85;;16419:782;-1:-1:-1;472:36530:11;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;15133:62;;;;;472:36530;;-1:-1:-1;;;15133:62:11;;13910:10;472:36530;15133:62;;472:36530;;;;;;;;;;;;;;;;;;15133:62;;;;;;;;16419:782;472:36530;;15251:11;472:36530;1755:6;472:36530;1755:6;472:36530;;;;15229:34;1755:6;15229:34;;;:::i;:::-;472:36530;15294:26;;15339;15294;;;;:::i;:::-;15339;;:::i;:::-;:42;1755:6;;15455:12;15520:398;13910:10;;15455:12;;:::i;:::-;472:36530;;;15479:3;472:36530;;;;;15479:30;472:36530;;;15479:30;:::i;:::-;472:36530;;15520:23;472:36530;;1755:6;;;;:::i;:::-;472:36530;1755:6;;15562:346;472:36530;15562:346;;1755:6;13910:10;472:36530;15562:346;;1755:6;15562:346;;;;1755:6;15562:346;;;;1755:6;15562:346;472:36530;15562:346;;1755:6;15834:15;15562:346;;;1755:6;15834:15;472:36530;15562:346;;1755:6;15520:23;:398;:::i;:::-;472:36530;;;;;;1755:6;;472:36530;;1755:6;;472:36530;15934:82;15562:346;13910:10;15934:82;;472:36530;;1755:6;472:36530;;-1:-1:-1;;;1755:6:11;;472:36530;;1755:6;;;14825:25;472:36530;1755:6;;472:36530;-1:-1:-1;;;472:36530:11;;;1755:6;;;;472:36530;-1:-1:-1;;;472:36530:11;;;;;;;;15133:62;;;;;:::i;:::-;472:36530;;15133:62;;;;15037:85;15098:24;;15037:85;;;15040:56;472:36530;;;15068:28;15040:56;;14973:53;;;;472:36530;14973:53;;472:36530;14973:53;;;;;;472:36530;14973:53;;;:::i;:::-;;;472:36530;;;;;;;14973:53;;;;;;-1:-1:-1;14973:53:11;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;16419:782;16767:41;;;;;;;;;;;472:36530;16824:39;472:36530;;;16824:39;:::i;:::-;472:36530;;16764:437;16419:782;;16764:437;16930:45;;;;17057:40;16930:45;;;472:36530;;17057:40;:::i;:::-;17111:37;472:36530;;;17111:37;:::i;:::-;472:36530;;16764:437;16419:782;;14294:158;226:54:15;14346:73:11;;;;;-1:-1:-1;14346:105:11;;14294:158;;;;;14346:105;-1:-1:-1;;;14423:28:11;;14346:105;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2649:47:0;;;:87;;;;472:36530:11;;;;;;;;;;2649:87:0;-1:-1:-1;;;829:40:9;;-1:-1:-1;2649:87:0;;;472:36530:11;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;;;;;;;;;;;;;5129:15;472:36530;;5121:53;472:36530;;;;;;5121:53;:::i;:::-;1315:72:8;;:::i;:::-;8369:10:11;472:36530;;36915:10;472:36530;;5480:48;472:36530;;;;;;5488:24;5480:48;:::i;:::-;8450:6;8369:10;;8450:6;:::i;:::-;8490:24;;;:::i;:::-;8369:10;;472:36530;;8557:14;472:36530;;;;;;;;;;;;;;;;8705:28;472:36530;8705:28;;472:36530;;;827:238:15;;;8765:158:11;;;;472:36530;;;;;;9016:16;472:36530;;;9005:10;472:36530;;;;;9195:54;16238:29;472:36530;16310:20;472:36530;;8905:17;;;16422:28;;16419:782;8905:17;;;472:36530;;;;;;;;;16559:45;472:36530;;;;;;16419:782;472:36530;17237:22;;472:36530;;;5129:15;17288:25;;472:36530;;;9268:15;;472:36530;;5129:15;9345:31;;9016:16;472:36530;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;:::i;:::-;;;;;;9410:23;472:36530;;9410:60;472:36530;;;;;;9410:60;:::i;:::-;472:36530;;;;;;;9480:25;472:36530;;9480:59;472:36530;;;;;;9480:59;:::i;:::-;472:36530;;9587:4;472:36530;;;;;9587:4;472:36530;;;;9573:33;;;;:::i;:::-;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;9636:53;;8369:10;472:36530;9636:53;;472:36530;9636:53;;;;;;;472:36530;9636:53;;;16419:782;9703:24;;;;:56;;;;;16419:782;9700:85;;;16419:782;-1:-1:-1;472:36530:11;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;9796:62;;;;;472:36530;;-1:-1:-1;;;9796:62:11;;8369:10;472:36530;9796:62;;472:36530;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;-1:-1:-1;;9796:62:11;;;;;;;472:36530;9796:62;9893:24;9796:62;;;16419:782;-1:-1:-1;472:36530:11;;-1:-1:-1;;;;;;472:36530:11;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;9893:24;472:36530;9927:14;;;472:36530;;-1:-1:-1;;;;;;472:36530:11;8369:10;472:36530;;;;;;9964:21;;;472:36530;;;10033:15;10009:21;;;472:36530;;;10107:12;472:36530;;9016:16;10058:19;;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10241:107;;472:36530;;10241:107;472:36530;;;;;;9796:62;472:36530;9796:62;;;:::i;:::-;472:36530;9796:62;;;472:36530;;;;;;;;;9700:85;9761:24;-1:-1:-1;9700:85:11;;;9703:56;472:36530;;;9731:28;9703:56;;;9636:53;;;;472:36530;9636:53;;472:36530;9636:53;;;;;;472:36530;9636:53;;;:::i;:::-;;;472:36530;;;;;9636:53;;;;;;;-1:-1:-1;9636:53:11;;472:36530;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;16419:782;16767:41;;;;;;;;;16764:437;16767:41;;;472:36530;16824:39;472:36530;;;16824:39;:::i;:::-;472:36530;;16764:437;16419:782;;16764:437;16930:45;;;;17057:40;16930:45;472:36530;16930:45;472:36530;;17057:40;:::i;:::-;17111:37;472:36530;;;17111:37;:::i;:::-;472:36530;;16764:437;16419:782;;472:36530;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;8765:158;226:54:15;8817:73:11;;;;;-1:-1:-1;8817:105:11;;8765:158;;;;;8817:105;-1:-1:-1;;;8894:28:11;;8817:105;;472:36530;;;;-1:-1:-1;;;;;472:36530:11;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;472:36530:11;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;;-1:-1:-1;472:36530:11;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;1755:6;472:36530;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;1745:53:6;;472:36530:11;;;;;;;;;;;;;;;;:::o;1755:6::-;;;;-1:-1:-1;;;1755:6:11;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;1755:6;;;;;;;;;;;;;-1:-1:-1;;;;;;472:36530:11;;;1755:6;472:36530;;;1755:6;;;;472:36530;;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;1755:6;;;;;;;;;472:36530;1755:6;;472:36530;;-1:-1:-1;;;;;;472:36530:11;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;1755:6;;;;;;;472:36530;1755:6;;;;;;;472:36530;;1755:6;;;;;;472:36530;1755:6;;;;;;;472:36530;1755:6;;;;472:36530;1755:6::o;472:36530::-;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;1755:6;;472:36530;;-1:-1:-1;;;;;472:36530:11;;;;;;1755:6;472:36530;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;1755:6;472:36530::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5067:125::-;-1:-1:-1;;;;;472:36530:11;;;;;;;5129:15;472:36530;;;;;;5121:53;;472:36530;;5121:53;:::i;:::-;472:36530;;34417:23;472:36530;;;;;;;;;;;;;;34417:48;472:36530;;;;;;;;;34417:48;;472:36530;;;;;;34417:23;:48;;472:36530;34417:48;;;;;;;472:36530;34417:48;;;5184:1;5067:125;:::o;34417:48::-;;;472:36530;34417:48;;472:36530;34417:48;;;;;;472:36530;34417:48;;;:::i;:::-;;;472:36530;;;;;5067:125;:::o;34417:48::-;;;-1:-1:-1;34417:48:11;;472:36530;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;34478:179;472:36530;34611:39;34478:179;34562:32;;;:::i;:::-;-1:-1:-1;472:36530:11;;-1:-1:-1;;;34611:39:11;;34644:4;34611:39;;;472:36530;;;;;;-1:-1:-1;;;;;472:36530:11;34611:39;;;;;;;-1:-1:-1;34611:39:11;;;34604:46;34478:179;:::o;472:36530::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;1755:6;;;;:::i;:::-;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;;;;;;;-1:-1:-1;472:36530:11;;;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;;1755:6;;472:36530;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;1755:6;472:36530;;;;;1755:6;472:36530;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;-1:-1:-1;;;472:36530:11;;;;;;;;;;;;;;-1:-1:-1;;472:36530:11;;;;;;:::i;:::-;;;8905:17;;;472:36530;;;;;;;;;:::o;:::-;;;;;;;;;;;;1878:128:8;472:36530:11;1796:7:8;472:36530:11;;1939:61:8;;1878:128::o;1939:61::-;1974:15;;;1796:7;1974:15;;1796:7;1974:15;17414:731:11;;472:36530;;;;;;;-1:-1:-1;472:36530:11;17524:14;472:36530;;;-1:-1:-1;472:36530:11;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;17563:32;-1:-1:-1;17652:31:11;;;;472:36530;;;17649:155;;17414:731;17872:4;17843:43;17897:28;17872:4;;17843:43;:::i;:::-;17897:28;;472:36530;17992:15;472:36530;;;;;;;;;-1:-1:-1;472:36530:11;18018:22;472:36530;;17992:15;472:36530;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;18076:25;472:36530;;;-1:-1:-1;472:36530:11;;17414:731::o;17649:155::-;17758:35;;;;:::i;:::-;17649:155;;;;18151:405;-1:-1:-1;;;;;472:36530:11;;;;;;;18277:23;472:36530;;;;;;;;;;;;-1:-1:-1;;;18277:45:11;;472:36530;;;;;18277:23;472:36530;;;18277:45;;;;;;;472:36530;18277:45;;;18151:405;-1:-1:-1;18336:23:11;;;18375:19;;18390:4;18332:218;18151:405::o;18332:218::-;472:36530;18442:67;472:36530;;;18442:23;472:36530;;;;;;;;;18476:25;472:36530;;;;;;18442:67;;:::i;:::-;472:36530;18513:4;472:36530;;;;;;18513:4;472:36530;;;;;;;18440:99;;;:::i;:::-;18332:218;18151:405::o;18277:45::-;;;;472:36530;18277:45;;472:36530;18277:45;;;;;;472:36530;18277:45;;;:::i;:::-;;;472:36530;;;;;18277:45;;;;;;;-1:-1:-1;18277:45:11;;1219:160:6;472:36530:11;;-1:-1:-1;;;1328:43:6;;;;-1:-1:-1;;;;;472:36530:11;;;;1328:43:6;;;472:36530:11;;;;;;;;;1328:43:6;;;;;;472:36530:11;;1328:43:6;:::i;:::-;;:::i;27983:3935:11:-;;;;-1:-1:-1;;;;;472:36530:11;28215:4;28198:22;;28215:4;;-1:-1:-1;472:36530:11;28266:14;472:36530;;;-1:-1:-1;472:36530:11;;;;;;;;-1:-1:-1;472:36530:11;;;;-1:-1:-1;472:36530:11;;;;1755:6;;;:::i;:::-;472:36530;;1755:6;;472:36530;;;;;;;;1755:6;;;472:36530;;;;;;;;1755:6;;;472:36530;;;;;:::i;:::-;;;;1755:6;472:36530;;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;-1:-1:-1;472:36530:11;;;;;;;-1:-1:-1;;;;472:36530:11;;;1755:6;472:36530;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;-1:-1:-1;472:36530:11;;;;;;;;;;;;;;1755:6;;;;;;28195:514;;472:36530;;;;;;-1:-1:-1;472:36530:11;28762:15;472:36530;;;-1:-1:-1;472:36530:11;;;;;;;:::i;:::-;;1755:6;472:36530;;1755:6;;;:::i;:::-;472:36530;;;;;;;-1:-1:-1;472:36530:11;;-1:-1:-1;472:36530:11;-1:-1:-1;472:36530:11;;;;;;;;;;;;;8905:17;;;472:36530;;;;;;;28902:37;;;;:::i;:::-;;28953:21;;;28950:34;;472:36530;29508:34;;1755:6;;;;29508:54;;29505:2407;29508:54;;;29828:15;;;;30061:28;29828:15;;472:36530;29828:34;27393:578;29828:15;;:34;:::i;:::-;29963:33;;1755:6;27393:578;;;30061:28;;:::i;29505:2407::-;-1:-1:-1;30546:22:11;;;30587:13;-1:-1:-1;30602:20:11;;;;;;30582:216;30866:51;30960:20;;;;;;1755:6;;;;;31873:28;1755:6;;472:36530;31622:52;27393:578;1755:6;;31622:15;:52;:::i;30982:3::-;31008:6;;;;;;31005:19;;31069:57;:18;472:36530;31069:18;;;;:::i;:::-;;:30;1755:6;31069:57;:::i;:::-;-1:-1:-1;;472:36530:11;;;;;;;;31243:22;472:36530;31243:22;27393:578;31243:22;;;:::i;:::-;;:33;1755:6;27393:578;;;;472:36530;31376:18;;;;:::i;:::-;;:30;1755:6;472:36530;;30982:3;30936:22;472:36530;30936:22;;;;;31005:19;31016:8;;472:36530;31016:8;;;30624:3;472:36530;30670:18;;;;;;;:::i;:::-;;:30;1755:6;30651:49;;30647:137;;472:36530;;30587:13;;;;;;30647:137;30724:14;30760:5;;-1:-1:-1;30760:5:11;;;28950:34;-1:-1:-1;;;;;;;;28976:8:11:o;472:36530::-;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1755:6;;;:::i;:::-;472:36530;;;;;;;;1755:6;;472:36530;;;;;;;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;1755:6;472:36530;;;;;;;;;;;28195:514;-1:-1:-1;;;;;;472:36530:11;;-1:-1:-1;472:36530:11;;;28535:23;472:36530;;;;;;;;;28599:22;472:36530;;;;;;28665:25;472:36530;;;;;;;;28195:514;;3175:103:0;735:10:7;472:36530:11;;;;;;;;;;;;;3495:23:0;3491:108;;3175:103::o;3491:108::-;3541:47;;;472:36530:11;3541:47:0;735:10:7;3541:47:0;472:36530:11;;;;;;3541:47:0;3175:103;735:10:7;-1:-1:-1;472:36530:11;;;;;;;;;;;;3495:23:0;3491:108;;3175:103::o;3491:108::-;3541:47;;;-1:-1:-1;3541:47:0;735:10:7;3541:47:0;472:36530:11;1330:24;472:36530;;;-1:-1:-1;3541:47:0;3175:103;-1:-1:-1;472:36530:11;;;2930:6:0;472:36530:11;;;;;;;;735:10:7;472:36530:11;;;;;;;;;;3495:23:0;3491:108;;3175:103;:::o;3491:108::-;3541:47;;;-1:-1:-1;3541:47:0;735:10:7;3541:47:0;472:36530:11;;;;-1:-1:-1;3541:47:0;6155:316;472:36530:11;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;1755:6;;-1:-1:-1;;1755:6:11;;;;;;735:10:7;;472:36530:11;;6346:40:0;;472:36530:11;6346:40:0;2930:6;6400:11;:::o;6248:217::-;6442:12;;472:36530:11;6442:12:0;:::o;6708:317::-;472:36530:11;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;;;;;;;2930:6:0;472:36530:11;;;;;;;;-1:-1:-1;;;;;472:36530:11;;;;;;;;;;;;;1755:6;;-1:-1:-1;;1755:6:11;;;735:10:7;;472:36530:11;;6900:40:0;;472:36530:11;6900:40:0;2930:6;6954:11;:::o;292:438:15:-;377:326;;;719:4;292:438;:::o;377:326::-;;;;;;;;;;;;;;;8370:720:6;;-1:-1:-1;8507:421:6;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:6;;8942:15;;-1:-1:-1;;;;;;472:36530:11;;8960:26:6;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;-1:-1:-1;;;;9033:40:6;;;-1:-1:-1;;;;;472:36530:11;;;;9033:40:6;472:36530:11;;;9033:40:6;8942:68;9009:1;8994:16;;8942:68;","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"addSupportedToken(address,uint256,uint256,uint256,address)","signatureHash4":"0xe8690bc2","signatureHash32":"0xe8690bc226fa46b47376657e1e2479e023213afd65083929a3c14547e3b6b006"},{"signature":"addToBlacklist(address)","signatureHash4":"0x44337ea1","signatureHash32":"0x44337ea107166c7ad3dbedb6b1f494593ab8e7d94a08cf3286dd789966e242a5"},{"signature":"cancelClaim(uint256,address)","signatureHash4":"0xf7192ba8","signatureHash32":"0xf7192ba8dec56034964ef59fe9cdd49ee8cefb511478835da4671f3d987f9e48"},{"signature":"claim(uint256,address)","signatureHash4":"0xddd5e1b2","signatureHash32":"0xddd5e1b2a7099d9f5cf575fd6d5e5b7eb29e614e3ac3999bb2d6291fd5fe3688"},{"signature":"convertToAssets(uint256,address)","signatureHash4":"0x36103291","signatureHash32":"0x36103291f2248b001d9e051333c200deeea29174111a54a6ee2fae936a33c9c1"},{"signature":"convertToShares(uint256,address)","signatureHash4":"0xd295fa9a","signatureHash32":"0xd295fa9ac1dcd4891afc154e3297884d127030a665ed3e5d39d3c9c51ea99acb"},{"signature":"DEFAULT_ADMIN_ROLE()","signatureHash4":"0xa217fddf","signatureHash32":"0xa217fddfde7807bb766525e432eeeecaaf4de889a05e8df9fb827257fb978cf4"},{"signature":"emergencyWithdraw(address,address)","signatureHash4":"0x6382d9ad","signatureHash32":"0x6382d9ad78b87b44aecd0f996e9f00a51827309567588bdbc98b6238777c9d1a"},{"signature":"flashWithdrawWithPenalty(address,uint256)","signatureHash4":"0x04d3a96d","signatureHash32":"0x04d3a96d825d743fc46414bf803c368f22da31664de40a576e68b6287e212c2d"},{"signature":"getClaimableAssets(address,address)","signatureHash4":"0x32cf58c4","signatureHash32":"0x32cf58c49364f6d8be07684c1797ad3e3c4d9fad50d2773238b616a9436435d6"},{"signature":"getClaimableRewards(address,address)","signatureHash4":"0xf56f4f0f","signatureHash32":"0xf56f4f0f6c174b3e619073241ff97e144994899732f69f160c40ce256fcf9b94"},{"signature":"getClaimableRewardsWithTargetTime(address,address,uint256)","signatureHash4":"0x21696783","signatureHash32":"0x216967836129361e395fc7fc87aec757a04cf4e5a7e34f6f6d64186476daaf73"},{"signature":"getClaimHistory(address,address,uint256)","signatureHash4":"0x7c395b13","signatureHash32":"0x7c395b132a0c1ebfa089ce1b7f668782570a388fa182149cd32ed3891c589763"},{"signature":"getClaimHistoryLength(address,address)","signatureHash4":"0x2d4abd2d","signatureHash32":"0x2d4abd2d37ef49bf04281c238029ad87d15e95035e5eb4fe8fffa51fa806309c"},{"signature":"getClaimQueueIDs(address,address)","signatureHash4":"0x3a33a4f8","signatureHash32":"0x3a33a4f8c4d0b096e87156f8ae4a4040b86e722f973b7a31ca0eef438c6f8c3f"},{"signature":"getClaimQueueInfo(uint256)","signatureHash4":"0xabd42922","signatureHash32":"0xabd42922c36831c995a988a8f688541dc34a6589c055952c0679e312de5197f4"},{"signature":"getContractBalance(address)","signatureHash4":"0x43ab265f","signatureHash32":"0x43ab265f5824e3ff22d7c043f308b026b98539183945927aa7ad7b52282c13f9"},{"signature":"getCurrentRewardRate(address)","signatureHash4":"0xe30227ea","signatureHash32":"0xe30227eacff6110a69019f8c1953bb98ecd6d257a8ae0da72e4fe0dbc9d4506f"},{"signature":"getLPTokenAmount(address,address)","signatureHash4":"0x2647d929","signatureHash32":"0x2647d9292bbe070ae56ff78849d184ce0270d2d25d15943c9230857665034377"},{"signature":"getRoleAdmin(bytes32)","signatureHash4":"0x248a9ca3","signatureHash32":"0x248a9ca39e7e298ea3bbd193e7d36b87492efea84ff513fd03940aaa5bc0d98f"},{"signature":"getStakedAmount(address,address)","signatureHash4":"0x0db14e95","signatureHash32":"0x0db14e951aaafc71100620bfe24ff3a31239d946f17130a756715bbb72b26375"},{"signature":"getStakeHistory(address,address,uint256)","signatureHash4":"0xda57c7d7","signatureHash32":"0xda57c7d73b530c0c8c24c0f23b1f5e3cfe381e15b0619a54ffcd864d59a2cc1b"},{"signature":"getStakeHistoryLength(address,address)","signatureHash4":"0x9ed9e483","signatureHash32":"0x9ed9e48328e4ef1469acc4165eb3f6bc103143b7c0057fcb9deb8b5f9a255179"},{"signature":"getTotalRewards(address,address)","signatureHash4":"0x1a9be40a","signatureHash32":"0x1a9be40ac3fab29922f1a2ad4a5033ca65ec224731765ab296743277f90c1e5b"},{"signature":"getTVL(address)","signatureHash4":"0x0f40517a","signatureHash32":"0x0f40517ab45be0e832212e1f5af72c3266f2a9cb8b131b2f9304d3e17e6ae246"},{"signature":"grantRole(bytes32,address)","signatureHash4":"0x2f2ff15d","signatureHash32":"0x2f2ff15deca029b64bbc0874ae59c8f39be024a95aa718b4c13ca407db350be8"},{"signature":"hasRole(bytes32,address)","signatureHash4":"0x91d14854","signatureHash32":"0x91d1485424b278bc736d5d34907ed48280c7188845bc82b33370da2b4dc1194e"},{"signature":"isBlacklisted(address)","signatureHash4":"0xfe575a87","signatureHash32":"0xfe575a87aab505e234db2b42c812533d8e3bd159f25615abf29ce636184a6cb4"},{"signature":"lastClaimQueueID()","signatureHash4":"0x6c0a188e","signatureHash32":"0x6c0a188e4916047fa32adf45787dddceac4209efe05434803e24f71582dbd438"},{"signature":"lpTokenToSupportedToken(address)","signatureHash4":"0x5f256757","signatureHash32":"0x5f2567572b960c20ebc7ed9e51335023d574d69dcf3e151095d23a006dde3875"},{"signature":"maxStakeAmount(address)","signatureHash4":"0x251d6ec3","signatureHash32":"0x251d6ec336d30e67ebd14cd67d714740a8ae78c83dbe2c53e44261c1ca47d5ce"},{"signature":"minStakeAmount(address)","signatureHash4":"0x95d322b0","signatureHash32":"0x95d322b0fe7a1ecba88ac548f70b38405ad7943c1bb485c7bf70e0fea2bf880c"},{"signature":"pause()","signatureHash4":"0x8456cb59","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89"},{"signature":"paused()","signatureHash4":"0x5c975abb","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2"},{"signature":"removeFromBlacklist(address)","signatureHash4":"0x537df3b6","signatureHash32":"0x537df3b66fac7a9b0818805a236bce981b5286c16703a3187b298e88974c6914"},{"signature":"renounceRole(bytes32,address)","signatureHash4":"0x36568abe","signatureHash32":"0x36568abe2c7e6c1d662bad0fe1760ac72cf2f9478a86be824d68ec83895c49e9"},{"signature":"requestClaim(address,uint256)","signatureHash4":"0x01e51e97","signatureHash32":"0x01e51e9738ab4810be0322de44a25e62dec7f26d6ac8f6b048b843be58a3435a"},{"signature":"revokeRole(bytes32,address)","signatureHash4":"0xd547741f","signatureHash32":"0xd547741fd8d55981251e167708119763c372f2b41e85a1468b0a759b055a009f"},{"signature":"setCancelEnable(bool)","signatureHash4":"0x4f8fe1f1","signatureHash32":"0x4f8fe1f1c25059b67bd167400ec712495629ffc5d28cc522e36fc9e42c790099"},{"signature":"setCustodian(address)","signatureHash4":"0x403f3731","signatureHash32":"0x403f373142267daf1b1ce513e544db9066412f4b0160b73df2487c98739311a2"},{"signature":"setFlashEnable(bool)","signatureHash4":"0x39de62a6","signatureHash32":"0x39de62a620ff1a9e82f0d1b446ce0c25acd06130cfc19b3a4b12806351c26991"},{"signature":"setPenaltyRate(uint256)","signatureHash4":"0xa1bab447","signatureHash32":"0xa1bab44748a973d32bad5690c21eb579862b9a01ab7c1611fef9a7cb79176c17"},{"signature":"setRewardRate(address,uint256)","signatureHash4":"0x812a71d5","signatureHash32":"0x812a71d5444a7261328e537bd0a2a5c73a71fbf4b47465622c060acf38e29a10"},{"signature":"setStakeLimit(address,uint256,uint256)","signatureHash4":"0x48d832cb","signatureHash32":"0x48d832cbd35d13a73bdd97ebd1700dafec85272680931507463018af9b3179e4"},{"signature":"setWaitingTime(uint256)","signatureHash4":"0xebc73e65","signatureHash32":"0xebc73e650737ae138f9b1d7111bfc69abc9505a614a63edc7371721c2be7a5b1"},{"signature":"stake(address,uint256)","signatureHash4":"0xadc9772e","signatureHash32":"0xadc9772e9f3b2218b39abb39e4dd00e4a7f4ca0809c2c3fd73a7011defd8a83f"},{"signature":"supportedTokens(address)","signatureHash4":"0x68c4ac26","signatureHash32":"0x68c4ac262668fdb5dee23d0d0eb875831ed63131e1229ea966e9e3b40854304a"},{"signature":"supportedTokenToLPToken(address)","signatureHash4":"0xd40549c0","signatureHash32":"0xd40549c03c3f69bce7c2eb4e80de091dbbe92c3e22619af2645be995da7cd3a0"},{"signature":"supportsInterface(bytes4)","signatureHash4":"0x01ffc9a7","signatureHash32":"0x01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2"},{"signature":"totalRewardsAmountByToken(address)","signatureHash4":"0xe315d804","signatureHash32":"0xe315d80493860901e0745e9b93bd1318d3594b158dcd9933269cc8bcd189eaad"},{"signature":"totalStakeAmountByToken(address)","signatureHash4":"0xcb0b8fe5","signatureHash32":"0xcb0b8fe528bc1917680caa38496ac910da59abc4b3f674ad2e343a0e8a6dd334"},{"signature":"transferOrTransferFrom(address,address,address,uint256)","signatureHash4":"0x66fd9d65","signatureHash32":"0x66fd9d6536873508404385d884ab0a992f98744535a99a169b66e82d73a833ed"},{"signature":"transferToCustodian(address,uint256)","signatureHash4":"0xf92396a6","signatureHash32":"0xf92396a66059830f7da28a11921325507ec27ee31e0b5a92e2f1c31d761ceeee"},{"signature":"unpause()","signatureHash4":"0x3f4ba83a","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc"},{"signature":"WAITING_TIME()","signatureHash4":"0x4d2b1444","signatureHash32":"0x4d2b1444b2608c0f7a9699522db1f1466071c263cdb7b3d6c0c3630069be972b"}],"event":[{"signature":"AddSupportedToken(address,uint256,uint256)","signatureHash4":"0xd9fe4a23","signatureHash32":"0xd9fe4a232fa59fb866233bcdccaf84797cdd30506e8fc261699d4daaff18e4cd"},{"signature":"BlacklistAdded(address)","signatureHash4":"0x44d5fe68","signatureHash32":"0x44d5fe68b00f68950fb9c1ff0a61ef7f747b1a36359a7e3a7f3324db4b878967"},{"signature":"BlacklistRemoved(address)","signatureHash4":"0x1747ca72","signatureHash32":"0x1747ca720b1a174a464b6513ace29b1d3190b5f632b9f34147017c81425bfde8"},{"signature":"CancelClaim(address,address,uint256,uint256)","signatureHash4":"0x16a8ebcb","signatureHash32":"0x16a8ebcbce0c773c9fc99b0335c37c4f8128bb11da6e765f86f0aa66c6735b18"},{"signature":"CancelStatusChanged(bool,bool)","signatureHash4":"0x84e3667a","signatureHash32":"0x84e3667aff0d15c7464eb61e79d9db356389b19a3a5024099a09272a7bf11ce9"},{"signature":"ClaimAssets(address,address,uint256,uint256)","signatureHash4":"0xdddf48d4","signatureHash32":"0xdddf48d4d866b99b4e98ab4756d69715555f0445680fe5941715d094c362c0fd"},{"signature":"CustodianReceive(address,address,uint256)","signatureHash4":"0x9a807a0a","signatureHash32":"0x9a807a0aa738d6044d48c5c9de37a3feca82572cc24c35edb35d109917bfdc85"},{"signature":"EmergencyWithdrawal(address,address)","signatureHash4":"0xf5b6d8b4","signatureHash32":"0xf5b6d8b404f034718f55a370884db03c4e27e9652e2636d4adcd0540d7c4203f"},{"signature":"FlashStatusChanged(bool,bool)","signatureHash4":"0x99859612","signatureHash32":"0x99859612a8514731da8547a1b97ab4654097e36c13fe2c98960ecd00f770747b"},{"signature":"FlashWithdraw(address,address,uint256,uint256,uint256,uint256)","signatureHash4":"0x25e5fc5e","signatureHash32":"0x25e5fc5e17630c84a29769f61ae2e034518bd1bea52fda17f68dfac82945c289"},{"signature":"LPTokenCreated(address)","signatureHash4":"0xd0aeff5e","signatureHash32":"0xd0aeff5ee0414a37d53ae5d5d0749db8eb77f7bd80c5bcc13a4d957c968a58f3"},{"signature":"Paused(address)","signatureHash4":"0x62e78cea","signatureHash32":"0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258"},{"signature":"RequestClaim(address,address,uint256,uint256,uint256,uint256)","signatureHash4":"0xf74fd5e7","signatureHash32":"0xf74fd5e710f6980415bf34eee17213a403024b8f5200924cf0ee2a498f3179ba"},{"signature":"RoleAdminChanged(bytes32,bytes32,bytes32)","signatureHash4":"0xbd79b86f","signatureHash32":"0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff"},{"signature":"RoleGranted(bytes32,address,address)","signatureHash4":"0x2f878811","signatureHash32":"0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d"},{"signature":"RoleRevoked(bytes32,address,address)","signatureHash4":"0xf6391f5c","signatureHash32":"0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b"},{"signature":"Stake(address,address,uint256)","signatureHash4":"0x99039fcf","signatureHash32":"0x99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f7"},{"signature":"Unpaused(address)","signatureHash4":"0x5db9ee0a","signatureHash32":"0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa"},{"signature":"UpdateCustodian(address,address)","signatureHash4":"0x5acdf21b","signatureHash32":"0x5acdf21b3c1ebdc40f4485018c9c919c5c6b2c9496b24122287484d2a58ee91e"},{"signature":"UpdatePenaltyRate(uint256,uint256)","signatureHash4":"0x2841fef9","signatureHash32":"0x2841fef93624d9d474e38055eb5f9d3a6a8c9fdf078b6790af293d5d31225e10"},{"signature":"UpdateRewardRate(address,uint256,uint256)","signatureHash4":"0x37709c0c","signatureHash32":"0x37709c0c7a143f7f128833da302459d5478d74b7775d223b5f77553310a221de"},{"signature":"UpdateStakeLimit(address,uint256,uint256,uint256,uint256)","signatureHash4":"0xe4b65af7","signatureHash32":"0xe4b65af790442ef39b02e91f9b1e0caf05cb7e3607b3525b51b8d26dc2738382"},{"signature":"UpdateWaitingTime(uint256,uint256)","signatureHash4":"0xe4200d45","signatureHash32":"0xe4200d45d2a3d89971b73afef9feb38c84ba9c3a34c7a5d971392dbd39969229"}],"error":[{"signature":"AccessControlBadConfirmation()","signatureHash4":"0x6697b232","signatureHash32":"0x6697b23232a647058342c0724fe7c415cab25915b54e5dbc03f233173d37b41c"},{"signature":"AccessControlUnauthorizedAccount(address,bytes32)","signatureHash4":"0xe2517d3f","signatureHash32":"0xe2517d3fbfae6f8515ef5ff1ccedc3933ab0cbbda0b492c06eb54ad10ef03b3e"},{"signature":"EnforcedPause()","signatureHash4":"0xd93c0665","signatureHash32":"0xd93c0665d6c96d04a8f174024fc4ddd66c250604aff22bbec808de86dd3637e3"},{"signature":"ExpectedPause()","signatureHash4":"0x8dfc202b","signatureHash32":"0x8dfc202bcfe9a735b559bee70674422512bc5c30f687046ae8778315fb81da44"},{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"56","address":"0xb82E32062C773c7748776C06FdB11B92EDAE3B63"}