Everyday giveaways up to 8.88BTC, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with BscScan and get 760% deposit bonus. Win Big$, withdraw it fast.
Join Pasino and get the daily chance to win US$100k and 0.5 BTC
5000+ Slots, Live casino games, 50+ cryptos, 100% bet insurance. Register with Bscscan and get 240% first deposit bonus.
Get a Welcome Bonus of 7 BTC + 250 Free Spins this season!
3000+ Slots, 20+ Cryptos, 75K Raffle, Sports Promos - World's largest Crypto Casino & Sportsbook - Provably Fair!
Overview
BNB Balance
BNB Value
$18,191,978,257.14 (@ $696.59/BNB)Token Holdings
Could not find any matches!
- BEP-20 Tokens (>100)86,977,793,438.3926 BIDRBIDR BEP20 (BIDR)$6,114,564.97@0.000116,692,829.5845878 CBIXCubiex (CBIX)$10,759.92@0.0006349 FREEFREE coin BS... (FREE)$0.00@0.002,000 INNBCInnovativeBi... (INNBC)57,057,782.8716718 LOVELYLovely Inu F... (LOVELY)$516,515.58@0.009110,000 STARStarium (STAR)3.456 ACTAcet Token (ACT)$0.04@0.01341,328,411.9058352 AIRTOKAirtok (AIRTOK)$183.91@0.00127.5420688 ALPACAAlpacaToken (ALPACA)$21.89@0.17160 ALPHAAlphaToken (ALPHA)$0.00@0.0835471,885,546.779513 ANKRAnkr (ANKR)$16,551,432.19@0.03510.00795729 ANYAnyswap-BEP2... (ANY)$0.04@4.72970.1 BANANAApeSwapFinan... (BANANA)$0.00@0.000613 ARGONArgonToken (ARGON)$0.01@0.00081 BabyApeBaby ApeCoin (BabyAp...)5,609,030,597.31536 BabyDogeBaby Doge Co... (BabyDo...)$17.61@0.00591,314.06741032 BAKEBakeryToken (BAKE)$151,576.33@0.2563140.65716545 BIFIbeefy.financ... (BIFI)$48,865.71@347.4113,794.47485466 BELBella Protoc... (BEL)$8,020.01@0.581460.23998262 BELTBELT Token (BELT)$3.53@0.05864.90581645 BETHBinance Beac... (BETH)$16,759.79@3,416.30911.26168224 bcFLUXbinance conf... (bcFLUX)$0.04@0.03510.00622957 AXSBinance-Peg ... (AXS)$0.04@6.2932,862.61077361 BANDBinance-Peg ... (BAND)$47,668.64@1.45054,990,750.79951183 BATBinance-Peg ... (BAT)$1,180,054.06@0.23644,215.42503421 BCHABinance-Peg ... (BCHA)$482,025.35@114.348485.03345705 COMPBinance-Peg ... (COMP)$37,880.97@78.099713,216.72798968 ATOMBinance-Peg ... (ATOM)$84,241.09@6.3738570,603.83820585 ELFBinance-Peg ... (ELF)$255,618.92@0.448818,354.95333289 EOSBinance-Peg ... (EOS)$643,441.86@0.7863942,934.00643927 IOTXBinance-Peg ... (IOTX)$36,031.49@0.038213.10170749 MKRBinance-Peg ... (MKR)$19,796.92@1,511.0181104,711.90671446 ONTBinance-Peg ... (ONT)$24,948.69@0.238372,658.88062112 DOTBinance-Peg ... (DOT)$496,453.05@6.8327219,768.2396909 SNXBinance-Peg ... (SNX)$644,097.94@2.930826,243.09412365 XTZBinance-Peg ... (XTZ)$34,987.18@1.33328,232,752.46174863 TCTBinance-Peg ... (TCT)$2,575.29@0.00031.7888981 YFIBinance-Peg ... (YFI)$15,120.65@8,452.4949757.04644261 YFIIBinance-Peg ... (YFII)$299,290.42@395.3396633.58453112 ZECBinance-Peg ... (ZEC)$37,835.33@59.716333 BLUBLU (BLU)$0.00@0.000 BOBBOB (BOB)$0.00@1.00252,063.46278405 BUNNYBunny Token (BUNNY)$141.76@0.06871,868.37540328 BURGERBurger Swap (BURGER)$1,386.52@0.742114,960,284.0218858 CANCanYaCoin (CAN)$285,503.01@0.019123.71954512 CDCash Driver (CD)$0.04@0.001679,048,277.5659197 CASCashaa (CAS)$289,784.66@0.0037265.985445 CTKCertiK Token (CTK)$202.11@0.75991 CHIChi Gastoken... (CHI)2,918,987,802.59225 COSContentos (COS)$22,298,994.33@0.00760 CREAMCream (CREAM)$0.00@13.19542,736,505.26325627 DFYDeFi For You... (DFY)$584.79@0.00021,418.03180014 FINADEFINA TOKEN (FINA)$3.85@0.00270.02 DEXShareDEXShare (DEXSha...)$0.00@0.0761 DwayDiseaseAway (Dway)$0.00@0.0008978,205,036.196966 DOSDOS Network ... (DOS)$578,823.48@0.00065 DUETDuet Governa... (DUET)$0.00@0.0005250,000,000 EADXEADX (EADX)$445,651.96@0.00181 EDEEDE (EDE)$0.05@0.0512459.64 EPSEllipsis (EPS)$10.23@0.02232 ENGENERGY COIN (ENG)$0.00@0.0044,757.77262763 ETHWEthereum PoW (ETHW)$149,938.54@3.352.2716 FANFANSPEL (FAN)$0.01@0.003549,744,796.0731643 FLOKIFLOKI (FLOKI)$8,768.52@0.00022,327,600,555 FwcFootball Wor... (Fwc)$0.03@0.000 FRAXFrax (FRAX)$0.00@0.99430 FXSFrax Share (FXS)$0.00@3.800 FRONTFrontier Tok... (FRONT)$0.00@0.37040.00000098 FRIESfry.world (FRIES)$0.00@138.491,980 FrzssFrz solar sy... (Frzss)$0.00@0.00945 HMSTRHamster Pilo... (HMSTR)9 ONEHarmony ONE (ONE)$0.25@0.02787 HEPHealth Potio... (HEP)$0.00@0.0025.06026555 ICEIceToken (ICE)$8.81@0.35160.1 WINGSJetSwap Toke... (WINGS)$0.00@0.003870,512 MKOALAKOALA TOKEN (MKOALA)25 LITHLITHENERGY (LITH)460,474,747.235267 LTOLTO Network (LTO)$72,255,642.33@0.15690 LNRLunar (LNR)$0.00@0.00320 MCRNMacaronSwap ... (MCRN)$0.00@0.02640.0000001 MCNMCNCOIN (MCN)$0.00@2.348211,864.57072522 MDTMeasurable D... (MDT)$738.43@0.062230,000,000 METAMUSKMETAMUSK (METAMU...)$0.01@0.00200 MTVMultiVAC (MTV)$0.19@0.00121,782,675.9244456 NPXBNapoleonX To... (NPXB)$181,105.96@0.00833,249.4341025 NDBNDB (NDB)$2.27@0.00071,260.42596344 NFTARTNFTArt.Finan... (NFTART)$0.00@0.0012,112,112,112,112,100,0... Oceansv2Oceans Finan... (Oceans...)$57,401,358,358,358,...@0.0047356.078263 OCOSOCOS UK (OCOS)0 ONLYONEONLYONE (ONLYON...)$0.00@1,586.142929 OPENOpenWorld (OPEN)$0.26@0.00890.05 PAXEPaxe Token (PAXE)$0.00@0.0395215,613,139.567667 PROPELPropel (PROPEL)$143.09@0.00995,410,347.015011 RAVENRaven Protoc... (RAVEN)$327,032.12@0.00030 REEFReef.finance (REEF)$0.00@0.001136.12256621 FINERefinable (FINE)$0.24@0.00170.02 SHARDShard (SHARD)$0.00@0.00781.146625 SOLOSologenic (SOLO)$0.44@0.3834635.40731116 BTCSTStandardBTCH... (BTCST)$57.09@0.089924,646.2459 STACOINSTARSHIPCOIN (STACOI...)NFT Tokens (30)nft-floki.com# Floki MysteryboxBEP-1155Visit nft-floki for more information# nft-floki.comBEP-1155Visit getSHIBA.fans claim your rewards!#getSHIBA.fansBEP-1155Voucher$30,000 FLOKIBEP-1155(1BNB)BNB COUPON NFTBEP-721AirdropCardanoChain.orgBEP-1155featuredDoge Punks MillionaireBEP-721AirdropDogeVault.orgBEP-1155FlokiFloki BountyBEP-1155FlokiFloki NFT #1837BEP-1155AirdropgetFLOKI.orgBEP-1155AirdropLinkOracle.orgBEP-1155AirdropMakerVault.orgBEP-1155OETHOETH NFT #1911BEP-1155AirdropPancakeDEX.orgBEP-1155AirdropPolkaNetwork.netBEP-1155claim rewards on solv-finance.iosolv-finance.ioBEP-1155AirdropStakingETH.orgBEP-1155BEP-1155 TOKEN*[Suspicious]BEP-1155 TOKEN*[Suspicious]BEP-1155 TOKEN*[Suspicious]BEP-1155 TOKEN*[Suspicious]
More Info
Private Name Tags
ContractCreator
GENESIS at txn GENESIS_0000000000000000000000000000000000001004Multichain Info
2 addresses found via- Transactions
- Internal Transactions
- Token Transfers (BEP-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- BEP-20
- NFTs
Latest 25 from a total of 5,561,380 transactions
Transaction Hash MethodBlockFromToWithdraw Unlocke... 45325145 2024-12-30 11:02:58 21 secs ago 1735556578 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325131 2024-12-30 11:02:16 1 min ago 1735556536 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325126 2024-12-30 11:02:01 1 min ago 1735556521 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325115 2024-12-30 11:01:28 1 min ago 1735556488 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325112 2024-12-30 11:01:19 2 mins ago 1735556479 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325104 2024-12-30 11:00:55 2 mins ago 1735556455 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325100 2024-12-30 11:00:43 2 mins ago 1735556443 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325096 2024-12-30 11:00:31 2 mins ago 1735556431 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325069 2024-12-30 10:59:10 4 mins ago 1735556350 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325065 2024-12-30 10:58:58 4 mins ago 1735556338 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325061 2024-12-30 10:58:46 4 mins ago 1735556326 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325056 2024-12-30 10:58:31 4 mins ago 1735556311 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325052 2024-12-30 10:58:19 5 mins ago 1735556299 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325052 2024-12-30 10:58:19 5 mins ago 1735556299 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325047 2024-12-30 10:58:04 5 mins ago 1735556284 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325043 2024-12-30 10:57:52 5 mins ago 1735556272 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325043 2024-12-30 10:57:52 5 mins ago 1735556272 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325040 2024-12-30 10:57:43 5 mins ago 1735556263 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325029 2024-12-30 10:57:10 6 mins ago 1735556230 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325019 2024-12-30 10:56:40 6 mins ago 1735556200 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325012 2024-12-30 10:56:19 7 mins ago 1735556179 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45325000 2024-12-30 10:55:43 7 mins ago 1735556143 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45324980 2024-12-30 10:54:43 8 mins ago 1735556083 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45324973 2024-12-30 10:54:22 8 mins ago 1735556062 IN 0 BNB$0.00 0 0 Withdraw Unlocke... 45324973 2024-12-30 10:54:22 8 mins ago 1735556062 IN 0 BNB$0.00 0 0 Latest 25 internal transactions (View All)
Parent Transaction Hash Block From To 45325145 2024-12-30 11:02:58 21 secs ago 1735556578 2.35002866 BNB$1,637.01 45325112 2024-12-30 11:01:19 2 mins ago 1735556479 0.0181 BNB$12.61 45325104 2024-12-30 11:00:55 2 mins ago 1735556455 0.005925 BNB$4.13 45325043 2024-12-30 10:57:52 5 mins ago 1735556272 3.5038196 BNB$2,440.73 45325012 2024-12-30 10:56:19 7 mins ago 1735556179 0.600925 BNB$418.60 45324973 2024-12-30 10:54:22 8 mins ago 1735556062 1 BNB$696.59 45324973 2024-12-30 10:54:22 8 mins ago 1735556062 0.0089 BNB$6.20 45324926 2024-12-30 10:52:01 11 mins ago 1735555921 0.06212876 BNB$43.28 45324915 2024-12-30 10:51:28 11 mins ago 1735555888 1.029 BNB$716.79 45324882 2024-12-30 10:49:49 13 mins ago 1735555789 0.07872001 BNB$54.84 45324846 2024-12-30 10:48:01 15 mins ago 1735555681 0.9585481 BNB$667.72 45324789 2024-12-30 10:45:10 18 mins ago 1735555510 0.07817 BNB$54.45 45324770 2024-12-30 10:44:13 19 mins ago 1735555453 0.0089 BNB$6.20 45324741 2024-12-30 10:42:46 20 mins ago 1735555366 0.219425 BNB$152.85 45324680 2024-12-30 10:39:43 23 mins ago 1735555183 0.0034556 BNB$2.41 45324666 2024-12-30 10:39:01 24 mins ago 1735555141 0.01143135 BNB$7.96 45324634 2024-12-30 10:37:25 25 mins ago 1735555045 0.02935 BNB$20.44 45324535 2024-12-30 10:32:28 30 mins ago 1735554748 0.03009314 BNB$20.96 45324479 2024-12-30 10:29:40 33 mins ago 1735554580 0.14585 BNB$101.60 45324365 2024-12-30 10:23:58 39 mins ago 1735554238 0.03071085 BNB$21.39 45324324 2024-12-30 10:21:55 41 mins ago 1735554115 0.04317575 BNB$30.08 45324309 2024-12-30 10:21:10 42 mins ago 1735554070 0.02014866 BNB$14.04 45324281 2024-12-30 10:19:46 43 mins ago 1735553986 0.20606 BNB$143.54 45324275 2024-12-30 10:19:28 43 mins ago 1735553968 0.89756826 BNB$625.24 45324267 2024-12-30 10:19:04 44 mins ago 1735553944 0.04617111 BNB$32.16 Loading...LoadingContract Name:TokenHub
Compiler Versionv0.6.4+commit.1dca32f3
Contract Source Code (Solidity)
- interface IApplication
- - function handleSynPackage(
- - function handleAckPackage(uint8 chann ...
- - function handleFailAckPackage(uint8 c ...
- interface IBEP20
- - function totalSupply()
- - function decimals()
- - function symbol()
- - function name()
- - function getOwner()
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function allowance(address _owner, ad ...
- - function approve(address spender, uin ...
- - function transferFrom(address sender, ...
- interface ICrossChain
- - function sendSynPackage(uint8 channel ...
- interface ILightClient
- - function isHeaderSynced(uint64 height ...
- - function getAppHash(uint64 height)
- - function getSubmitter(uint64 height)
- interface IParamSubscriber
- - function updateParam(string calldata ...
- interface IRelayerHub
- - function isRelayer(address sender)
- interface ISystemReward
- - function claimRewards(address payable ...
- interface ITokenHub
- - function getMiniRelayFee()
- - function getContractAddrByBEP2Symbol( ...
- - function getBep2SymbolByContractAddr( ...
- - function bindToken(bytes32 bep2Symbol ...
- - function unbindToken(bytes32 bep2Symb ...
- - function transferOut(
- - function recoverBCAsset(bytes32 token ...
- - function cancelTokenRecoverLock(bytes ...
- - function batchTransferOutBNB(
- - function withdrawStakingBNB(uint256 a ...
- - function cancelTransferIn(address tok ...
- library BytesToTypes
- - function bytesToAddress(uint256 _offs ...
- - function bytesToBool(uint256 _offst, ...
- - function getStringSize(uint256 _offst ...
- - function bytesToString(uint256 _offst ...
- - function bytesToBytes32(uint256 _offs ...
- - function bytesToInt8(uint256 _offst, ...
- - function bytesToInt16(uint256 _offst, ...
- - function bytesToInt24(uint256 _offst, ...
- - function bytesToInt32(uint256 _offst, ...
- - function bytesToInt40(uint256 _offst, ...
- - function bytesToInt48(uint256 _offst, ...
- - function bytesToInt56(uint256 _offst, ...
- - function bytesToInt64(uint256 _offst, ...
- - function bytesToInt72(uint256 _offst, ...
- - function bytesToInt80(uint256 _offst, ...
- - function bytesToInt88(uint256 _offst, ...
- - function bytesToInt96(uint256 _offst, ...
- - function bytesToInt104(uint256 _offst ...
- - function bytesToInt112(uint256 _offst ...
- - function bytesToInt120(uint256 _offst ...
- - function bytesToInt128(uint256 _offst ...
- - function bytesToInt136(uint256 _offst ...
- - function bytesToInt144(uint256 _offst ...
- - function bytesToInt152(uint256 _offst ...
- - function bytesToInt160(uint256 _offst ...
- - function bytesToInt168(uint256 _offst ...
- - function bytesToInt176(uint256 _offst ...
- - function bytesToInt184(uint256 _offst ...
- - function bytesToInt192(uint256 _offst ...
- - function bytesToInt200(uint256 _offst ...
- - function bytesToInt208(uint256 _offst ...
- - function bytesToInt216(uint256 _offst ...
- - function bytesToInt224(uint256 _offst ...
- - function bytesToInt232(uint256 _offst ...
- - function bytesToInt240(uint256 _offst ...
- - function bytesToInt248(uint256 _offst ...
- - function bytesToInt256(uint256 _offst ...
- - function bytesToUint8(uint256 _offst, ...
- - function bytesToUint16(uint256 _offst ...
- - function bytesToUint24(uint256 _offst ...
- - function bytesToUint32(uint256 _offst ...
- - function bytesToUint40(uint256 _offst ...
- - function bytesToUint48(uint256 _offst ...
- - function bytesToUint56(uint256 _offst ...
- - function bytesToUint64(uint256 _offst ...
- - function bytesToUint72(uint256 _offst ...
- - function bytesToUint80(uint256 _offst ...
- - function bytesToUint88(uint256 _offst ...
- - function bytesToUint96(uint256 _offst ...
- - function bytesToUint104(uint256 _offs ...
- - function bytesToUint112(uint256 _offs ...
- - function bytesToUint120(uint256 _offs ...
- - function bytesToUint128(uint256 _offs ...
- - function bytesToUint136(uint256 _offs ...
- - function bytesToUint144(uint256 _offs ...
- - function bytesToUint152(uint256 _offs ...
- - function bytesToUint160(uint256 _offs ...
- - function bytesToUint168(uint256 _offs ...
- - function bytesToUint176(uint256 _offs ...
- - function bytesToUint184(uint256 _offs ...
- - function bytesToUint192(uint256 _offs ...
- - function bytesToUint200(uint256 _offs ...
- - function bytesToUint208(uint256 _offs ...
- - function bytesToUint216(uint256 _offs ...
- - function bytesToUint224(uint256 _offs ...
- - function bytesToUint232(uint256 _offs ...
- - function bytesToUint240(uint256 _offs ...
- - function bytesToUint248(uint256 _offs ...
- - function bytesToUint256(uint256 _offs ...
- library Memory
- - function equals(uint256 addr, uint256 ...
- - function equals(uint256 addr, uint256 ...
- - function compareStrings(string memory ...
- - function copy(uint256 src, uint256 de ...
- - function ptr(bytes memory bts)
- - function dataPtr(bytes memory bts)
- - function fromBytes(bytes memory bts)
- - function toBytes(uint256 addr, uint25 ...
- - function toUint(uint256 addr)
- - function toBytes32(uint256 addr)
- library RLPDecode
- - function next(Iterator memory self)
- - function hasNext(Iterator memory self ...
- - function toRLPItem(bytes memory self)
- - function iterator(RLPItem memory self ...
- - function rlpLen(RLPItem memory item)
- - function payloadLen(RLPItem memory it ...
- - function toList(RLPItem memory item)
- - function isList(RLPItem memory item)
- - function toRlpBytes(RLPItem memory it ...
- - function toBoolean(RLPItem memory ite ...
- - function toAddress(RLPItem memory ite ...
- - function toUint(RLPItem memory item)
- - function toUintStrict(RLPItem memory ...
- - function toBytes(RLPItem memory item)
- - function numItems(RLPItem memory item ...
- - function _itemLength(uint256 memPtr)
- - function _payloadOffset(uint256 memPt ...
- - function copy(uint256 src, uint256 de ...
- library RLPEncode
- - function encodeBytes(bytes memory sel ...
- - function encodeAddress(address self)
- - function encodeUint(uint256 self)
- - function encodeInt(int256 self)
- - function encodeBool(bool self)
- - function encodeList(bytes[] memory se ...
- - function mergeBytes(bytes memory _pre ...
- - function encodeLength(uint256 length, ...
- - function toBinary(uint256 x)
- library SafeMath
- - function add(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b, st ...
- - function mul(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b, st ...
- - function mod(uint256 a, uint256 b)
- - function mod(uint256 a, uint256 b, st ...
- contract System
- - function isContract(address addr)
- contract TokenHub is ITokenHub, Sy ... *
- - function init()
- - function claimRewards(
- - function claimMigrationFund(uint256 a ...
- - function getMiniRelayFee()
- - function handleSynPackage(
- - function handleAckPackage(
- - function handleFailAckPackage(
- - function decodeTransferInSynPackage(b ...
- - function encodeTransferInRefundPackag ...
- - function handleTransferInSynPackage(b ...
- - function doTransferIn(TransferInSynPa ...
- - function setLargeTransferLimit(
- - function withdrawUnlockedToken(addres ...
- - function cancelTransferIn(address tok ...
- - function _checkAndLockTransferIn(Tran ...
- - function decodeTransferOutAckPackage( ...
- - function handleTransferOutAckPackage( ...
- - function doRefund(TransferOutAckPacka ...
- - function decodeTransferOutSynPackage( ...
- - function handleTransferOutFailAckPack ...
- - function encodeTransferOutSynPackage( ...
- - function recoverBCAsset(
- - function _lockRecoverToken(bytes32 to ...
- - function cancelTokenRecoverLock(bytes ...
- - function transferOut(
- - function batchTransferOutBNB(
- - function updateParam(string calldata ...
- - function getContractAddrByBEP2Symbol( ...
- - function getBep2SymbolByContractAddr( ...
- - function bindToken(bytes32 bep2Symbol ...
- - function unbindToken(bytes32 bep2Symb ...
- - function isMiniBEP2Token(bytes32 symb ...
- - function convertToBep2Amount(uint256 ...
- - function convertFromBep2Amount(uint25 ...
- - function getBoundContract(string memo ...
- - function getBoundBep2Symbol(address c ...
- - function withdrawStakingBNB(uint256 a ...
/** *Submitted for verification at BscScan.com on 2021-03-01 */ pragma solidity =0.6.4; // contracts/interface/IApplication.sol interface IApplication { /** * @dev Handle syn package */ function handleSynPackage( uint8 channelId, bytes calldata msgBytes ) external returns (bytes memory responsePayload); /** * @dev Handle ack package */ function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external; /** * @dev Handle fail ack package */ function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) external; } // contracts/interface/IBEP20.sol interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // contracts/interface/ICrossChain.sol interface ICrossChain { /** * @dev Send package to BNB Beacon Chain */ function sendSynPackage(uint8 channelId, bytes calldata msgBytes, uint256 relayFee) external; } // contracts/interface/ILightClient.sol interface ILightClient { function isHeaderSynced(uint64 height) external view returns (bool); function getAppHash(uint64 height) external view returns (bytes32); function getSubmitter(uint64 height) external view returns (address payable); } // contracts/interface/IParamSubscriber.sol interface IParamSubscriber { function updateParam(string calldata key, bytes calldata value) external; } // contracts/interface/IRelayerHub.sol interface IRelayerHub { function isRelayer(address sender) external view returns (bool); } // contracts/interface/ISystemReward.sol interface ISystemReward { function claimRewards(address payable to, uint256 amount) external returns (uint256 actualAmount); } // contracts/interface/ITokenHub.sol interface ITokenHub { function getMiniRelayFee() external view returns (uint256); function getContractAddrByBEP2Symbol(bytes32 bep2Symbol) external view returns (address); function getBep2SymbolByContractAddr(address contractAddr) external view returns (bytes32); function bindToken(bytes32 bep2Symbol, address contractAddr, uint256 decimals) external; function unbindToken(bytes32 bep2Symbol, address contractAddr) external; function transferOut( address contractAddr, address recipient, uint256 amount, uint64 expireTime ) external payable returns (bool); function recoverBCAsset(bytes32 tokenSymbol, address recipient, uint256 amount) external; function cancelTokenRecoverLock(bytes32 tokenSymbol, address attacker) external; /* solium-disable-next-line */ function batchTransferOutBNB( address[] calldata recipientAddrs, uint256[] calldata amounts, address[] calldata refundAddrs, uint64 expireTime ) external payable returns (bool); function withdrawStakingBNB(uint256 amount) external returns (bool); function cancelTransferIn(address tokenAddress, address attacker) external; } // contracts/lib/BytesToTypes.sol /** * @title BytesToTypes * Copyright (c) 2016-2020 zpouladzade/Seriality * @dev The BytesToTypes contract converts the memory byte arrays to the standard solidity types * @author [email protected] */ library BytesToTypes { function bytesToAddress(uint256 _offst, bytes memory _input) internal pure returns (address _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToBool(uint256 _offst, bytes memory _input) internal pure returns (bool _output) { uint8 x; assembly { x := mload(add(_input, _offst)) } x == 0 ? _output = false : _output = true; } function getStringSize(uint256 _offst, bytes memory _input) internal pure returns (uint256 size) { assembly { size := mload(add(_input, _offst)) let chunk_count := add(div(size, 32), 1) // chunk_count = size/32 + 1 if gt(mod(size, 32), 0) { // if size%32 > 0 chunk_count := add(chunk_count, 1) } size := mul(chunk_count, 32) // first 32 bytes reseves for size in strings } } function bytesToString(uint256 _offst, bytes memory _input, bytes memory _output) internal pure { uint256 size = 32; assembly { let chunk_count size := mload(add(_input, _offst)) chunk_count := add(div(size, 32), 1) // chunk_count = size/32 + 1 if gt(mod(size, 32), 0) { chunk_count := add(chunk_count, 1) } // chunk_count++ for { let index := 0 } lt(index, chunk_count) { index := add(index, 1) } { mstore(add(_output, mul(index, 32)), mload(add(_input, _offst))) _offst := sub(_offst, 32) // _offst -= 32 } } } function bytesToBytes32(uint256 _offst, bytes memory _input, bytes32 _output) internal pure { assembly { mstore(_output, add(_input, _offst)) mstore(add(_output, 32), add(add(_input, _offst), 32)) } } function bytesToInt8(uint256 _offst, bytes memory _input) internal pure returns (int8 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt16(uint256 _offst, bytes memory _input) internal pure returns (int16 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt24(uint256 _offst, bytes memory _input) internal pure returns (int24 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt32(uint256 _offst, bytes memory _input) internal pure returns (int32 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt40(uint256 _offst, bytes memory _input) internal pure returns (int40 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt48(uint256 _offst, bytes memory _input) internal pure returns (int48 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt56(uint256 _offst, bytes memory _input) internal pure returns (int56 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt64(uint256 _offst, bytes memory _input) internal pure returns (int64 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt72(uint256 _offst, bytes memory _input) internal pure returns (int72 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt80(uint256 _offst, bytes memory _input) internal pure returns (int80 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt88(uint256 _offst, bytes memory _input) internal pure returns (int88 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt96(uint256 _offst, bytes memory _input) internal pure returns (int96 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt104(uint256 _offst, bytes memory _input) internal pure returns (int104 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt112(uint256 _offst, bytes memory _input) internal pure returns (int112 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt120(uint256 _offst, bytes memory _input) internal pure returns (int120 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt128(uint256 _offst, bytes memory _input) internal pure returns (int128 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt136(uint256 _offst, bytes memory _input) internal pure returns (int136 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt144(uint256 _offst, bytes memory _input) internal pure returns (int144 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt152(uint256 _offst, bytes memory _input) internal pure returns (int152 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt160(uint256 _offst, bytes memory _input) internal pure returns (int160 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt168(uint256 _offst, bytes memory _input) internal pure returns (int168 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt176(uint256 _offst, bytes memory _input) internal pure returns (int176 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt184(uint256 _offst, bytes memory _input) internal pure returns (int184 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt192(uint256 _offst, bytes memory _input) internal pure returns (int192 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt200(uint256 _offst, bytes memory _input) internal pure returns (int200 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt208(uint256 _offst, bytes memory _input) internal pure returns (int208 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt216(uint256 _offst, bytes memory _input) internal pure returns (int216 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt224(uint256 _offst, bytes memory _input) internal pure returns (int224 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt232(uint256 _offst, bytes memory _input) internal pure returns (int232 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt240(uint256 _offst, bytes memory _input) internal pure returns (int240 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt248(uint256 _offst, bytes memory _input) internal pure returns (int248 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToInt256(uint256 _offst, bytes memory _input) internal pure returns (int256 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint8(uint256 _offst, bytes memory _input) internal pure returns (uint8 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint16(uint256 _offst, bytes memory _input) internal pure returns (uint16 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint24(uint256 _offst, bytes memory _input) internal pure returns (uint24 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint32(uint256 _offst, bytes memory _input) internal pure returns (uint32 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint40(uint256 _offst, bytes memory _input) internal pure returns (uint40 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint48(uint256 _offst, bytes memory _input) internal pure returns (uint48 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint56(uint256 _offst, bytes memory _input) internal pure returns (uint56 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint64(uint256 _offst, bytes memory _input) internal pure returns (uint64 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint72(uint256 _offst, bytes memory _input) internal pure returns (uint72 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint80(uint256 _offst, bytes memory _input) internal pure returns (uint80 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint88(uint256 _offst, bytes memory _input) internal pure returns (uint88 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint96(uint256 _offst, bytes memory _input) internal pure returns (uint96 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint104(uint256 _offst, bytes memory _input) internal pure returns (uint104 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint112(uint256 _offst, bytes memory _input) internal pure returns (uint112 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint120(uint256 _offst, bytes memory _input) internal pure returns (uint120 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint128(uint256 _offst, bytes memory _input) internal pure returns (uint128 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint136(uint256 _offst, bytes memory _input) internal pure returns (uint136 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint144(uint256 _offst, bytes memory _input) internal pure returns (uint144 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint152(uint256 _offst, bytes memory _input) internal pure returns (uint152 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint160(uint256 _offst, bytes memory _input) internal pure returns (uint160 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint168(uint256 _offst, bytes memory _input) internal pure returns (uint168 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint176(uint256 _offst, bytes memory _input) internal pure returns (uint176 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint184(uint256 _offst, bytes memory _input) internal pure returns (uint184 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint192(uint256 _offst, bytes memory _input) internal pure returns (uint192 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint200(uint256 _offst, bytes memory _input) internal pure returns (uint200 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint208(uint256 _offst, bytes memory _input) internal pure returns (uint208 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint216(uint256 _offst, bytes memory _input) internal pure returns (uint216 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint224(uint256 _offst, bytes memory _input) internal pure returns (uint224 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint232(uint256 _offst, bytes memory _input) internal pure returns (uint232 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint240(uint256 _offst, bytes memory _input) internal pure returns (uint240 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint248(uint256 _offst, bytes memory _input) internal pure returns (uint248 _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint256(uint256 _offst, bytes memory _input) internal pure returns (uint256 _output) { assembly { _output := mload(add(_input, _offst)) } } } // contracts/lib/Memory.sol library Memory { // Size of a word, in bytes. uint256 internal constant WORD_SIZE = 32; // Size of the header of a 'bytes' array. uint256 internal constant BYTES_HEADER_SIZE = 32; // Address of the free memory pointer. uint256 internal constant FREE_MEM_PTR = 0x40; // Compares the 'len' bytes starting at address 'addr' in memory with the 'len' // bytes starting at 'addr2'. // Returns 'true' if the bytes are the same, otherwise 'false'. function equals(uint256 addr, uint256 addr2, uint256 len) internal pure returns (bool equal) { assembly { equal := eq(keccak256(addr, len), keccak256(addr2, len)) } } // Compares the 'len' bytes starting at address 'addr' in memory with the bytes stored in // 'bts'. It is allowed to set 'len' to a lower value then 'bts.length', in which case only // the first 'len' bytes will be compared. // Requires that 'bts.length >= len' function equals(uint256 addr, uint256 len, bytes memory bts) internal pure returns (bool equal) { require(bts.length >= len); uint256 addr2; assembly { addr2 := add(bts, /*BYTES_HEADER_SIZE*/ 32) } return equals(addr, addr2, len); } function compareStrings(string memory a, string memory b) internal pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } // Copy 'len' bytes from memory address 'src', to address 'dest'. // This function does not check the or destination, it only copies // the bytes. function copy(uint256 src, uint256 dest, uint256 len) internal pure { // Copy word-length chunks while possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } dest += WORD_SIZE; src += WORD_SIZE; } // Copy remaining bytes uint256 mask = 256 ** (WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } // Returns a memory pointer to the provided bytes array. function ptr(bytes memory bts) internal pure returns (uint256 addr) { assembly { addr := bts } } // Returns a memory pointer to the data portion of the provided bytes array. function dataPtr(bytes memory bts) internal pure returns (uint256 addr) { assembly { addr := add(bts, /*BYTES_HEADER_SIZE*/ 32) } } // This function does the same as 'dataPtr(bytes memory)', but will also return the // length of the provided bytes array. function fromBytes(bytes memory bts) internal pure returns (uint256 addr, uint256 len) { len = bts.length; assembly { addr := add(bts, /*BYTES_HEADER_SIZE*/ 32) } } // Creates a 'bytes memory' variable from the memory address 'addr', with the // length 'len'. The function will allocate new memory for the bytes array, and // the 'len bytes starting at 'addr' will be copied into that new memory. function toBytes(uint256 addr, uint256 len) internal pure returns (bytes memory bts) { bts = new bytes(len); uint256 btsptr; assembly { btsptr := add(bts, /*BYTES_HEADER_SIZE*/ 32) } copy(addr, btsptr, len); } // Get the word stored at memory address 'addr' as a 'uint'. function toUint(uint256 addr) internal pure returns (uint256 n) { assembly { n := mload(addr) } } // Get the word stored at memory address 'addr' as a 'bytes32'. function toBytes32(uint256 addr) internal pure returns (bytes32 bts) { assembly { bts := mload(addr) } } } // contracts/lib/RLPDecode.sol library RLPDecode { uint8 constant STRING_SHORT_START = 0x80; uint8 constant STRING_LONG_START = 0xb8; uint8 constant LIST_SHORT_START = 0xc0; uint8 constant LIST_LONG_START = 0xf8; uint8 constant WORD_SIZE = 32; struct RLPItem { uint256 len; uint256 memPtr; } struct Iterator { RLPItem item; // Item that's being iterated over. uint256 nextPtr; // Position of the next item in the list. } function next(Iterator memory self) internal pure returns (RLPItem memory) { require(hasNext(self)); uint256 ptr = self.nextPtr; uint256 itemLength = _itemLength(ptr); self.nextPtr = ptr + itemLength; return RLPItem(itemLength, ptr); } function hasNext(Iterator memory self) internal pure returns (bool) { RLPItem memory item = self.item; return self.nextPtr < item.memPtr + item.len; } function toRLPItem(bytes memory self) internal pure returns (RLPItem memory) { uint256 memPtr; assembly { memPtr := add(self, 0x20) } return RLPItem(self.length, memPtr); } function iterator(RLPItem memory self) internal pure returns (Iterator memory) { require(isList(self)); uint256 ptr = self.memPtr + _payloadOffset(self.memPtr); return Iterator(self, ptr); } function rlpLen(RLPItem memory item) internal pure returns (uint256) { return item.len; } function payloadLen(RLPItem memory item) internal pure returns (uint256) { return item.len - _payloadOffset(item.memPtr); } function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) { require(isList(item)); uint256 items = numItems(item); RLPItem[] memory result = new RLPItem[](items); uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr); uint256 dataLen; for (uint256 i = 0; i < items; ++i) { dataLen = _itemLength(memPtr); result[i] = RLPItem(dataLen, memPtr); memPtr = memPtr + dataLen; } return result; } function isList(RLPItem memory item) internal pure returns (bool) { if (item.len == 0) return false; uint8 byte0; uint256 memPtr = item.memPtr; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < LIST_SHORT_START) { return false; } return true; } function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) { bytes memory result = new bytes(item.len); if (result.length == 0) return result; uint256 ptr; assembly { ptr := add(0x20, result) } copy(item.memPtr, ptr, item.len); return result; } function toBoolean(RLPItem memory item) internal pure returns (bool) { require(item.len == 1); uint256 result; uint256 memPtr = item.memPtr; assembly { result := byte(0, mload(memPtr)) } if (result == 0 || result == STRING_SHORT_START) { return false; } else { return true; } } function toAddress(RLPItem memory item) internal pure returns (address) { // 1 byte for the length prefix require(item.len == 21); return address(toUint(item)); } function toUint(RLPItem memory item) internal pure returns (uint256) { require(item.len > 0 && item.len <= 33); uint256 offset = _payloadOffset(item.memPtr); require(item.len >= offset, "length is less than offset"); uint256 len = item.len - offset; uint256 result; uint256 memPtr = item.memPtr + offset; assembly { result := mload(memPtr) // shfit to the correct location if neccesary if lt(len, 32) { result := div(result, exp(256, sub(32, len))) } } return result; } // enforces 32 byte length function toUintStrict(RLPItem memory item) internal pure returns (uint256) { // one byte prefix require(item.len == 33); uint256 result; uint256 memPtr = item.memPtr + 1; assembly { result := mload(memPtr) } return result; } function toBytes(RLPItem memory item) internal pure returns (bytes memory) { require(item.len > 0); uint256 offset = _payloadOffset(item.memPtr); uint256 len = item.len - offset; // data length bytes memory result = new bytes(len); uint256 destPtr; assembly { destPtr := add(0x20, result) } copy(item.memPtr + offset, destPtr, len); return result; } function numItems(RLPItem memory item) private pure returns (uint256) { if (item.len == 0) return 0; uint256 count = 0; uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr); uint256 endPtr = item.memPtr + item.len; while (currPtr < endPtr) { currPtr = currPtr + _itemLength(currPtr); // skip over an item ++count; } return count; } function _itemLength(uint256 memPtr) private pure returns (uint256) { uint256 itemLen; uint256 byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) { itemLen = 1; } else if (byte0 < STRING_LONG_START) { itemLen = byte0 - STRING_SHORT_START + 1; } else if (byte0 < LIST_SHORT_START) { uint256 dataLen; assembly { let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is memPtr := add(memPtr, 1) // skip over the first byte /* 32 byte word size */ dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len itemLen := add(dataLen, add(byteLen, 1)) } require(itemLen >= dataLen, "addition overflow"); } else if (byte0 < LIST_LONG_START) { itemLen = byte0 - LIST_SHORT_START + 1; } else { uint256 dataLen; assembly { let byteLen := sub(byte0, 0xf7) memPtr := add(memPtr, 1) dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length itemLen := add(dataLen, add(byteLen, 1)) } require(itemLen >= dataLen, "addition overflow"); } return itemLen; } // @return number of bytes until the data function _payloadOffset(uint256 memPtr) private pure returns (uint256) { uint256 byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) { return 0; } else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) { return 1; } else if ( byte0 < LIST_SHORT_START // being explicit ) { return byte0 - (STRING_LONG_START - 1) + 1; } else { return byte0 - (LIST_LONG_START - 1) + 1; } } /* * @param src Pointer to source * @param dest Pointer to destination * @param len Amount of memory to copy from the source */ function copy(uint256 src, uint256 dest, uint256 len) private pure { if (len == 0) return; // copy as many word sizes as possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } src += WORD_SIZE; dest += WORD_SIZE; } // left over bytes. Mask is used to remove unwanted bytes from the word uint256 mask = 256 ** (WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) // zero out src let destpart := and(mload(dest), mask) // retrieve the bytes mstore(dest, or(destpart, srcpart)) } } } // contracts/lib/RLPEncode.sol library RLPEncode { uint8 constant STRING_OFFSET = 0x80; uint8 constant LIST_OFFSET = 0xc0; /** * @notice Encode string item * @param self The string (ie. byte array) item to encode * @return The RLP encoded string in bytes */ function encodeBytes(bytes memory self) internal pure returns (bytes memory) { if (self.length == 1 && self[0] <= 0x7f) { return self; } return mergeBytes(encodeLength(self.length, STRING_OFFSET), self); } /** * @notice Encode address * @param self The address to encode * @return The RLP encoded address in bytes */ function encodeAddress(address self) internal pure returns (bytes memory) { bytes memory b; assembly { let m := mload(0x40) mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, self)) mstore(0x40, add(m, 52)) b := m } return encodeBytes(b); } /** * @notice Encode uint * @param self The uint to encode * @return The RLP encoded uint in bytes */ function encodeUint(uint256 self) internal pure returns (bytes memory) { return encodeBytes(toBinary(self)); } /** * @notice Encode int * @param self The int to encode * @return The RLP encoded int in bytes */ function encodeInt(int256 self) internal pure returns (bytes memory) { return encodeUint(uint256(self)); } /** * @notice Encode bool * @param self The bool to encode * @return The RLP encoded bool in bytes */ function encodeBool(bool self) internal pure returns (bytes memory) { bytes memory rs = new bytes(1); rs[0] = (self ? bytes1(0x01) : bytes1(0x80)); return rs; } /** * @notice Encode list of items * @param self The list of items to encode, each item in list must be already encoded * @return The RLP encoded list of items in bytes */ function encodeList(bytes[] memory self) internal pure returns (bytes memory) { if (self.length == 0) { return new bytes(0); } bytes memory payload = self[0]; for (uint256 i = 1; i < self.length; ++i) { payload = mergeBytes(payload, self[i]); } return mergeBytes(encodeLength(payload.length, LIST_OFFSET), payload); } /** * @notice Concat two bytes arrays * @param _preBytes The first bytes array * @param _postBytes The second bytes array * @return The merged bytes array */ function mergeBytes(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore( 0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. ) ) } return tempBytes; } /** * @notice Encode the first byte, followed by the `length` in binary form if `length` is more than 55. * @param length The length of the string or the payload * @param offset `STRING_OFFSET` if item is string, `LIST_OFFSET` if item is list * @return RLP encoded bytes */ function encodeLength(uint256 length, uint256 offset) internal pure returns (bytes memory) { require(length < 256 ** 8, "input too long"); bytes memory rs = new bytes(1); if (length <= 55) { rs[0] = bytes1(uint8(length + offset)); return rs; } bytes memory bl = toBinary(length); rs[0] = bytes1(uint8(bl.length + offset + 55)); return mergeBytes(rs, bl); } /** * @notice Encode integer in big endian binary form with no leading zeroes * @param x The integer to encode * @return RLP encoded bytes */ function toBinary(uint256 x) internal pure returns (bytes memory) { bytes memory b = new bytes(32); assembly { mstore(add(b, 32), x) } uint256 i; if (x & 0xffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 == 0) { i = 24; } else if (x & 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 == 0) { i = 16; } else { i = 0; } for (; i < 32; ++i) { if (b[i] != 0) { break; } } uint256 length = 32 - i; bytes memory rs = new bytes(length); assembly { mstore(add(rs, length), x) mstore(rs, length) } return rs; } } // contracts/lib/SafeMath.sol /** * Copyright (c) 2016-2019 zOS Global Limited * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // contracts/System.sol contract System { bool public alreadyInit; uint32 public constant CODE_OK = 0; uint32 public constant ERROR_FAIL_DECODE = 100; uint8 public constant BIND_CHANNELID = 0x01; uint8 public constant TRANSFER_IN_CHANNELID = 0x02; uint8 public constant TRANSFER_OUT_CHANNELID = 0x03; uint8 public constant STAKING_CHANNELID = 0x08; uint8 public constant GOV_CHANNELID = 0x09; uint8 public constant SLASH_CHANNELID = 0x0b; uint8 public constant CROSS_STAKE_CHANNELID = 0x10; uint8 public constant BC_FUSION_CHANNELID = 0x11; // new channel id for cross-chain redelegate from Beacon Chain to Smart Chain after Feynman upgrade uint16 public constant bscChainID = 0x0038; address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001; address public constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002; address public constant LIGHT_CLIENT_ADDR = 0x0000000000000000000000000000000000001003; address public constant TOKEN_HUB_ADDR = 0x0000000000000000000000000000000000001004; address public constant INCENTIVIZE_ADDR = 0x0000000000000000000000000000000000001005; address public constant RELAYERHUB_CONTRACT_ADDR = 0x0000000000000000000000000000000000001006; address public constant GOV_HUB_ADDR = 0x0000000000000000000000000000000000001007; address public constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008; address public constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000; address public constant STAKING_CONTRACT_ADDR = 0x0000000000000000000000000000000000002001; address public constant STAKE_HUB_ADDR = 0x0000000000000000000000000000000000002002; address public constant STAKE_CREDIT_ADDR = 0x0000000000000000000000000000000000002003; address public constant GOVERNOR_ADDR = 0x0000000000000000000000000000000000002004; address public constant GOV_TOKEN_ADDR = 0x0000000000000000000000000000000000002005; address public constant TIMELOCK_ADDR = 0x0000000000000000000000000000000000002006; address public constant TOKEN_RECOVER_PORTAL_ADDR = 0x0000000000000000000000000000000000003000; modifier onlyCoinbase() { require(msg.sender == block.coinbase, "the message sender must be the block producer"); _; } modifier onlyZeroGasPrice() { require(tx.gasprice == 0, "gasprice is not zero"); _; } modifier onlyNotInit() { require(!alreadyInit, "the contract already init"); _; } modifier onlyInit() { require(alreadyInit, "the contract not init yet"); _; } modifier onlySlash() { require(msg.sender == SLASH_CONTRACT_ADDR, "the message sender must be slash contract"); _; } modifier onlyTokenHub() { require(msg.sender == TOKEN_HUB_ADDR, "the message sender must be token hub contract"); _; } modifier onlyGov() { require(msg.sender == GOV_HUB_ADDR, "the message sender must be governance contract"); _; } modifier onlyValidatorContract() { require(msg.sender == VALIDATOR_CONTRACT_ADDR, "the message sender must be validatorSet contract"); _; } modifier onlyCrossChainContract() { require(msg.sender == CROSS_CHAIN_CONTRACT_ADDR, "the message sender must be cross chain contract"); _; } modifier onlyRelayerIncentivize() { require(msg.sender == INCENTIVIZE_ADDR, "the message sender must be incentivize contract"); _; } modifier onlyRelayer() { require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).isRelayer(msg.sender), "the msg sender is not a relayer"); _; } modifier onlyTokenManager() { require(msg.sender == TOKEN_MANAGER_ADDR, "the msg sender must be tokenManager"); _; } modifier onlyStakeHub() { require(msg.sender == STAKE_HUB_ADDR, "the msg sender must be stakeHub"); _; } modifier onlyGovernorTimelock() { require(msg.sender == TIMELOCK_ADDR, "the msg sender must be governor timelock contract"); _; } modifier onlyTokenRecoverPortal() { require(msg.sender == TOKEN_RECOVER_PORTAL_ADDR, "the msg sender must be token recover portal"); _; } // Not reliable, do not use when need strong verify function isContract(address addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(addr) } return size > 0; } } // contracts/TokenHub.sol contract TokenHub is ITokenHub, System, IParamSubscriber, IApplication, ISystemReward { using SafeMath for uint256; using RLPEncode for *; using RLPDecode for *; using RLPDecode for RLPDecode.RLPItem; using RLPDecode for RLPDecode.Iterator; // BSC to BC struct TransferOutSynPackage { bytes32 bep2TokenSymbol; address contractAddr; uint256[] amounts; address[] recipients; address[] refundAddrs; uint64 expireTime; } // BC to BSC struct TransferOutAckPackage { address contractAddr; uint256[] refundAmounts; address[] refundAddrs; uint32 status; } // BC to BSC struct TransferInSynPackage { bytes32 bep2TokenSymbol; address contractAddr; uint256 amount; address recipient; address refundAddr; uint64 expireTime; } // BSC to BC struct TransferInRefundPackage { bytes32 bep2TokenSymbol; uint256 refundAmount; address refundAddr; uint32 status; } // BEP-171: Security Enhancement for Cross-Chain Module struct LockInfo { uint256 amount; uint256 unlockAt; } // transfer in channel uint8 public constant TRANSFER_IN_SUCCESS = 0; uint8 public constant TRANSFER_IN_FAILURE_TIMEOUT = 1; uint8 public constant TRANSFER_IN_FAILURE_UNBOUND_TOKEN = 2; uint8 public constant TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE = 3; uint8 public constant TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT = 4; uint8 public constant TRANSFER_IN_FAILURE_UNKNOWN = 5; uint256 public constant MAX_BEP2_TOTAL_SUPPLY = 9000000000000000000; uint8 public constant MINIMUM_BEP20_SYMBOL_LEN = 2; uint8 public constant MAXIMUM_BEP20_SYMBOL_LEN = 8; uint8 public constant BEP2_TOKEN_DECIMALS = 8; bytes32 public constant BEP2_TOKEN_SYMBOL_FOR_BNB = 0x424E420000000000000000000000000000000000000000000000000000000000; // "BNB" uint256 public constant MAX_GAS_FOR_CALLING_BEP20 = 50000; uint256 public constant MAX_GAS_FOR_TRANSFER_BNB = 10000; uint256 public constant INIT_MINIMUM_RELAY_FEE = 2e15; uint256 public constant REWARD_UPPER_LIMIT = 1e18; uint256 public constant TEN_DECIMALS = 1e10; uint256 public relayFee; mapping(address => uint256) public bep20ContractDecimals; mapping(address => bytes32) private contractAddrToBEP2Symbol; mapping(bytes32 => address) private bep2SymbolToContractAddr; // BEP-171: Security Enhancement for Cross-Chain Module uint256 public constant INIT_BNB_LARGE_TRANSFER_LIMIT = 10000 ether; uint256 public constant INIT_LOCK_PERIOD = 12 hours; // the lock period for large cross-chain transfer uint256 public lockPeriod; // the lock Period for token recover uint256 public constant LOCK_PERIOD_FOR_TOKEN_RECOVER = 7 days; // token address => largeTransferLimit amount, address(0) means BNB mapping(address => uint256) public largeTransferLimitMap; // token address => recipient address => lockedAmount + unlockAt, address(0) means BNB mapping(address => mapping(address => LockInfo)) public lockInfoMap; uint8 internal reentryLock; event transferInSuccess(address bep20Addr, address refundAddr, uint256 amount); event transferOutSuccess(address bep20Addr, address senderAddr, uint256 amount, uint256 relayFee); event refundSuccess(address bep20Addr, address refundAddr, uint256 amount, uint32 status); event refundFailure(address bep20Addr, address refundAddr, uint256 amount, uint32 status); event rewardTo(address to, uint256 amount); event receiveDeposit(address from, uint256 amount); event unexpectedPackage(uint8 channelId, bytes msgBytes); event paramChange(string key, bytes value); // BEP-171: Security Enhancement for Cross-Chain Module event LargeTransferLocked(address indexed tokenAddr, address indexed recipient, uint256 amount, uint256 unlockAt); event WithdrawUnlockedToken(address indexed tokenAddr, address indexed recipient, uint256 amount); event CancelTransfer(address indexed tokenAddr, address indexed attacker, uint256 amount); event LargeTransferLimitSet(address indexed tokenAddr, address indexed owner, uint256 largeTransferLimit); // BEP-299: Token Migration after BC Fusion event TokenRecoverLocked( bytes32 indexed tokenSymbol, address indexed tokenAddr, address indexed recipient, uint256 amount, uint256 unlockAt ); event CancelTokenRecoverLock( bytes32 indexed tokenSymbol, address indexed tokenAddr, address indexed attacker, uint256 amount ); event NotBoundToken(bytes32 indexed tokenSymbol, address indexed recipient, uint256 amount); // BEP-171: Security Enhancement for Cross-Chain Module modifier onlyTokenOwner(address bep20Token) { require(msg.sender == IBEP20(bep20Token).getOwner(), "not owner of BEP20 token"); _; } modifier noReentrant() { require(reentryLock != 2, "No re-entrancy"); reentryLock = 2; _; reentryLock = 1; } function init() external onlyNotInit { relayFee = INIT_MINIMUM_RELAY_FEE; bep20ContractDecimals[address(0x0)] = 18; // BNB decimals is 18 alreadyInit = true; } receive() external payable { if (msg.value > 0) { emit receiveDeposit(msg.sender, msg.value); } } /** * @dev Claim relayer reward to target account * * @param to Whose relay reward will be claimed. * @param amount Reward amount */ function claimRewards( address payable to, uint256 amount ) external override onlyInit onlyRelayerIncentivize returns (uint256) { uint256 actualAmount = amount < address(this).balance ? amount : address(this).balance; if (actualAmount > REWARD_UPPER_LIMIT) { return 0; } if (actualAmount > 0) { to.transfer(actualAmount); emit rewardTo(to, actualAmount); } return actualAmount; } function claimMigrationFund(uint256 amount) external onlyStakeHub returns (bool) { if (address(this).balance >= amount) { payable(STAKE_HUB_ADDR).transfer(amount); return true; } return false; } function getMiniRelayFee() external view override returns (uint256) { return relayFee; } /** * @dev handle sync cross-chain package from BC * * @param channelId The channel for cross-chain communication * @param msgBytes The rlp encoded message bytes sent from BC */ function handleSynPackage( uint8 channelId, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract returns (bytes memory) { if (channelId == TRANSFER_IN_CHANNELID) { return handleTransferInSynPackage(msgBytes); } else { // should not happen require(false, "unrecognized syn package"); return new bytes(0); } } /** * @dev handle ack cross-chain package from BC,it means cross-chain transfer successfully to BC * and will refund the remaining token caused by different decimals between BSC and BC. * * @param channelId The channel for cross-chain communication * @param msgBytes The rlp encoded message bytes sent from BC */ function handleAckPackage( uint8 channelId, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract { if (channelId == TRANSFER_OUT_CHANNELID) { handleTransferOutAckPackage(msgBytes); } else { emit unexpectedPackage(channelId, msgBytes); } } /** * @dev handle failed ack cross-chain package from BC, it means failed to cross-chain transfer to BC and will refund the token. * * @param channelId The channel for cross-chain communication * @param msgBytes The rlp encoded message bytes sent from BC */ function handleFailAckPackage( uint8 channelId, bytes calldata msgBytes ) external override onlyInit onlyCrossChainContract { if (channelId == TRANSFER_OUT_CHANNELID) { handleTransferOutFailAckPackage(msgBytes); } else { emit unexpectedPackage(channelId, msgBytes); } } function decodeTransferInSynPackage(bytes memory msgBytes) internal pure returns (TransferInSynPackage memory, bool) { TransferInSynPackage memory transInSynPkg; RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); bool success = false; uint256 idx = 0; while (iter.hasNext()) { if (idx == 0) { transInSynPkg.bep2TokenSymbol = bytes32(iter.next().toUint()); } else if (idx == 1) { transInSynPkg.contractAddr = iter.next().toAddress(); } else if (idx == 2) { transInSynPkg.amount = iter.next().toUint(); } else if (idx == 3) { transInSynPkg.recipient = ((iter.next().toAddress())); } else if (idx == 4) { transInSynPkg.refundAddr = iter.next().toAddress(); } else if (idx == 5) { transInSynPkg.expireTime = uint64(iter.next().toUint()); success = true; } else { break; } ++idx; } return (transInSynPkg, success); } function encodeTransferInRefundPackage(TransferInRefundPackage memory transInAckPkg) internal pure returns (bytes memory) { bytes[] memory elements = new bytes[](4); elements[0] = uint256(transInAckPkg.bep2TokenSymbol).encodeUint(); elements[1] = transInAckPkg.refundAmount.encodeUint(); elements[2] = transInAckPkg.refundAddr.encodeAddress(); elements[3] = uint256(transInAckPkg.status).encodeUint(); return elements.encodeList(); } function handleTransferInSynPackage(bytes memory msgBytes) internal returns (bytes memory) { (TransferInSynPackage memory transInSynPkg, bool success) = decodeTransferInSynPackage(msgBytes); require(success, "unrecognized transferIn package"); uint32 resCode = doTransferIn(transInSynPkg); if (resCode != TRANSFER_IN_SUCCESS) { uint256 bep2Amount = convertToBep2Amount(transInSynPkg.amount, bep20ContractDecimals[transInSynPkg.contractAddr]); TransferInRefundPackage memory transInAckPkg = TransferInRefundPackage({ bep2TokenSymbol: transInSynPkg.bep2TokenSymbol, refundAmount: bep2Amount, refundAddr: transInSynPkg.refundAddr, status: resCode }); return encodeTransferInRefundPackage(transInAckPkg); } else { return new bytes(0); } } function doTransferIn(TransferInSynPackage memory transInSynPkg) internal returns (uint32) { if (transInSynPkg.contractAddr == address(0x0)) { if (block.timestamp > transInSynPkg.expireTime) { return TRANSFER_IN_FAILURE_TIMEOUT; } if (address(this).balance < transInSynPkg.amount) { return TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE; } // BEP-171: Security Enhancement for Cross-Chain Module if (!_checkAndLockTransferIn(transInSynPkg)) { // directly transfer to the recipient (bool success,) = transInSynPkg.recipient.call{ gas: MAX_GAS_FOR_TRANSFER_BNB, value: transInSynPkg.amount }(""); if (!success) { return TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT; } } emit transferInSuccess(transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount); return TRANSFER_IN_SUCCESS; } else { if (block.timestamp > transInSynPkg.expireTime) { return TRANSFER_IN_FAILURE_TIMEOUT; } if (contractAddrToBEP2Symbol[transInSynPkg.contractAddr] != transInSynPkg.bep2TokenSymbol) { return TRANSFER_IN_FAILURE_UNBOUND_TOKEN; } uint256 actualBalance = IBEP20(transInSynPkg.contractAddr).balanceOf{ gas: MAX_GAS_FOR_CALLING_BEP20 }(address(this)); if (actualBalance < transInSynPkg.amount) { return TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE; } // BEP-171: Security Enhancement for Cross-Chain Module if (!_checkAndLockTransferIn(transInSynPkg)) { bool success = IBEP20(transInSynPkg.contractAddr).transfer{ gas: MAX_GAS_FOR_CALLING_BEP20 }( transInSynPkg.recipient, transInSynPkg.amount ); if (!success) { return TRANSFER_IN_FAILURE_UNKNOWN; } } emit transferInSuccess(transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount); return TRANSFER_IN_SUCCESS; } } // BEP-171: Security Enhancement for Cross-Chain Module function setLargeTransferLimit( address bep20Token, uint256 largeTransferLimit ) external onlyTokenOwner(bep20Token) { require(largeTransferLimit > 0, "zero limit not allowed"); require(contractAddrToBEP2Symbol[bep20Token] != bytes32(0x00), "not bound"); largeTransferLimitMap[bep20Token] = largeTransferLimit; emit LargeTransferLimitSet(bep20Token, msg.sender, largeTransferLimit); } // BEP-171: Security Enhancement for Cross-Chain Module function withdrawUnlockedToken(address tokenAddress, address recipient) external noReentrant { LockInfo storage lockInfo = lockInfoMap[tokenAddress][recipient]; require(lockInfo.amount > 0, "no locked amount"); require(block.timestamp >= lockInfo.unlockAt, "still on locking period"); uint256 _amount = lockInfo.amount; lockInfo.amount = 0; bool _success; if (tokenAddress == address(0x0)) { (_success,) = recipient.call{ gas: MAX_GAS_FOR_TRANSFER_BNB, value: _amount }(""); } else { _success = IBEP20(tokenAddress).transfer{ gas: MAX_GAS_FOR_CALLING_BEP20 }(recipient, _amount); } require(_success, "withdraw unlocked token failed"); emit WithdrawUnlockedToken(tokenAddress, recipient, _amount); } // BEP-171: Security Enhancement for Cross-Chain Module function cancelTransferIn(address tokenAddress, address attacker) external override onlyCrossChainContract { LockInfo storage lockInfo = lockInfoMap[tokenAddress][attacker]; require(lockInfo.amount > 0, "no locked amount"); uint256 _amount = lockInfo.amount; lockInfo.amount = 0; emit CancelTransfer(tokenAddress, attacker, _amount); } // BEP-171: Security Enhancement for Cross-Chain Module function _checkAndLockTransferIn(TransferInSynPackage memory transInSynPkg) internal returns (bool isLocked) { // check if BEP-171 params init if (largeTransferLimitMap[address(0x0)] == 0 && lockPeriod == 0) { largeTransferLimitMap[address(0x0)] = INIT_BNB_LARGE_TRANSFER_LIMIT; lockPeriod = INIT_LOCK_PERIOD; } // check if it is over large transfer limit uint256 _limit = largeTransferLimitMap[transInSynPkg.contractAddr]; if (_limit == 0 || transInSynPkg.amount < _limit) { return false; } // it is over the large transfer limit // add time lock to recipient LockInfo storage lockInfo = lockInfoMap[transInSynPkg.contractAddr][transInSynPkg.recipient]; lockInfo.amount = lockInfo.amount.add(transInSynPkg.amount); lockInfo.unlockAt = block.timestamp + lockPeriod; emit LargeTransferLocked( transInSynPkg.contractAddr, transInSynPkg.recipient, transInSynPkg.amount, lockInfo.unlockAt ); return true; } function decodeTransferOutAckPackage(bytes memory msgBytes) internal pure returns (TransferOutAckPackage memory, bool) { TransferOutAckPackage memory transOutAckPkg; RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); bool success = false; uint256 idx = 0; while (iter.hasNext()) { if (idx == 0) { transOutAckPkg.contractAddr = iter.next().toAddress(); } else if (idx == 1) { RLPDecode.RLPItem[] memory list = iter.next().toList(); transOutAckPkg.refundAmounts = new uint256[](list.length); for (uint256 index = 0; index < list.length; ++index) { transOutAckPkg.refundAmounts[index] = list[index].toUint(); } } else if (idx == 2) { RLPDecode.RLPItem[] memory list = iter.next().toList(); transOutAckPkg.refundAddrs = new address[](list.length); for (uint256 index = 0; index < list.length; ++index) { transOutAckPkg.refundAddrs[index] = list[index].toAddress(); } } else if (idx == 3) { transOutAckPkg.status = uint32(iter.next().toUint()); success = true; } else { break; } ++idx; } return (transOutAckPkg, success); } function handleTransferOutAckPackage(bytes memory msgBytes) internal { (TransferOutAckPackage memory transOutAckPkg, bool decodeSuccess) = decodeTransferOutAckPackage(msgBytes); require(decodeSuccess, "unrecognized transferOut ack package"); doRefund(transOutAckPkg); } function doRefund(TransferOutAckPackage memory transOutAckPkg) internal { if (transOutAckPkg.contractAddr == address(0x0)) { for (uint256 index = 0; index < transOutAckPkg.refundAmounts.length; ++index) { (bool success,) = transOutAckPkg.refundAddrs[index].call{ gas: MAX_GAS_FOR_TRANSFER_BNB, value: transOutAckPkg.refundAmounts[index] }(""); if (!success) { emit refundFailure( transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status ); } else { emit refundSuccess( transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status ); } } } else { for (uint256 index = 0; index < transOutAckPkg.refundAmounts.length; ++index) { bool success = IBEP20(transOutAckPkg.contractAddr).transfer{ gas: MAX_GAS_FOR_CALLING_BEP20 }( transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index] ); if (success) { emit refundSuccess( transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status ); } else { emit refundFailure( transOutAckPkg.contractAddr, transOutAckPkg.refundAddrs[index], transOutAckPkg.refundAmounts[index], transOutAckPkg.status ); } } } } function decodeTransferOutSynPackage(bytes memory msgBytes) internal pure returns (TransferOutSynPackage memory, bool) { TransferOutSynPackage memory transOutSynPkg; RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator(); bool success = false; uint256 idx = 0; while (iter.hasNext()) { if (idx == 0) { transOutSynPkg.bep2TokenSymbol = bytes32(iter.next().toUint()); } else if (idx == 1) { transOutSynPkg.contractAddr = iter.next().toAddress(); } else if (idx == 2) { RLPDecode.RLPItem[] memory list = iter.next().toList(); transOutSynPkg.amounts = new uint256[](list.length); for (uint256 index = 0; index < list.length; ++index) { transOutSynPkg.amounts[index] = list[index].toUint(); } } else if (idx == 3) { RLPDecode.RLPItem[] memory list = iter.next().toList(); transOutSynPkg.recipients = new address[](list.length); for (uint256 index = 0; index < list.length; ++index) { transOutSynPkg.recipients[index] = list[index].toAddress(); } } else if (idx == 4) { RLPDecode.RLPItem[] memory list = iter.next().toList(); transOutSynPkg.refundAddrs = new address[](list.length); for (uint256 index = 0; index < list.length; ++index) { transOutSynPkg.refundAddrs[index] = list[index].toAddress(); } } else if (idx == 5) { transOutSynPkg.expireTime = uint64(iter.next().toUint()); success = true; } else { break; } ++idx; } return (transOutSynPkg, success); } function handleTransferOutFailAckPackage(bytes memory msgBytes) internal { (TransferOutSynPackage memory transOutSynPkg, bool decodeSuccess) = decodeTransferOutSynPackage(msgBytes); require(decodeSuccess, "unrecognized transferOut syn package"); TransferOutAckPackage memory transOutAckPkg; transOutAckPkg.contractAddr = transOutSynPkg.contractAddr; transOutAckPkg.refundAmounts = transOutSynPkg.amounts; uint256 bep20TokenDecimals = bep20ContractDecimals[transOutSynPkg.contractAddr]; for (uint256 idx = 0; idx < transOutSynPkg.amounts.length; ++idx) { transOutSynPkg.amounts[idx] = convertFromBep2Amount(transOutSynPkg.amounts[idx], bep20TokenDecimals); } transOutAckPkg.refundAddrs = transOutSynPkg.refundAddrs; transOutAckPkg.status = TRANSFER_IN_FAILURE_UNKNOWN; doRefund(transOutAckPkg); } function encodeTransferOutSynPackage(TransferOutSynPackage memory transOutSynPkg) internal pure returns (bytes memory) { bytes[] memory elements = new bytes[](6); elements[0] = uint256(transOutSynPkg.bep2TokenSymbol).encodeUint(); elements[1] = transOutSynPkg.contractAddr.encodeAddress(); uint256 batchLength = transOutSynPkg.amounts.length; bytes[] memory amountsElements = new bytes[](batchLength); for (uint256 index = 0; index < batchLength; ++index) { amountsElements[index] = transOutSynPkg.amounts[index].encodeUint(); } elements[2] = amountsElements.encodeList(); bytes[] memory recipientsElements = new bytes[](batchLength); for (uint256 index = 0; index < batchLength; ++index) { recipientsElements[index] = transOutSynPkg.recipients[index].encodeAddress(); } elements[3] = recipientsElements.encodeList(); bytes[] memory refundAddrsElements = new bytes[](batchLength); for (uint256 index = 0; index < batchLength; ++index) { refundAddrsElements[index] = transOutSynPkg.refundAddrs[index].encodeAddress(); } elements[4] = refundAddrsElements.encodeList(); elements[5] = uint256(transOutSynPkg.expireTime).encodeUint(); return elements.encodeList(); } /** * @dev request a BC token recover from BSC * * @param tokenSymbol The token symbol on BSC. * @param recipient The destination address of the transfer on BSC. * @param amount The amount to transfer */ function recoverBCAsset( bytes32 tokenSymbol, address recipient, uint256 amount ) external override onlyInit onlyTokenRecoverPortal { require(amount <= MAX_BEP2_TOTAL_SUPPLY, "amount is too large, exceed maximum bep2 token amount"); uint256 convertedAmount; if (tokenSymbol != BEP2_TOKEN_SYMBOL_FOR_BNB) { address contractAddr = bep2SymbolToContractAddr[tokenSymbol]; if (contractAddr == address(0x00)) { // if the token is not bound, just emit an event // please notify the token owner to handle the token recovery emit NotBoundToken(tokenSymbol, recipient, amount); return; } uint256 bep20TokenDecimals = bep20ContractDecimals[contractAddr]; convertedAmount = convertFromBep2Amount(amount, bep20TokenDecimals); // convert to bep20 amount require(IBEP20(contractAddr).balanceOf(address(this)) >= convertedAmount, "insufficient balance"); _lockRecoverToken(tokenSymbol, contractAddr, convertedAmount, recipient); } else { convertedAmount = amount.mul(TEN_DECIMALS); // native bnb decimals is 8 on BC, while the native bnb decimals on BSC is 18 require(address(this).balance >= convertedAmount, "insufficient balance"); address contractAddr = address(0x00); _lockRecoverToken(tokenSymbol, contractAddr, convertedAmount, recipient); } } // lock the token for 7 days to the recipient address function _lockRecoverToken(bytes32 tokenSymbol, address contractAddr, uint256 amount, address recipient) internal { LockInfo storage lockInfo = lockInfoMap[contractAddr][recipient]; lockInfo.amount = lockInfo.amount.add(amount); lockInfo.unlockAt = block.timestamp + LOCK_PERIOD_FOR_TOKEN_RECOVER; emit TokenRecoverLocked(tokenSymbol, contractAddr, recipient, amount, lockInfo.unlockAt); } function cancelTokenRecoverLock(bytes32 tokenSymbol, address attacker) external override onlyTokenRecoverPortal { address tokenAddress = address(0x00); if (tokenSymbol != BEP2_TOKEN_SYMBOL_FOR_BNB) { tokenAddress = bep2SymbolToContractAddr[tokenSymbol]; require(tokenAddress != address(0x00), "invalid symbol"); } LockInfo storage lockInfo = lockInfoMap[tokenAddress][attacker]; require(lockInfo.amount > 0, "no locked amount"); uint256 _amount = lockInfo.amount; lockInfo.amount = 0; emit CancelTokenRecoverLock(tokenSymbol, tokenAddress, attacker, _amount); } /** * @dev request a cross-chain transfer from BSC to BC * @notice this function is deprecated after Feynman upgrade * * @param contractAddr The token contract which is transferred * @param recipient The destination address of the cross-chain transfer on BC. * @param amount The amount to transfer * @param expireTime The expire time for the cross-chain transfer */ function transferOut( address contractAddr, address recipient, uint256 amount, uint64 expireTime ) external payable override onlyInit returns (bool) { revert("deprecated"); } /** * @dev request a batch cross-chain BNB transfers from BSC to BC * * @param recipientAddrs The destination address of the cross-chain transfer on BC. * @param amounts The amounts to transfer * @param refundAddrs The refund addresses that receive the refund funds while failed to cross-chain transfer * @param expireTime The expire time for these cross-chain transfers */ function batchTransferOutBNB( address[] calldata recipientAddrs, uint256[] calldata amounts, address[] calldata refundAddrs, uint64 expireTime ) external payable override onlyInit returns (bool) { require(recipientAddrs.length == amounts.length, "Length of recipientAddrs doesn't equal to length of amounts"); require( recipientAddrs.length == refundAddrs.length, "Length of recipientAddrs doesn't equal to length of refundAddrs" ); require(expireTime >= block.timestamp + 120, "expireTime must be two minutes later"); require(msg.value % TEN_DECIMALS == 0, "invalid received BNB amount: precision loss in amount conversion"); uint256 batchLength = amounts.length; uint256 totalAmount = 0; uint256 rewardForRelayer; uint256[] memory convertedAmounts = new uint256[](batchLength); for (uint256 i = 0; i < batchLength; ++i) { require(amounts[i] % TEN_DECIMALS == 0, "invalid transfer amount: precision loss in amount conversion"); totalAmount = totalAmount.add(amounts[i]); convertedAmounts[i] = amounts[i].div(TEN_DECIMALS); } require( msg.value >= totalAmount.add(relayFee.mul(batchLength)), "received BNB amount should be no less than the sum of transfer BNB amount and relayFee" ); rewardForRelayer = msg.value.sub(totalAmount); TransferOutSynPackage memory transOutSynPkg = TransferOutSynPackage({ bep2TokenSymbol: BEP2_TOKEN_SYMBOL_FOR_BNB, contractAddr: address(0x00), amounts: convertedAmounts, recipients: recipientAddrs, refundAddrs: refundAddrs, expireTime: expireTime }); ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage( TRANSFER_OUT_CHANNELID, encodeTransferOutSynPackage(transOutSynPkg), rewardForRelayer.div(TEN_DECIMALS) ); emit transferOutSuccess(address(0x0), msg.sender, totalAmount, rewardForRelayer); return true; } function updateParam(string calldata key, bytes calldata value) external override onlyGov { require(value.length == 32, "expected value length is 32"); string memory localKey = key; bytes memory localValue = value; bytes32 bytes32Key; assembly { bytes32Key := mload(add(localKey, 32)) } if (bytes32Key == bytes32(0x72656c6179466565000000000000000000000000000000000000000000000000)) { // relayFee uint256 newRelayFee; assembly { newRelayFee := mload(add(localValue, 32)) } require(newRelayFee <= 1e18 && newRelayFee % (TEN_DECIMALS) == 0, "the relayFee out of range"); relayFee = newRelayFee; } else if (Memory.compareStrings(key, "largeTransferLockPeriod")) { uint256 newLockPeriod = BytesToTypes.bytesToUint256(32, value); require(newLockPeriod <= 1 weeks, "lock period too long"); lockPeriod = newLockPeriod; } else if (Memory.compareStrings(key, "bnbLargeTransferLimit")) { uint256 newBNBLargeTransferLimit = BytesToTypes.bytesToUint256(32, value); require(newBNBLargeTransferLimit >= 100 ether, "bnb large transfer limit too small"); largeTransferLimitMap[address(0x0)] = newBNBLargeTransferLimit; } else { require(false, "unknown param"); } emit paramChange(key, value); } function getContractAddrByBEP2Symbol(bytes32 bep2Symbol) external view override returns (address) { return bep2SymbolToContractAddr[bep2Symbol]; } function getBep2SymbolByContractAddr(address contractAddr) external view override returns (bytes32) { return contractAddrToBEP2Symbol[contractAddr]; } function bindToken(bytes32 bep2Symbol, address contractAddr, uint256 decimals) external override onlyTokenManager { bep2SymbolToContractAddr[bep2Symbol] = contractAddr; contractAddrToBEP2Symbol[contractAddr] = bep2Symbol; bep20ContractDecimals[contractAddr] = decimals; } function unbindToken(bytes32 bep2Symbol, address contractAddr) external override onlyTokenManager { delete bep2SymbolToContractAddr[bep2Symbol]; delete contractAddrToBEP2Symbol[contractAddr]; delete bep20ContractDecimals[contractAddr]; } function isMiniBEP2Token(bytes32 symbol) internal pure returns (bool) { bytes memory symbolBytes = new bytes(32); assembly { mstore(add(symbolBytes, 32), symbol) } uint8 symbolLength = 0; for (uint8 j = 0; j < 32; ++j) { if (symbolBytes[j] != 0) { ++symbolLength; } else { break; } } if (symbolLength < MINIMUM_BEP20_SYMBOL_LEN + 5) { return false; } if (symbolBytes[symbolLength - 5] != 0x2d) { // '-' return false; } if (symbolBytes[symbolLength - 1] != "M") { // ABC-XXXM return false; } return true; } function convertToBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) { if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) { return amount.div(10 ** (bep20TokenDecimals - BEP2_TOKEN_DECIMALS)); } return amount.mul(10 ** (BEP2_TOKEN_DECIMALS - bep20TokenDecimals)); } function convertFromBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) { if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) { return amount.mul(10 ** (bep20TokenDecimals - BEP2_TOKEN_DECIMALS)); } return amount.div(10 ** (BEP2_TOKEN_DECIMALS - bep20TokenDecimals)); } function getBoundContract(string memory bep2Symbol) public view returns (address) { bytes32 bep2TokenSymbol; assembly { bep2TokenSymbol := mload(add(bep2Symbol, 32)) } return bep2SymbolToContractAddr[bep2TokenSymbol]; } function getBoundBep2Symbol(address contractAddr) public view returns (string memory) { bytes32 bep2SymbolBytes32 = contractAddrToBEP2Symbol[contractAddr]; bytes memory bep2SymbolBytes = new bytes(32); assembly { mstore(add(bep2SymbolBytes, 32), bep2SymbolBytes32) } uint8 bep2SymbolLength = 0; for (uint8 j = 0; j < 32; ++j) { if (bep2SymbolBytes[j] != 0) { ++bep2SymbolLength; } else { break; } } bytes memory bep2Symbol = new bytes(bep2SymbolLength); for (uint8 j = 0; j < bep2SymbolLength; ++j) { bep2Symbol[j] = bep2SymbolBytes[j]; } return string(bep2Symbol); } function withdrawStakingBNB(uint256 amount) external override returns (bool) { require(msg.sender == STAKING_CONTRACT_ADDR, "only staking system contract can call this function"); if (amount != 0) { payable(STAKING_CONTRACT_ADDR).transfer(amount); } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"anonymous": false,"inputs": [{"indexed": true,"internalType": "bytes32","name": "tokenSymbol","type": "bytes32"},{"indexed": true,"internalType": "address","name": "tokenAddr","type": "address"},{"indexed": true,"internalType": "address","name": "attacker","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "CancelTokenRecoverLock","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "address","name": "tokenAddr","type": "address"},{"indexed": true,"internalType": "address","name": "attacker","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "CancelTransfer","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "address","name": "tokenAddr","type": "address"},{"indexed": true,"internalType": "address","name": "owner","type": "address"},{"indexed": false,"internalType": "uint256","name": "largeTransferLimit","type": "uint256"}],"name": "LargeTransferLimitSet","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "address","name": "tokenAddr","type": "address"},{"indexed": true,"internalType": "address","name": "recipient","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"},{"indexed": false,"internalType": "uint256","name": "unlockAt","type": "uint256"}],"name": "LargeTransferLocked","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "bytes32","name": "tokenSymbol","type": "bytes32"},{"indexed": true,"internalType": "address","name": "recipient","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "NotBoundToken","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "bytes32","name": "tokenSymbol","type": "bytes32"},{"indexed": true,"internalType": "address","name": "tokenAddr","type": "address"},{"indexed": true,"internalType": "address","name": "recipient","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"},{"indexed": false,"internalType": "uint256","name": "unlockAt","type": "uint256"}],"name": "TokenRecoverLocked","type": "event"},{"anonymous": false,"inputs": [{"indexed": true,"internalType": "address","name": "tokenAddr","type": "address"},{"indexed": true,"internalType": "address","name": "recipient","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "WithdrawUnlockedToken","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "string","name": "key","type": "string"},{"indexed": false,"internalType": "bytes","name": "value","type": "bytes"}],"name": "paramChange","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "address","name": "from","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "receiveDeposit","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "address","name": "bep20Addr","type": "address"},{"indexed": false,"internalType": "address","name": "refundAddr","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"},{"indexed": false,"internalType": "uint32","name": "status","type": "uint32"}],"name": "refundFailure","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "address","name": "bep20Addr","type": "address"},{"indexed": false,"internalType": "address","name": "refundAddr","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"},{"indexed": false,"internalType": "uint32","name": "status","type": "uint32"}],"name": "refundSuccess","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "address","name": "to","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "rewardTo","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "address","name": "bep20Addr","type": "address"},{"indexed": false,"internalType": "address","name": "refundAddr","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"}],"name": "transferInSuccess","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "address","name": "bep20Addr","type": "address"},{"indexed": false,"internalType": "address","name": "senderAddr","type": "address"},{"indexed": false,"internalType": "uint256","name": "amount","type": "uint256"},{"indexed": false,"internalType": "uint256","name": "relayFee","type": "uint256"}],"name": "transferOutSuccess","type": "event"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "uint8","name": "channelId","type": "uint8"},{"indexed": false,"internalType": "bytes","name": "msgBytes","type": "bytes"}],"name": "unexpectedPackage","type": "event"},{"inputs": [],"name": "BC_FUSION_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "BEP2_TOKEN_DECIMALS","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "BEP2_TOKEN_SYMBOL_FOR_BNB","outputs": [{"internalType": "bytes32","name": "","type": "bytes32"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "BIND_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "CODE_OK","outputs": [{"internalType": "uint32","name": "","type": "uint32"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "CROSS_CHAIN_CONTRACT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "CROSS_STAKE_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "ERROR_FAIL_DECODE","outputs": [{"internalType": "uint32","name": "","type": "uint32"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "GOVERNOR_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "GOV_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "GOV_HUB_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "GOV_TOKEN_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "INCENTIVIZE_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "INIT_BNB_LARGE_TRANSFER_LIMIT","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "INIT_LOCK_PERIOD","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "INIT_MINIMUM_RELAY_FEE","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "LIGHT_CLIENT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "LOCK_PERIOD_FOR_TOKEN_RECOVER","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "MAXIMUM_BEP20_SYMBOL_LEN","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "MAX_BEP2_TOTAL_SUPPLY","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "MAX_GAS_FOR_CALLING_BEP20","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "MAX_GAS_FOR_TRANSFER_BNB","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "MINIMUM_BEP20_SYMBOL_LEN","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "RELAYERHUB_CONTRACT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "REWARD_UPPER_LIMIT","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "SLASH_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "SLASH_CONTRACT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "STAKE_CREDIT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "STAKE_HUB_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "STAKING_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "STAKING_CONTRACT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "SYSTEM_REWARD_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TEN_DECIMALS","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TIMELOCK_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TOKEN_HUB_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TOKEN_MANAGER_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TOKEN_RECOVER_PORTAL_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_FAILURE_INSUFFICIENT_BALANCE","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_FAILURE_NON_PAYABLE_RECIPIENT","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_FAILURE_TIMEOUT","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_FAILURE_UNBOUND_TOKEN","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_FAILURE_UNKNOWN","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_IN_SUCCESS","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "TRANSFER_OUT_CHANNELID","outputs": [{"internalType": "uint8","name": "","type": "uint8"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "VALIDATOR_CONTRACT_ADDR","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "alreadyInit","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "address[]","name": "recipientAddrs","type": "address[]"},{"internalType": "uint256[]","name": "amounts","type": "uint256[]"},{"internalType": "address[]","name": "refundAddrs","type": "address[]"},{"internalType": "uint64","name": "expireTime","type": "uint64"}],"name": "batchTransferOutBNB","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "payable","type": "function"},{"inputs": [{"internalType": "address","name": "","type": "address"}],"name": "bep20ContractDecimals","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "bep2Symbol","type": "bytes32"},{"internalType": "address","name": "contractAddr","type": "address"},{"internalType": "uint256","name": "decimals","type": "uint256"}],"name": "bindToken","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [],"name": "bscChainID","outputs": [{"internalType": "uint16","name": "","type": "uint16"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "tokenSymbol","type": "bytes32"},{"internalType": "address","name": "attacker","type": "address"}],"name": "cancelTokenRecoverLock","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "address","name": "tokenAddress","type": "address"},{"internalType": "address","name": "attacker","type": "address"}],"name": "cancelTransferIn","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "uint256","name": "amount","type": "uint256"}],"name": "claimMigrationFund","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "address payable","name": "to","type": "address"},{"internalType": "uint256","name": "amount","type": "uint256"}],"name": "claimRewards","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "address","name": "contractAddr","type": "address"}],"name": "getBep2SymbolByContractAddr","outputs": [{"internalType": "bytes32","name": "","type": "bytes32"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "address","name": "contractAddr","type": "address"}],"name": "getBoundBep2Symbol","outputs": [{"internalType": "string","name": "","type": "string"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "string","name": "bep2Symbol","type": "string"}],"name": "getBoundContract","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "bep2Symbol","type": "bytes32"}],"name": "getContractAddrByBEP2Symbol","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "getMiniRelayFee","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint8","name": "channelId","type": "uint8"},{"internalType": "bytes","name": "msgBytes","type": "bytes"}],"name": "handleAckPackage","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "uint8","name": "channelId","type": "uint8"},{"internalType": "bytes","name": "msgBytes","type": "bytes"}],"name": "handleFailAckPackage","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "uint8","name": "channelId","type": "uint8"},{"internalType": "bytes","name": "msgBytes","type": "bytes"}],"name": "handleSynPackage","outputs": [{"internalType": "bytes","name": "","type": "bytes"}],"stateMutability": "nonpayable","type": "function"},{"inputs": [],"name": "init","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "address","name": "","type": "address"}],"name": "largeTransferLimitMap","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "address","name": "","type": "address"},{"internalType": "address","name": "","type": "address"}],"name": "lockInfoMap","outputs": [{"internalType": "uint256","name": "amount","type": "uint256"},{"internalType": "uint256","name": "unlockAt","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [],"name": "lockPeriod","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32","name": "tokenSymbol","type": "bytes32"},{"internalType": "address","name": "recipient","type": "address"},{"internalType": "uint256","name": "amount","type": "uint256"}],"name": "recoverBCAsset","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [],"name": "relayFee","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "address","name": "bep20Token","type": "address"},{"internalType": "uint256","name": "largeTransferLimit","type": "uint256"}],"name": "setLargeTransferLimit","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "address","name": "contractAddr","type": "address"},{"internalType": "address","name": "recipient","type": "address"},{"internalType": "uint256","name": "amount","type": "uint256"},{"internalType": "uint64","name": "expireTime","type": "uint64"}],"name": "transferOut","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "payable","type": "function"},{"inputs": [{"internalType": "bytes32","name": "bep2Symbol","type": "bytes32"},{"internalType": "address","name": "contractAddr","type": "address"}],"name": "unbindToken","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "string","name": "key","type": "string"},{"internalType": "bytes","name": "value","type": "bytes"}],"name": "updateParam","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "uint256","name": "amount","type": "uint256"}],"name": "withdrawStakingBNB","outputs": [{"internalType": "bool","name": "","type": "bool"}],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "address","name": "tokenAddress","type": "address"},{"internalType": "address","name": "recipient","type": "address"}],"name": "withdrawUnlockedToken","outputs": [],"stateMutability": "nonpayable","type": "function"},{"stateMutability": "payable","type": "receive"}]
Contract Creation Code
0x6080604052600436106104405760003560e01c80639509b98011610234578063c81b16621161012e578063ebf71d53116100b6578063fb063e8f1161007a578063fb063e8f146110d3578063fc1a598f146110e8578063fc3e590814610cca578063fd6a68791461111b578063ff9c0027146108a057610488565b8063ebf71d531461106a578063f01484721461107f578063f1fad10414611094578063f9a2bbc7146110a9578063fa9e9159146110be57610488565b8063dc927faf116100fd578063dc927faf14610fce578063df8079e914610fe3578063e04c83a714610ff8578063e1c7392a14611022578063e8f35cea1461103757610488565b8063c81b166214610ef9578063c8509d8114610f0e578063cf41984414610f93578063d9e6dae91461080d57610488565b8063aa7415f5116101bc578063b99328c511610180578063b99328c514610e30578063b9fd21e314610e69578063ba35ead614610e7e578063bbface1f14610e93578063bd46646114610ec657610488565b8063aa7415f514610cdf578063aa82dce114610d26578063aad5606314610d3b578063ab51bb9614610d50578063ac43175114610d6557610488565b80639dc09262116102035780639dc0926214610c76578063a1a11bf514610c8b578063a496fba214610ca0578063a78abc1614610cb5578063a7c9f02d14610cca57610488565b80639509b98014610bda57806396713da914610c135780639a854bbd14610c285780639a99b4f014610c3d57610488565b806359b9278911610345578063727be1f8116102cd578063831d65d111610291578063831d65d114610ac85780638525db0314610b4d5780638b87b21f146107625780638eff336c14610b8657806393ab703f14610bc557610488565b8063727be1f814610a2057806375d47a0a14610a4a5780637942fd0514610a5f578063799758b914610a745780637e434d5414610ab357610488565b80636e056520116103145780636e056520146108b55780636e47b482146109e157806370fd5bad146108a0578063718a8aa8146109f657806371d3086314610a0b57610488565b806359b92789146108615780635d499b1b1461088b578063613684751461080d57806366dea52a146108a057610488565b80633fd8b02f116103c85780634a3acdf4116103975780634a3acdf4146107f85780634bf6c8821461080d57806350432d321461082257806351b4dce31461083757806351e806721461084c57610488565b80633fd8b02f1461078d57806343756e5c146107a257806343a368b9146107b7578063493279b1146107cc57610488565b8063149d14d91161040f578063149d14d91461062157806328087028146106485780632ae454831461065d5780633d713223146106b15780633dffc3871461076257610488565b80630bee7a671461048d5780630e2374a5146104bb5780631182b875146104ec57806312234582146105e657610488565b36610488573415610486576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561049957600080fd5b506104a2611130565b6040805163ffffffff9092168252519081900360200190f35b3480156104c757600080fd5b506104d0611135565b604080516001600160a01b039092168252519081900360200190f35b3480156104f857600080fd5b506105716004803603604081101561050f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561053357600080fd5b82018360208201111561054557600080fd5b803590602001918460018302840111600160201b8311171561056657600080fd5b50909250905061113b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ab578181015183820152602001610593565b50505050905090810190601f1680156105d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105f257600080fd5b506104866004803603604081101561060957600080fd5b506001600160a01b0381358116916020013516611269565b34801561062d57600080fd5b50610636611363565b60408051918252519081900360200190f35b34801561065457600080fd5b506104d0611369565b34801561066957600080fd5b506106986004803603604081101561068057600080fd5b506001600160a01b038135811691602001351661136f565b6040805192835260208301919091528051918290030190f35b3480156106bd57600080fd5b506104d0600480360360208110156106d457600080fd5b810190602081018135600160201b8111156106ee57600080fd5b82018360208201111561070057600080fd5b803590602001918460018302840111600160201b8311171561072157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611393945050505050565b34801561076e57600080fd5b506107776113b7565b6040805160ff9092168252519081900360200190f35b34801561079957600080fd5b506106366113bc565b3480156107ae57600080fd5b506104d06113c2565b3480156107c357600080fd5b506106366113c8565b3480156107d857600080fd5b506107e16113d4565b6040805161ffff9092168252519081900360200190f35b34801561080457600080fd5b506106366113d9565b34801561081957600080fd5b506107776113df565b34801561082e57600080fd5b506106366113e4565b34801561084357600080fd5b506104d06113ef565b34801561085857600080fd5b506104d06113f5565b34801561086d57600080fd5b506104d06004803603602081101561088457600080fd5b50356113fb565b34801561089757600080fd5b50610636611416565b3480156108ac57600080fd5b5061077761141f565b6109cd600480360360808110156108cb57600080fd5b810190602081018135600160201b8111156108e557600080fd5b8201836020820111156108f757600080fd5b803590602001918460208302840111600160201b8311171561091857600080fd5b919390929091602081019035600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b91935091503567ffffffffffffffff16611424565b604080519115158252519081900360200190f35b3480156109ed57600080fd5b506104d06118f9565b348015610a0257600080fd5b506107776118ff565b348015610a1757600080fd5b50610636611904565b348015610a2c57600080fd5b506109cd60048036036020811015610a4357600080fd5b503561190a565b348015610a5657600080fd5b506104d061198b565b348015610a6b57600080fd5b50610777611991565b348015610a8057600080fd5b5061048660048036036060811015610a9757600080fd5b508035906001600160a01b036020820135169060400135611996565b348015610abf57600080fd5b506104d0611c46565b348015610ad457600080fd5b5061048660048036036040811015610aeb57600080fd5b60ff8235169190810190604081016020820135600160201b811115610b0f57600080fd5b820183602082011115610b2157600080fd5b803590602001918460018302840111600160201b83111715610b4257600080fd5b509092509050611c4c565b348015610b5957600080fd5b5061048660048036036040811015610b7057600080fd5b50803590602001356001600160a01b0316611d94565b348015610b9257600080fd5b5061048660048036036060811015610ba957600080fd5b508035906001600160a01b036020820135169060400135611efd565b348015610bd157600080fd5b50610636611f83565b348015610be657600080fd5b5061048660048036036040811015610bfd57600080fd5b506001600160a01b038135169060200135611f8a565b348015610c1f57600080fd5b50610777612147565b348015610c3457600080fd5b5061063661214c565b348015610c4957600080fd5b5061063660048036036040811015610c6057600080fd5b506001600160a01b038135169060200135612158565b348015610c8257600080fd5b506104d0612296565b348015610c9757600080fd5b506104d061229c565b348015610cac57600080fd5b506107776122a2565b348015610cc157600080fd5b506109cd6122a7565b348015610cd657600080fd5b506107776122b0565b6109cd60048036036080811015610cf557600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166122b5565b348015610d3257600080fd5b506104d0612335565b348015610d4757600080fd5b506104d061233b565b348015610d5c57600080fd5b506104a26122a2565b348015610d7157600080fd5b5061048660048036036040811015610d8857600080fd5b810190602081018135600160201b811115610da257600080fd5b820183602082011115610db457600080fd5b803590602001918460018302840111600160201b83111715610dd557600080fd5b919390929091602081019035600160201b811115610df257600080fd5b820183602082011115610e0457600080fd5b803590602001918460018302840111600160201b83111715610e2557600080fd5b509092509050612341565b348015610e3c57600080fd5b5061048660048036036040811015610e5357600080fd5b50803590602001356001600160a01b03166127e9565b348015610e7557600080fd5b50610636612869565b348015610e8a57600080fd5b50610636612873565b348015610e9f57600080fd5b5061063660048036036020811015610eb657600080fd5b50356001600160a01b0316612879565b348015610ed257600080fd5b5061063660048036036020811015610ee957600080fd5b50356001600160a01b031661288b565b348015610f0557600080fd5b506104d06128a6565b348015610f1a57600080fd5b5061048660048036036040811015610f3157600080fd5b60ff8235169190810190604081016020820135600160201b811115610f5557600080fd5b820183602082011115610f6757600080fd5b803590602001918460018302840111600160201b83111715610f8857600080fd5b5090925090506128ac565b348015610f9f57600080fd5b5061048660048036036040811015610fb657600080fd5b506001600160a01b038135811691602001351661297c565b348015610fda57600080fd5b506104d0612c50565b348015610fef57600080fd5b506104d0612c56565b34801561100457600080fd5b506109cd6004803603602081101561101b57600080fd5b5035612c5c565b34801561102e57600080fd5b50610486612cfc565b34801561104357600080fd5b506106366004803603602081101561105a57600080fd5b50356001600160a01b0316612d9c565b34801561107657600080fd5b50610777612dae565b34801561108b57600080fd5b50610777612db3565b3480156110a057600080fd5b50610777612db8565b3480156110b557600080fd5b506104d0612dbd565b3480156110ca57600080fd5b50610636612dc3565b3480156110df57600080fd5b50610636612dc9565b3480156110f457600080fd5b506105716004803603602081101561110b57600080fd5b50356001600160a01b0316612dd7565b34801561112757600080fd5b506104d0612efe565b606481565b61200181565b60005460609060ff16611183576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33612000146111c35760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff8416600214156112155761120e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0492505050565b9050611262565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b33612000146112a95760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b6001600160a01b0380831660009081526007602090815260408083209385168352929052208054611314576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b0380861692908716917f152fb15aa5d80f843e1e4bd5f2fc9161714f169945024decec7e84fb910fdd519181900360200190a350505050565b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b603881565b61a8c081565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661146a576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b8685146114a85760405162461bcd60e51b815260040180806020018281038252603b815260200180615357603b913960400191505060405180910390fd5b8683146114e65760405162461bcd60e51b815260040180806020018281038252603f815260200180615269603f913960400191505060405180910390fd5b426078018267ffffffffffffffff1610156115325760405162461bcd60e51b81526004018080602001828103825260248152602001806151e56024913960400191505060405180910390fd5b6402540be4003406156115765760405162461bcd60e51b815260040180806020018281038252604081526020018061545a6040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156115a9578160200160208202803683370190505b50905060005b84811015611684576402540be4008b8b838181106115c957fe5b90506020020135816115d757fe5b06156116145760405162461bcd60e51b815260040180806020018281038252603c8152602001806152a8603c913960400191505060405180910390fd5b6116398b8b8381811061162357fe5b905060200201358561302890919063ffffffff16565b93506116656402540be4008c8c8481811061165057fe5b9050602002013561308290919063ffffffff16565b82828151811061167157fe5b60209081029190910101526001016115af565b506001546116a99061169c908663ffffffff6130c416565b849063ffffffff61302816565b3410156116e75760405162461bcd60e51b81526004018080602001828103825260568152602001806154046056913960600191505060405180910390fd5b6116f7348463ffffffff61311d16565b9150611701615023565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036117c58461315f565b6117da876402540be40063ffffffff61308216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611838578181015183820152602001611820565b50505050905090810190601f1680156118655780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561188657600080fd5b505af115801561189a573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b6000336120011461194c5760405162461bcd60e51b815260040180806020018281038252603381526020018061513d6033913960400191505060405180910390fd5b8115611983576040516120019083156108fc029084906000818181858888f19350505050158015611981573d6000803e3d6000fd5b505b506001919050565b61100881565b600b81565b60005460ff166119db576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b3361300014611a1b5760405162461bcd60e51b815260040180806020018281038252602b81526020018061523e602b913960400191505060405180910390fd5b677ce66c50e2840000811115611a625760405162461bcd60e51b81526004018080602001828103825260358152602001806152096035913960400191505060405180910390fd5b60006221272160e91b8414611bcc576000848152600460205260409020546001600160a01b031680611ad5576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a35050611c41565b6001600160a01b038116600090815260026020526040902054611af8848261341a565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611b4357600080fd5b505afa158015611b57573d6000803e3d6000fd5b505050506040513d6020811015611b6d57600080fd5b50511015611bb9576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b611bc58683858861345a565b5050611c3f565b611be1826402540be40063ffffffff6130c416565b905080471015611c2f576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6000611c3d8582848761345a565b505b505b505050565b61200381565b60005460ff16611c91576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b3361200014611cd15760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff831660031415611d2157611d1c82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506134f492505050565b611c41565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b3361300014611dd45760405162461bcd60e51b815260040180806020018281038252602b81526020018061523e602b913960400191505060405180910390fd5b60006221272160e91b8314611e3f57506000828152600460205260409020546001600160a01b031680611e3f576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526007602090815260408083209386168352929052208054611eaa576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814611f3d5760405162461bcd60e51b81526004018080602001828103825260238152602001806153c16023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc457600080fd5b505afa158015611fd8573d6000803e3d6000fd5b505050506040513d6020811015611fee57600080fd5b50516001600160a01b0316331461204c576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b6000821161209a576040805162461bcd60e51b81526020600482015260166024820152751e995c9bc81b1a5b5a5d081b9bdd08185b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b0383166000908152600360205260409020546120f0576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b038316600081815260066020908152604091829020859055815185815291513393927f9df3a90730dbf23b5cc18dbbd5f4af3fa94a0dffb6ff6841f98a9a9a6ac626a892908290030190a3505050565b600981565b677ce66c50e284000081565b6000805460ff1661219e576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33611005146121de5760405162461bcd60e51b815260040180806020018281038252602f815260200180615170602f913960400191505060405180910390fd5b60004783106121ed57476121ef565b825b9050670de0b6b3a764000081111561220b576000915050612290565b801561228d576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015612247573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff166122fb576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200281565b61300081565b33611007146123815760405162461bcd60e51b815260040180806020018281038252602e815260200180615305602e913960400191505060405180910390fd5b602081146123d6576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b8114156124de576020820151670de0b6b3a7640000811180159061248557506402540be4008106155b6124d6576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155612754565b61255287878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601781527f6c617267655472616e736665724c6f636b506572696f64000000000000000000602082015291506135509050565b156125ee57604080516020601f87018190048102820181019092528581526000916125959188888083850183828082843760009201919091525061363792505050565b905062093a808111156125e6576040805162461bcd60e51b81526020600482015260146024820152736c6f636b20706572696f6420746f6f206c6f6e6760601b604482015290519081900360640190fd5b600555612754565b61265a87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526015815274189b9893185c99d9551c985b9cd9995c931a5b5a5d605a1b602082015291506135509050565b1561271757604080516020601f870181900481028201810190925285815260009161269d9188888083850183828082843760009201919091525061363792505050565b905068056bc75e2d631000008110156126e75760405162461bcd60e51b815260040180806020018281038252602281526020018061519f6022913960400191505060405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855612754565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b33611008146128295760405162461bcd60e51b81526004018080602001828103825260238152602001806153c16023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b039290921683526003815281832083905560029052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff166128f1576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33612000146129315760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff831660031415611d2157611d1c82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061363c92505050565b60085460ff16600214156129c8576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054612a40576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015612a99576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516612b0c576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114612afc576040519150601f19603f3d011682016040523d82523d6000602084013e612b01565b606091505b505080915050612b9f565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612b6f57600080fd5b5087f1158015612b83573d6000803e3d6000fd5b50505050506040513d6020811015612b9a57600080fd5b505190505b80612bf1576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b61200481565b60003361200214612cb4576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710612cf4576040516120029083156108fc029084906000818181858888f19350505050158015612cea573d6000803e3d6000fd5b50600190506113b2565b506000919050565b60005460ff1615612d54576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b601181565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015612e6757828160ff1681518110612e3b57fe5b01602001516001600160f81b03191615612e5a57816001019150612e5f565b612e67565b600101612e20565b5060608160ff166040519080825280601f01601f191660200182016040528015612e98576020820181803683370190505b50905060005b8260ff168160ff161015612ef457838160ff1681518110612ebb57fe5b602001015160f81c60f81b828260ff1681518110612ed557fe5b60200101906001600160f81b031916908160001a905350600101612e9e565b5095945050505050565b61100481565b6060612f0e61506f565b6000612f1984613733565b9150915080612f6f576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b6000612f7a83613872565b905063ffffffff81161561300e576040808401516020808601516001600160a01b03166000908152600290915291822054612fb59190613bd8565b9050612fbf6150a4565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061300281613c11565b955050505050506113b2565b505060408051600081526020810190915291506113b29050565b60008282018381101561228d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061228d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ced565b6000826130d357506000612290565b828202828482816130e057fe5b041461228d5760405162461bcd60e51b81526004018080602001828103825260218152602001806152e46021913960400191505060405180910390fd5b600061228d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d8f565b60408051600680825260e08201909252606091829190816020015b606081526020019060019003908161317a575050835190915061319c90613de9565b816000815181106131a957fe5b60200260200101819052506131ca83602001516001600160a01b0316613dfc565b816001815181106131d757fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561322257816020015b606081526020019060019003908161320d5790505b50905060005b8281101561326f576132508660400151828151811061324357fe5b6020026020010151613de9565b82828151811061325c57fe5b6020908102919091010152600101613228565b5061327981613e1f565b8360028151811061328657fe5b60200260200101819052506060826040519080825280602002602001820160405280156132c757816020015b60608152602001906001900390816132b25790505b50905060005b8381101561331d576132fe876060015182815181106132e857fe5b60200260200101516001600160a01b0316613dfc565b82828151811061330a57fe5b60209081029190910101526001016132cd565b5061332781613e1f565b8460038151811061333457fe5b602002602001018190525060608360405190808252806020026020018201604052801561337557816020015b60608152602001906001900390816133605790505b50905060005b848110156133b557613396886080015182815181106132e857fe5b8282815181106133a257fe5b602090810291909101015260010161337b565b506133bf81613e1f565b856004815181106133cc57fe5b60200260200101819052506133ee8760a0015167ffffffffffffffff16613de9565b856005815181106133fb57fe5b602002602001018190525061340f85613e1f565b979650505050505050565b600060088211156134435761343c836007198401600a0a63ffffffff6130c416565b9050612290565b61228d836008849003600a0a63ffffffff61308216565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054613491908463ffffffff61302816565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b6134fc6150cb565b600061350783613ea9565b91509150806135475760405162461bcd60e51b81526004018080602001828103825260248152602001806153336024913960400191505060405180910390fd5b611c4182614074565b6000816040516020018082805190602001908083835b602083106135855780518252601f199092019160209182019101613566565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106135f35780518252601f1990920191602091820191016135d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b613644615023565b600061364f836144f8565b915091508061368f5760405162461bcd60e51b81526004018080602001828103825260248152602001806151c16024913960400191505060405180910390fd5b6136976150cb565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015613718576136f5856040015182815181106136e757fe5b60200260200101518361341a565b8560400151828151811061370557fe5b60209081029190910101526001016136c7565b506080840151604083015260056060830152611c3d82614074565b61373b61506f565b600061374561506f565b61374d615102565b61375e6137598661475c565b614781565b90506000805b61376d836147cb565b15613865578061378f57613788613783846147ec565b61483a565b845261385d565b80600114156137bc576137a96137a4846147ec565b6148f1565b6001600160a01b0316602085015261385d565b80600214156137db576137d1613783846147ec565b604085015261385d565b8060031415613803576137f06137a4846147ec565b6001600160a01b0316606085015261385d565b806004141561382b576138186137a4846147ec565b6001600160a01b0316608085015261385d565b806005141561385857613840613783846147ec565b67ffffffffffffffff1660a08501526001915061385d565b613865565b600101613764565b5091935090915050915091565b60208101516000906001600160a01b03166139b6578160a0015167ffffffffffffffff164211156138a5575060016113b2565b81604001514710156138b9575060036113b2565b6138c28261490b565b61393757606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d806000811461391d576040519150601f19603f3d011682016040523d82523d6000602084013e613922565b606091505b50509050806139355750600490506113b2565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060006113b2565b8160a0015167ffffffffffffffff164211156139d4575060016113b2565b81516020808401516001600160a01b031660009081526003909152604090205414613a01575060026113b2565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015613a5157600080fd5b5086fa158015613a65573d6000803e3d6000fd5b50505050506040513d6020811015613a7c57600080fd5b50516040840151909150811015613a975750600390506113b2565b613aa08361490b565b613b5757600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015613b1557600080fd5b5087f1158015613b29573d6000803e3d6000fd5b50505050506040513d6020811015613b4057600080fd5b5051905080613b555750600591506113b29050565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a150600090506113b2565b60006008821115613bfa5761343c836007198401600a0a63ffffffff61308216565b61228d836008849003600a0a63ffffffff6130c416565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613c2c5750508351909150613c4e90613de9565b81600081518110613c5b57fe5b6020026020010181905250613c738360200151613de9565b81600181518110613c8057fe5b6020026020010181905250613ca183604001516001600160a01b0316613dfc565b81600281518110613cae57fe5b6020026020010181905250613ccc836060015163ffffffff16613de9565b81600381518110613cd957fe5b602002602001018190525061126281613e1f565b60008183613d795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d3e578181015183820152602001613d26565b50505050905090810190601f168015613d6b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d8557fe5b0495945050505050565b60008184841115613de15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d3e578181015183820152602001613d26565b505050900390565b6060612290613df783614a79565b614b5f565b60408051600560a21b831860148201526034810190915260609061126281614b5f565b6060815160001415613e4057506040805160008152602081019091526113b2565b606082600081518110613e4f57fe5b602002602001015190506000600190505b8351811015613e9057613e8682858381518110613e7957fe5b6020026020010151614bb1565b9150600101613e60565b50611262613ea3825160c060ff16614c2e565b82614bb1565b613eb16150cb565b6000613ebb6150cb565b613ec3615102565b613ecf6137598661475c565b90506000805b613ede836147cb565b156138655780613f0457613ef46137a4846147ec565b6001600160a01b0316845261406c565b8060011415613fa5576060613f20613f1b856147ec565b614d26565b90508051604051908082528060200260200182016040528015613f4d578160200160208202803683370190505b50602086015260005b8151811015613f9e57613f7b828281518110613f6e57fe5b602002602001015161483a565b86602001518281518110613f8b57fe5b6020908102919091010152600101613f56565b505061406c565b8060021415614047576060613fbc613f1b856147ec565b90508051604051908082528060200260200182016040528015613fe9578160200160208202803683370190505b50604086015260005b8151811015613f9e5761401782828151811061400a57fe5b60200260200101516148f1565b8660400151828151811061402757fe5b6001600160a01b0390921660209283029190910190910152600101613ff2565b80600314156138585761405c613783846147ec565b63ffffffff166060850152600191505b600101613ed5565b80516001600160a01b031661429e5760005b816020015151811015614298576000826040015182815181106140a557fe5b60200260200101516001600160a01b0316612710846020015184815181106140c957fe5b60209081029190910101516040516000818181858888f193505050503d8060008114614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b50509050806141d9577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061415557fe5b60200260200101518560200151858151811061416d57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a161428f565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061420f57fe5b60200260200101518560200151858151811061422757fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101614086565b506144f5565b60005b8160200151518110156144f357600082600001516001600160a01b031663a9059cbb61c350856040015185815181106142d657fe5b6020026020010151866020015186815181106142ee57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561434557600080fd5b5087f1158015614359573d6000803e3d6000fd5b50505050506040513d602081101561437057600080fd5b505190508015614434577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106143b057fe5b6020026020010151856020015185815181106143c857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16144ea565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061446a57fe5b60200260200101518560200151858151811061448257fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016142a1565b505b50565b614500615023565b600061450a615023565b614512615102565b61451e6137598661475c565b90506000805b61452d836147cb565b15613865578061454a57614543613783846147ec565b8452614754565b80600114156145725761455f6137a4846147ec565b6001600160a01b03166020850152614754565b8060021415614601576060614589613f1b856147ec565b905080516040519080825280602002602001820160405280156145b6578160200160208202803683370190505b50604086015260005b81518110156145fa576145d7828281518110613f6e57fe5b866040015182815181106145e757fe5b60209081029190910101526001016145bf565b5050614754565b8060031415614696576060614618613f1b856147ec565b90508051604051908082528060200260200182016040528015614645578160200160208202803683370190505b50606086015260005b81518110156145fa5761466682828151811061400a57fe5b8660600151828151811061467657fe5b6001600160a01b039092166020928302919091019091015260010161464e565b806004141561472b5760606146ad613f1b856147ec565b905080516040519080825280602002602001820160405280156146da578160200160208202803683370190505b50608086015260005b81518110156145fa576146fb82828151811061400a57fe5b8660800151828151811061470b57fe5b6001600160a01b03909216602092830291909101909101526001016146e3565b806005141561385857614740613783846147ec565b67ffffffffffffffff1660a0850152600191505b600101614524565b614764615122565b506040805180820190915281518152602082810190820152919050565b614789615102565b61479282614df7565b61479b57600080fd5b60006147aa8360200151614e31565b60208085015160408051808201909152868152920190820152915050919050565b60006147d5615122565b505080518051602091820151919092015191011190565b6147f4615122565b6147fd826147cb565b61480657600080fd5b6020820151600061481682614e94565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061484f57508151602110155b61485857600080fd5b60006148678360200151614e31565b905080836000015110156148c2576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156148e857826020036101000a820491505b50949350505050565b805160009060151461490257600080fd5b6122908261483a565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8541580156149445750600554155b156149865760008052600660205269021e19e0c9bab24000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85561a8c06005555b6020808301516001600160a01b03166000908152600690915260409020548015806149b45750808360400151105b156149c35760009150506113b2565b6020808401516001600160a01b039081166000908152600783526040808220606088015190931682529190925290819020908401518154614a099163ffffffff61302816565b8155600554420160018201819055606085015160208087015160408089015181519081529283019490945283516001600160a01b039384169493909116927f3fb83143cd331170da18fb1e8564d97e8ec39264b6ecb1ba248ea7596ab07258928290030190a35060019392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614abd57506018614ae1565b6fffffffffffffffffffffffffffffffff198416614add57506010614ae1565b5060005b6020811015614b1757818181518110614af657fe5b01602001516001600160f81b03191615614b0f57614b17565b600101614ae1565b60008160200390506060816040519080825280601f01601f191660200182016040528015614b4c576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015614b915750607f60f81b82600081518110614b7f57fe5b01602001516001600160f81b03191611155b15614b9d5750806113b2565b612290614baf8351608060ff16614c2e565b835b6060806040519050835180825260208201818101602087015b81831015614be2578051835260209283019201614bca565b50855184518101855292509050808201602086015b81831015614c0f578051835260209283019201614bf7565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614c7e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614cd85782840160f81b81600081518110614cba57fe5b60200101906001600160f81b031916908160001a9053509050612290565b6060614ce385614a79565b90508381510160370160f81b82600081518110614cfc57fe5b60200101906001600160f81b031916908160001a905350614d1d8282614bb1565b95945050505050565b6060614d3182614df7565b614d3a57600080fd5b6000614d4583614fc7565b9050606081604051908082528060200260200182016040528015614d8357816020015b614d70615122565b815260200190600190039081614d685790505b5090506000614d958560200151614e31565b60208601510190506000805b84811015614dec57614db283614e94565b9150604051806040016040528083815260200184815250848281518110614dd557fe5b602090810291909101015291810191600101614da1565b509195945050505050565b8051600090614e08575060006113b2565b6020820151805160001a9060c0821015614e27576000925050506113b2565b5060019392505050565b8051600090811a6080811015614e4b5760009150506113b2565b60b8811080614e66575060c08110801590614e66575060f881105b15614e755760019150506113b2565b60c0811015614e895760b5190190506113b2565b60f5190190506113b2565b80516000908190811a6080811015614eaf5760019150614fc0565b60b8811015614ec457607e1981019150614fc0565b60c0811015614f3e57600060b78203600186019550806020036101000a865104915060018101820193505080831015614f38576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614fc0565b60f8811015614f535760be1981019150614fc0565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614fbe576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090614fd8575060006113b2565b60008090506000614fec8460200151614e31565b602085015185519181019250015b8082101561501a5761500b82614e94565b82019150826001019250614ffa565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280615115615122565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374626e62206c61726765207472616e73666572206c696d697420746f6f20736d616c6c756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c4c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea164736f6c6343000604000aDeployed Bytecode
0x6080604052600436106104405760003560e01c80639509b98011610234578063c81b16621161012e578063ebf71d53116100b6578063fb063e8f1161007a578063fb063e8f146110d3578063fc1a598f146110e8578063fc3e590814610cca578063fd6a68791461111b578063ff9c0027146108a057610488565b8063ebf71d531461106a578063f01484721461107f578063f1fad10414611094578063f9a2bbc7146110a9578063fa9e9159146110be57610488565b8063dc927faf116100fd578063dc927faf14610fce578063df8079e914610fe3578063e04c83a714610ff8578063e1c7392a14611022578063e8f35cea1461103757610488565b8063c81b166214610ef9578063c8509d8114610f0e578063cf41984414610f93578063d9e6dae91461080d57610488565b8063aa7415f5116101bc578063b99328c511610180578063b99328c514610e30578063b9fd21e314610e69578063ba35ead614610e7e578063bbface1f14610e93578063bd46646114610ec657610488565b8063aa7415f514610cdf578063aa82dce114610d26578063aad5606314610d3b578063ab51bb9614610d50578063ac43175114610d6557610488565b80639dc09262116102035780639dc0926214610c76578063a1a11bf514610c8b578063a496fba214610ca0578063a78abc1614610cb5578063a7c9f02d14610cca57610488565b80639509b98014610bda57806396713da914610c135780639a854bbd14610c285780639a99b4f014610c3d57610488565b806359b9278911610345578063727be1f8116102cd578063831d65d111610291578063831d65d114610ac85780638525db0314610b4d5780638b87b21f146107625780638eff336c14610b8657806393ab703f14610bc557610488565b8063727be1f814610a2057806375d47a0a14610a4a5780637942fd0514610a5f578063799758b914610a745780637e434d5414610ab357610488565b80636e056520116103145780636e056520146108b55780636e47b482146109e157806370fd5bad146108a0578063718a8aa8146109f657806371d3086314610a0b57610488565b806359b92789146108615780635d499b1b1461088b578063613684751461080d57806366dea52a146108a057610488565b80633fd8b02f116103c85780634a3acdf4116103975780634a3acdf4146107f85780634bf6c8821461080d57806350432d321461082257806351b4dce31461083757806351e806721461084c57610488565b80633fd8b02f1461078d57806343756e5c146107a257806343a368b9146107b7578063493279b1146107cc57610488565b8063149d14d91161040f578063149d14d91461062157806328087028146106485780632ae454831461065d5780633d713223146106b15780633dffc3871461076257610488565b80630bee7a671461048d5780630e2374a5146104bb5780631182b875146104ec57806312234582146105e657610488565b36610488573415610486576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561049957600080fd5b506104a2611130565b6040805163ffffffff9092168252519081900360200190f35b3480156104c757600080fd5b506104d0611135565b604080516001600160a01b039092168252519081900360200190f35b3480156104f857600080fd5b506105716004803603604081101561050f57600080fd5b60ff8235169190810190604081016020820135600160201b81111561053357600080fd5b82018360208201111561054557600080fd5b803590602001918460018302840111600160201b8311171561056657600080fd5b50909250905061113b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ab578181015183820152602001610593565b50505050905090810190601f1680156105d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105f257600080fd5b506104866004803603604081101561060957600080fd5b506001600160a01b0381358116916020013516611269565b34801561062d57600080fd5b50610636611363565b60408051918252519081900360200190f35b34801561065457600080fd5b506104d0611369565b34801561066957600080fd5b506106986004803603604081101561068057600080fd5b506001600160a01b038135811691602001351661136f565b6040805192835260208301919091528051918290030190f35b3480156106bd57600080fd5b506104d0600480360360208110156106d457600080fd5b810190602081018135600160201b8111156106ee57600080fd5b82018360208201111561070057600080fd5b803590602001918460018302840111600160201b8311171561072157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611393945050505050565b34801561076e57600080fd5b506107776113b7565b6040805160ff9092168252519081900360200190f35b34801561079957600080fd5b506106366113bc565b3480156107ae57600080fd5b506104d06113c2565b3480156107c357600080fd5b506106366113c8565b3480156107d857600080fd5b506107e16113d4565b6040805161ffff9092168252519081900360200190f35b34801561080457600080fd5b506106366113d9565b34801561081957600080fd5b506107776113df565b34801561082e57600080fd5b506106366113e4565b34801561084357600080fd5b506104d06113ef565b34801561085857600080fd5b506104d06113f5565b34801561086d57600080fd5b506104d06004803603602081101561088457600080fd5b50356113fb565b34801561089757600080fd5b50610636611416565b3480156108ac57600080fd5b5061077761141f565b6109cd600480360360808110156108cb57600080fd5b810190602081018135600160201b8111156108e557600080fd5b8201836020820111156108f757600080fd5b803590602001918460208302840111600160201b8311171561091857600080fd5b919390929091602081019035600160201b81111561093557600080fd5b82018360208201111561094757600080fd5b803590602001918460208302840111600160201b8311171561096857600080fd5b919390929091602081019035600160201b81111561098557600080fd5b82018360208201111561099757600080fd5b803590602001918460208302840111600160201b831117156109b857600080fd5b91935091503567ffffffffffffffff16611424565b604080519115158252519081900360200190f35b3480156109ed57600080fd5b506104d06118f9565b348015610a0257600080fd5b506107776118ff565b348015610a1757600080fd5b50610636611904565b348015610a2c57600080fd5b506109cd60048036036020811015610a4357600080fd5b503561190a565b348015610a5657600080fd5b506104d061198b565b348015610a6b57600080fd5b50610777611991565b348015610a8057600080fd5b5061048660048036036060811015610a9757600080fd5b508035906001600160a01b036020820135169060400135611996565b348015610abf57600080fd5b506104d0611c46565b348015610ad457600080fd5b5061048660048036036040811015610aeb57600080fd5b60ff8235169190810190604081016020820135600160201b811115610b0f57600080fd5b820183602082011115610b2157600080fd5b803590602001918460018302840111600160201b83111715610b4257600080fd5b509092509050611c4c565b348015610b5957600080fd5b5061048660048036036040811015610b7057600080fd5b50803590602001356001600160a01b0316611d94565b348015610b9257600080fd5b5061048660048036036060811015610ba957600080fd5b508035906001600160a01b036020820135169060400135611efd565b348015610bd157600080fd5b50610636611f83565b348015610be657600080fd5b5061048660048036036040811015610bfd57600080fd5b506001600160a01b038135169060200135611f8a565b348015610c1f57600080fd5b50610777612147565b348015610c3457600080fd5b5061063661214c565b348015610c4957600080fd5b5061063660048036036040811015610c6057600080fd5b506001600160a01b038135169060200135612158565b348015610c8257600080fd5b506104d0612296565b348015610c9757600080fd5b506104d061229c565b348015610cac57600080fd5b506107776122a2565b348015610cc157600080fd5b506109cd6122a7565b348015610cd657600080fd5b506107776122b0565b6109cd60048036036080811015610cf557600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166122b5565b348015610d3257600080fd5b506104d0612335565b348015610d4757600080fd5b506104d061233b565b348015610d5c57600080fd5b506104a26122a2565b348015610d7157600080fd5b5061048660048036036040811015610d8857600080fd5b810190602081018135600160201b811115610da257600080fd5b820183602082011115610db457600080fd5b803590602001918460018302840111600160201b83111715610dd557600080fd5b919390929091602081019035600160201b811115610df257600080fd5b820183602082011115610e0457600080fd5b803590602001918460018302840111600160201b83111715610e2557600080fd5b509092509050612341565b348015610e3c57600080fd5b5061048660048036036040811015610e5357600080fd5b50803590602001356001600160a01b03166127e9565b348015610e7557600080fd5b50610636612869565b348015610e8a57600080fd5b50610636612873565b348015610e9f57600080fd5b5061063660048036036020811015610eb657600080fd5b50356001600160a01b0316612879565b348015610ed257600080fd5b5061063660048036036020811015610ee957600080fd5b50356001600160a01b031661288b565b348015610f0557600080fd5b506104d06128a6565b348015610f1a57600080fd5b5061048660048036036040811015610f3157600080fd5b60ff8235169190810190604081016020820135600160201b811115610f5557600080fd5b820183602082011115610f6757600080fd5b803590602001918460018302840111600160201b83111715610f8857600080fd5b5090925090506128ac565b348015610f9f57600080fd5b5061048660048036036040811015610fb657600080fd5b506001600160a01b038135811691602001351661297c565b348015610fda57600080fd5b506104d0612c50565b348015610fef57600080fd5b506104d0612c56565b34801561100457600080fd5b506109cd6004803603602081101561101b57600080fd5b5035612c5c565b34801561102e57600080fd5b50610486612cfc565b34801561104357600080fd5b506106366004803603602081101561105a57600080fd5b50356001600160a01b0316612d9c565b34801561107657600080fd5b50610777612dae565b34801561108b57600080fd5b50610777612db3565b3480156110a057600080fd5b50610777612db8565b3480156110b557600080fd5b506104d0612dbd565b3480156110ca57600080fd5b50610636612dc3565b3480156110df57600080fd5b50610636612dc9565b3480156110f457600080fd5b506105716004803603602081101561110b57600080fd5b50356001600160a01b0316612dd7565b34801561112757600080fd5b506104d0612efe565b606481565b61200181565b60005460609060ff16611183576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33612000146111c35760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff8416600214156112155761120e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0492505050565b9050611262565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b33612000146112a95760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b6001600160a01b0380831660009081526007602090815260408083209385168352929052208054611314576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b0380861692908716917f152fb15aa5d80f843e1e4bd5f2fc9161714f169945024decec7e84fb910fdd519181900360200190a350505050565b60015490565b61200581565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b603881565b61a8c081565b600881565b66071afd498d000081565b61200681565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661146a576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b8685146114a85760405162461bcd60e51b815260040180806020018281038252603b815260200180615357603b913960400191505060405180910390fd5b8683146114e65760405162461bcd60e51b815260040180806020018281038252603f815260200180615269603f913960400191505060405180910390fd5b426078018267ffffffffffffffff1610156115325760405162461bcd60e51b81526004018080602001828103825260248152602001806151e56024913960400191505060405180910390fd5b6402540be4003406156115765760405162461bcd60e51b815260040180806020018281038252604081526020018061545a6040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156115a9578160200160208202803683370190505b50905060005b84811015611684576402540be4008b8b838181106115c957fe5b90506020020135816115d757fe5b06156116145760405162461bcd60e51b815260040180806020018281038252603c8152602001806152a8603c913960400191505060405180910390fd5b6116398b8b8381811061162357fe5b905060200201358561302890919063ffffffff16565b93506116656402540be4008c8c8481811061165057fe5b9050602002013561308290919063ffffffff16565b82828151811061167157fe5b60209081029190910101526001016115af565b506001546116a99061169c908663ffffffff6130c416565b849063ffffffff61302816565b3410156116e75760405162461bcd60e51b81526004018080602001828103825260568152602001806154046056913960600191505060405180910390fd5b6116f7348463ffffffff61311d16565b9150611701615023565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036117c58461315f565b6117da876402540be40063ffffffff61308216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611838578181015183820152602001611820565b50505050905090810190601f1680156118655780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561188657600080fd5b505af115801561189a573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b6000336120011461194c5760405162461bcd60e51b815260040180806020018281038252603381526020018061513d6033913960400191505060405180910390fd5b8115611983576040516120019083156108fc029084906000818181858888f19350505050158015611981573d6000803e3d6000fd5b505b506001919050565b61100881565b600b81565b60005460ff166119db576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b3361300014611a1b5760405162461bcd60e51b815260040180806020018281038252602b81526020018061523e602b913960400191505060405180910390fd5b677ce66c50e2840000811115611a625760405162461bcd60e51b81526004018080602001828103825260358152602001806152096035913960400191505060405180910390fd5b60006221272160e91b8414611bcc576000848152600460205260409020546001600160a01b031680611ad5576040805184815290516001600160a01b0386169187917fc16ee9013bf67c846d37735983debb0acc5b2d1419cb5931c9843ad4689505499181900360200190a35050611c41565b6001600160a01b038116600090815260026020526040902054611af8848261341a565b604080516370a0823160e01b8152306004820152905191945084916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611b4357600080fd5b505afa158015611b57573d6000803e3d6000fd5b505050506040513d6020811015611b6d57600080fd5b50511015611bb9576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b611bc58683858861345a565b5050611c3f565b611be1826402540be40063ffffffff6130c416565b905080471015611c2f576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6000611c3d8582848761345a565b505b505b505050565b61200381565b60005460ff16611c91576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b3361200014611cd15760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff831660031415611d2157611d1c82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506134f492505050565b611c41565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b3361300014611dd45760405162461bcd60e51b815260040180806020018281038252602b81526020018061523e602b913960400191505060405180910390fd5b60006221272160e91b8314611e3f57506000828152600460205260409020546001600160a01b031680611e3f576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081cde5b589bdb60921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526007602090815260408083209386168352929052208054611eaa576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b03808716929086169188917f8041a9a8704332594e2884f5e0f942281cdd7611854c365b4d0aa70b2295d6b6919081900360200190a45050505050565b3361100814611f3d5760405162461bcd60e51b81526004018080602001828103825260238152602001806153c16023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b62093a8081565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc457600080fd5b505afa158015611fd8573d6000803e3d6000fd5b505050506040513d6020811015611fee57600080fd5b50516001600160a01b0316331461204c576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b6000821161209a576040805162461bcd60e51b81526020600482015260166024820152751e995c9bc81b1a5b5a5d081b9bdd08185b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b0383166000908152600360205260409020546120f0576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b038316600081815260066020908152604091829020859055815185815291513393927f9df3a90730dbf23b5cc18dbbd5f4af3fa94a0dffb6ff6841f98a9a9a6ac626a892908290030190a3505050565b600981565b677ce66c50e284000081565b6000805460ff1661219e576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33611005146121de5760405162461bcd60e51b815260040180806020018281038252602f815260200180615170602f913960400191505060405180910390fd5b60004783106121ed57476121ef565b825b9050670de0b6b3a764000081111561220b576000915050612290565b801561228d576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015612247573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff166122fb576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152600a60248201526919195c1c9958d85d195960b21b604482015290519081900360640190fd5b61200281565b61300081565b33611007146123815760405162461bcd60e51b815260040180806020018281038252602e815260200180615305602e913960400191505060405180910390fd5b602081146123d6576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b8114156124de576020820151670de0b6b3a7640000811180159061248557506402540be4008106155b6124d6576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155612754565b61255287878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601781527f6c617267655472616e736665724c6f636b506572696f64000000000000000000602082015291506135509050565b156125ee57604080516020601f87018190048102820181019092528581526000916125959188888083850183828082843760009201919091525061363792505050565b905062093a808111156125e6576040805162461bcd60e51b81526020600482015260146024820152736c6f636b20706572696f6420746f6f206c6f6e6760601b604482015290519081900360640190fd5b600555612754565b61265a87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526015815274189b9893185c99d9551c985b9cd9995c931a5b5a5d605a1b602082015291506135509050565b1561271757604080516020601f870181900481028201810190925285815260009161269d9188888083850183828082843760009201919091525061363792505050565b905068056bc75e2d631000008110156126e75760405162461bcd60e51b815260040180806020018281038252602281526020018061519f6022913960400191505060405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855612754565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b33611008146128295760405162461bcd60e51b81526004018080602001828103825260238152602001806153c16023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b039290921683526003815281832083905560029052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff166128f1576040805162461bcd60e51b815260206004820152601960248201526000805160206153e4833981519152604482015290519081900360640190fd5b33612000146129315760405162461bcd60e51b815260040180806020018281038252602f815260200180615392602f913960400191505060405180910390fd5b60ff831660031415611d2157611d1c82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061363c92505050565b60085460ff16600214156129c8576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054612a40576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015612a99576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516612b0c576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114612afc576040519150601f19603f3d011682016040523d82523d6000602084013e612b01565b606091505b505080915050612b9f565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612b6f57600080fd5b5087f1158015612b83573d6000803e3d6000fd5b50505050506040513d6020811015612b9a57600080fd5b505190505b80612bf1576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b61200481565b60003361200214612cb4576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015290519081900360640190fd5b814710612cf4576040516120029083156108fc029084906000818181858888f19350505050158015612cea573d6000803e3d6000fd5b50600190506113b2565b506000919050565b60005460ff1615612d54576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b601181565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015612e6757828160ff1681518110612e3b57fe5b01602001516001600160f81b03191615612e5a57816001019150612e5f565b612e67565b600101612e20565b5060608160ff166040519080825280601f01601f191660200182016040528015612e98576020820181803683370190505b50905060005b8260ff168160ff161015612ef457838160ff1681518110612ebb57fe5b602001015160f81c60f81b828260ff1681518110612ed557fe5b60200101906001600160f81b031916908160001a905350600101612e9e565b5095945050505050565b61100481565b6060612f0e61506f565b6000612f1984613733565b9150915080612f6f576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b6000612f7a83613872565b905063ffffffff81161561300e576040808401516020808601516001600160a01b03166000908152600290915291822054612fb59190613bd8565b9050612fbf6150a4565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061300281613c11565b955050505050506113b2565b505060408051600081526020810190915291506113b29050565b60008282018381101561228d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061228d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ced565b6000826130d357506000612290565b828202828482816130e057fe5b041461228d5760405162461bcd60e51b81526004018080602001828103825260218152602001806152e46021913960400191505060405180910390fd5b600061228d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d8f565b60408051600680825260e08201909252606091829190816020015b606081526020019060019003908161317a575050835190915061319c90613de9565b816000815181106131a957fe5b60200260200101819052506131ca83602001516001600160a01b0316613dfc565b816001815181106131d757fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561322257816020015b606081526020019060019003908161320d5790505b50905060005b8281101561326f576132508660400151828151811061324357fe5b6020026020010151613de9565b82828151811061325c57fe5b6020908102919091010152600101613228565b5061327981613e1f565b8360028151811061328657fe5b60200260200101819052506060826040519080825280602002602001820160405280156132c757816020015b60608152602001906001900390816132b25790505b50905060005b8381101561331d576132fe876060015182815181106132e857fe5b60200260200101516001600160a01b0316613dfc565b82828151811061330a57fe5b60209081029190910101526001016132cd565b5061332781613e1f565b8460038151811061333457fe5b602002602001018190525060608360405190808252806020026020018201604052801561337557816020015b60608152602001906001900390816133605790505b50905060005b848110156133b557613396886080015182815181106132e857fe5b8282815181106133a257fe5b602090810291909101015260010161337b565b506133bf81613e1f565b856004815181106133cc57fe5b60200260200101819052506133ee8760a0015167ffffffffffffffff16613de9565b856005815181106133fb57fe5b602002602001018190525061340f85613e1f565b979650505050505050565b600060088211156134435761343c836007198401600a0a63ffffffff6130c416565b9050612290565b61228d836008849003600a0a63ffffffff61308216565b6001600160a01b0380841660009081526007602090815260408083209385168352929052208054613491908463ffffffff61302816565b81554262093a80016001820181905560408051858152602081019290925280516001600160a01b03808616939088169289927f446d1aa056e7b903901f49880e9f252762c1b81dc4301cf28db6dae526497eaa9281900390910190a45050505050565b6134fc6150cb565b600061350783613ea9565b91509150806135475760405162461bcd60e51b81526004018080602001828103825260248152602001806153336024913960400191505060405180910390fd5b611c4182614074565b6000816040516020018082805190602001908083835b602083106135855780518252601f199092019160209182019101613566565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106135f35780518252601f1990920191602091820191016135d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b613644615023565b600061364f836144f8565b915091508061368f5760405162461bcd60e51b81526004018080602001828103825260248152602001806151c16024913960400191505060405180910390fd5b6136976150cb565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015613718576136f5856040015182815181106136e757fe5b60200260200101518361341a565b8560400151828151811061370557fe5b60209081029190910101526001016136c7565b506080840151604083015260056060830152611c3d82614074565b61373b61506f565b600061374561506f565b61374d615102565b61375e6137598661475c565b614781565b90506000805b61376d836147cb565b15613865578061378f57613788613783846147ec565b61483a565b845261385d565b80600114156137bc576137a96137a4846147ec565b6148f1565b6001600160a01b0316602085015261385d565b80600214156137db576137d1613783846147ec565b604085015261385d565b8060031415613803576137f06137a4846147ec565b6001600160a01b0316606085015261385d565b806004141561382b576138186137a4846147ec565b6001600160a01b0316608085015261385d565b806005141561385857613840613783846147ec565b67ffffffffffffffff1660a08501526001915061385d565b613865565b600101613764565b5091935090915050915091565b60208101516000906001600160a01b03166139b6578160a0015167ffffffffffffffff164211156138a5575060016113b2565b81604001514710156138b9575060036113b2565b6138c28261490b565b61393757606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d806000811461391d576040519150601f19603f3d011682016040523d82523d6000602084013e613922565b606091505b50509050806139355750600490506113b2565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060006113b2565b8160a0015167ffffffffffffffff164211156139d4575060016113b2565b81516020808401516001600160a01b031660009081526003909152604090205414613a01575060026113b2565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015613a5157600080fd5b5086fa158015613a65573d6000803e3d6000fd5b50505050506040513d6020811015613a7c57600080fd5b50516040840151909150811015613a975750600390506113b2565b613aa08361490b565b613b5757600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015613b1557600080fd5b5087f1158015613b29573d6000803e3d6000fd5b50505050506040513d6020811015613b4057600080fd5b5051905080613b555750600591506113b29050565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a150600090506113b2565b60006008821115613bfa5761343c836007198401600a0a63ffffffff61308216565b61228d836008849003600a0a63ffffffff6130c416565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613c2c5750508351909150613c4e90613de9565b81600081518110613c5b57fe5b6020026020010181905250613c738360200151613de9565b81600181518110613c8057fe5b6020026020010181905250613ca183604001516001600160a01b0316613dfc565b81600281518110613cae57fe5b6020026020010181905250613ccc836060015163ffffffff16613de9565b81600381518110613cd957fe5b602002602001018190525061126281613e1f565b60008183613d795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d3e578181015183820152602001613d26565b50505050905090810190601f168015613d6b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d8557fe5b0495945050505050565b60008184841115613de15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d3e578181015183820152602001613d26565b505050900390565b6060612290613df783614a79565b614b5f565b60408051600560a21b831860148201526034810190915260609061126281614b5f565b6060815160001415613e4057506040805160008152602081019091526113b2565b606082600081518110613e4f57fe5b602002602001015190506000600190505b8351811015613e9057613e8682858381518110613e7957fe5b6020026020010151614bb1565b9150600101613e60565b50611262613ea3825160c060ff16614c2e565b82614bb1565b613eb16150cb565b6000613ebb6150cb565b613ec3615102565b613ecf6137598661475c565b90506000805b613ede836147cb565b156138655780613f0457613ef46137a4846147ec565b6001600160a01b0316845261406c565b8060011415613fa5576060613f20613f1b856147ec565b614d26565b90508051604051908082528060200260200182016040528015613f4d578160200160208202803683370190505b50602086015260005b8151811015613f9e57613f7b828281518110613f6e57fe5b602002602001015161483a565b86602001518281518110613f8b57fe5b6020908102919091010152600101613f56565b505061406c565b8060021415614047576060613fbc613f1b856147ec565b90508051604051908082528060200260200182016040528015613fe9578160200160208202803683370190505b50604086015260005b8151811015613f9e5761401782828151811061400a57fe5b60200260200101516148f1565b8660400151828151811061402757fe5b6001600160a01b0390921660209283029190910190910152600101613ff2565b80600314156138585761405c613783846147ec565b63ffffffff166060850152600191505b600101613ed5565b80516001600160a01b031661429e5760005b816020015151811015614298576000826040015182815181106140a557fe5b60200260200101516001600160a01b0316612710846020015184815181106140c957fe5b60209081029190910101516040516000818181858888f193505050503d8060008114614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b50509050806141d9577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061415557fe5b60200260200101518560200151858151811061416d57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a161428f565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061420f57fe5b60200260200101518560200151858151811061422757fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101614086565b506144f5565b60005b8160200151518110156144f357600082600001516001600160a01b031663a9059cbb61c350856040015185815181106142d657fe5b6020026020010151866020015186815181106142ee57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561434557600080fd5b5087f1158015614359573d6000803e3d6000fd5b50505050506040513d602081101561437057600080fd5b505190508015614434577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106143b057fe5b6020026020010151856020015185815181106143c857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16144ea565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061446a57fe5b60200260200101518560200151858151811061448257fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016142a1565b505b50565b614500615023565b600061450a615023565b614512615102565b61451e6137598661475c565b90506000805b61452d836147cb565b15613865578061454a57614543613783846147ec565b8452614754565b80600114156145725761455f6137a4846147ec565b6001600160a01b03166020850152614754565b8060021415614601576060614589613f1b856147ec565b905080516040519080825280602002602001820160405280156145b6578160200160208202803683370190505b50604086015260005b81518110156145fa576145d7828281518110613f6e57fe5b866040015182815181106145e757fe5b60209081029190910101526001016145bf565b5050614754565b8060031415614696576060614618613f1b856147ec565b90508051604051908082528060200260200182016040528015614645578160200160208202803683370190505b50606086015260005b81518110156145fa5761466682828151811061400a57fe5b8660600151828151811061467657fe5b6001600160a01b039092166020928302919091019091015260010161464e565b806004141561472b5760606146ad613f1b856147ec565b905080516040519080825280602002602001820160405280156146da578160200160208202803683370190505b50608086015260005b81518110156145fa576146fb82828151811061400a57fe5b8660800151828151811061470b57fe5b6001600160a01b03909216602092830291909101909101526001016146e3565b806005141561385857614740613783846147ec565b67ffffffffffffffff1660a0850152600191505b600101614524565b614764615122565b506040805180820190915281518152602082810190820152919050565b614789615102565b61479282614df7565b61479b57600080fd5b60006147aa8360200151614e31565b60208085015160408051808201909152868152920190820152915050919050565b60006147d5615122565b505080518051602091820151919092015191011190565b6147f4615122565b6147fd826147cb565b61480657600080fd5b6020820151600061481682614e94565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061484f57508151602110155b61485857600080fd5b60006148678360200151614e31565b905080836000015110156148c2576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156148e857826020036101000a820491505b50949350505050565b805160009060151461490257600080fd5b6122908261483a565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8541580156149445750600554155b156149865760008052600660205269021e19e0c9bab24000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85561a8c06005555b6020808301516001600160a01b03166000908152600690915260409020548015806149b45750808360400151105b156149c35760009150506113b2565b6020808401516001600160a01b039081166000908152600783526040808220606088015190931682529190925290819020908401518154614a099163ffffffff61302816565b8155600554420160018201819055606085015160208087015160408089015181519081529283019490945283516001600160a01b039384169493909116927f3fb83143cd331170da18fb1e8564d97e8ec39264b6ecb1ba248ea7596ab07258928290030190a35060019392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614abd57506018614ae1565b6fffffffffffffffffffffffffffffffff198416614add57506010614ae1565b5060005b6020811015614b1757818181518110614af657fe5b01602001516001600160f81b03191615614b0f57614b17565b600101614ae1565b60008160200390506060816040519080825280601f01601f191660200182016040528015614b4c576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015614b915750607f60f81b82600081518110614b7f57fe5b01602001516001600160f81b03191611155b15614b9d5750806113b2565b612290614baf8351608060ff16614c2e565b835b6060806040519050835180825260208201818101602087015b81831015614be2578051835260209283019201614bca565b50855184518101855292509050808201602086015b81831015614c0f578051835260209283019201614bf7565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614c7e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614cd85782840160f81b81600081518110614cba57fe5b60200101906001600160f81b031916908160001a9053509050612290565b6060614ce385614a79565b90508381510160370160f81b82600081518110614cfc57fe5b60200101906001600160f81b031916908160001a905350614d1d8282614bb1565b95945050505050565b6060614d3182614df7565b614d3a57600080fd5b6000614d4583614fc7565b9050606081604051908082528060200260200182016040528015614d8357816020015b614d70615122565b815260200190600190039081614d685790505b5090506000614d958560200151614e31565b60208601510190506000805b84811015614dec57614db283614e94565b9150604051806040016040528083815260200184815250848281518110614dd557fe5b602090810291909101015291810191600101614da1565b509195945050505050565b8051600090614e08575060006113b2565b6020820151805160001a9060c0821015614e27576000925050506113b2565b5060019392505050565b8051600090811a6080811015614e4b5760009150506113b2565b60b8811080614e66575060c08110801590614e66575060f881105b15614e755760019150506113b2565b60c0811015614e895760b5190190506113b2565b60f5190190506113b2565b80516000908190811a6080811015614eaf5760019150614fc0565b60b8811015614ec457607e1981019150614fc0565b60c0811015614f3e57600060b78203600186019550806020036101000a865104915060018101820193505080831015614f38576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614fc0565b60f8811015614f535760be1981019150614fc0565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614fbe576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090614fd8575060006113b2565b60008090506000614fec8460200151614e31565b602085015185519181019250015b8082101561501a5761500b82614e94565b82019150826001019250614ffa565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280615115615122565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374626e62206c61726765207472616e73666572206c696d697420746f6f20736d616c6c756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e74746865206d73672073656e646572206d75737420626520746f6b656e207265636f76657220706f7274616c4c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea164736f6c6343000604000a
Deployed Bytecode Sourcemap
30181:24140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33316:9;:11;33312:76;;33343:37;;;33358:10;33343:37;;33370:9;33343:37;;;;;;;;;;;;;;;;;33312:76;30181:24140;;12:1:-1;9;2:12;27058:46:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27058:46:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33934:373;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33934:373:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33934:373:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33934:373:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33934:373:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;33934:373:0;;-1:-1:-1;33934:373:0;-1:-1:-1;33934:373:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33934:373:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33833:95;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33833:95:0;;;:::i;:::-;;;;;;;;;;;;;;;;53384:249;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53384:249:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;53384:249:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;53384:249:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;53384:249:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;53384:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;53384:249:0;;-1:-1:-1;53384:249:0;;-1:-1:-1;;;;;53384:249:0:i;:::-;;;;-1:-1:-1;;;;;53384:249:0;;;;;;;;;;;;;;27111:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27111:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27563:88;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27563:88:0;;;:::i;32158:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32158:48:0;;;:::i;27417:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27417:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27270:46;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27270:46:0;;;:::i;32101:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32101:52:0;;;:::i;28291:94::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28291:94:0;;;:::i;51252:153::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51252:153:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51252:153:0;;:::i;32211:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32211:43:0;;;:::i;31682:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31682:52:0;;;:::i;48597:1870::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;48597:1870:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;48597:1870:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;48597:1870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48597:1870:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;48597:1870:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;48597:1870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48597:1870:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;48597:1870:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;48597:1870:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48597:1870:0;;-1:-1:-1;48597:1870:0;-1:-1:-1;48597:1870:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27927:83;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27927:83:0;;;:::i;32261:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32261:23:0;;;:::i;28199:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28199:87:0;;;:::i;27368:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27368:44:0;;;:::i;34313:291::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34313:291:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34313:291:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34313:291:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34313:291:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34313:291:0;;-1:-1:-1;34313:291:0;-1:-1:-1;34313:291:0;:::i;51574:289::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51574:289:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51574:289:0;;;-1:-1:-1;;;;;51574:289:0;;;;;;;;;;:::i;27321:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27321:42:0;;;:::i;31610:67::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31610:67:0;;;:::i;33399:428::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33399:428:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;33399:428:0;;;;;;;;:::i;28113:81::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28113:81:0;;;:::i;28015:93::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28015:93:0;;;:::i;31223:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31223:47:0;;;:::i;26989:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26989:23:0;;;:::i;31401:68::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31401:68:0;;;:::i;45673:2918::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;45673:2918:0;;-1:-1:-1;;;;;45673:2918:0;;;;;;;;;;;;;;;;;;;;;;;:::i;27019:34::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27019:34:0;;;:::i;50473:773::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50473:773:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;50473:773:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;50473:773:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;50473:773:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;50473:773:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;50473:773:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;50473:773:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;50473:773:0;;-1:-1:-1;50473:773:0;-1:-1:-1;50473:773:0;:::i;51869:206::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51869:206:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51869:206:0;;;;;;-1:-1:-1;;;;;51869:206:0;;:::i;31848:118::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31848:118:0;;;:::i;31980:55::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31980:55:0;;;:::i;32291:56::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32291:56:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32291:56:0;-1:-1:-1;;;;;32291:56:0;;:::i;51411:157::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51411:157:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51411:157:0;-1:-1:-1;;;;;51411:157:0;;:::i;27656:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27656:87:0;;;:::i;34610:299::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34610:299:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34610:299:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34610:299:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34610:299:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34610:299:0;;-1:-1:-1;34610:299:0;-1:-1:-1;34610:299:0;:::i;27748:86::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27748:86:0;;;:::i;33098:175::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33098:175:0;;;:::i;31474:69::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31474:69:0;;;:::i;31548:55::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31548:55:0;;;:::i;27466:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27466:92:0;;;:::i;32040:54::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32040:54:0;;;:::i;53639:679::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53639:679:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53639:679:0;-1:-1:-1;;;;;53639:679:0;;:::i;27839:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27839:83:0;;;:::i;27058:46::-;27101:3;27058:46;:::o;33934:373::-;28666:11;;34060:12;;28666:11;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29337:10:::1;28343:42;29337:39;29329:99;;;;-1:-1:-1::0;;;29329:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34085:34:::2;::::0;::::2;27205:4;34085:34;34081:221;;;34137:36;34164:8;;34137:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;34137:26:0::2;::::0;-1:-1:-1;;;34137:36:0:i:2;:::-;34130:43;;;;34081:221;34224:42;::::0;;-1:-1:-1;;;34224:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;34081:221;33934:373:::0;;;;;:::o;33833:95::-;33914:8;;33833:95;:::o;53384:249::-;53562:2;53546:19;;;53540:26;53457:7;53586:41;;;:24;:41;;;;;;;-1:-1:-1;;;;;53586:41:0;53384:249;;;;:::o;27111:43::-;27150:4;27111:43;:::o;27563:88::-;27609:42;27563:88;:::o;32158:48::-;32202:4;32158:48;:::o;27417:42::-;27453:6;27417:42;:::o;27270:46::-;27312:4;27270:46;:::o;32101:52::-;32149:4;32101:52;:::o;28291:94::-;28343:42;28291:94;:::o;51252:153::-;51340:7;51363:36;;;:24;:36;;;;;;-1:-1:-1;;;;;51363:36:0;;51252:153::o;32211:43::-;32250:4;32211:43;:::o;31682:52::-;31733:1;31682:52;:::o;48597:1870::-;48784:4;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;48805:39;;::::1;48797:111;;;;-1:-1:-1::0;;;48797:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48923:43:::0;;::::1;48915:119;;;;-1:-1:-1::0;;;48915:119:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49061:15;49079:3;49061:21;49049:10;:33;;;;49041:82;;;;-1:-1:-1::0;;;49041:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32250:4;49138:9;:22;:25:::0;49130:102:::1;;;;-1:-1:-1::0;;;49130:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49379:26;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;49261:7;;49239:19:::1;::::0;;;49343:33:::1;::::0;49261:7;49379:26;::::1;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;::::0;-1:-1;49379:26:0::1;-1:-1:-1::0;49343:62:0;-1:-1:-1;49417:6:0::1;49412:264;49433:11;49429:1;:15;49412:264;;;32250:4;49468:7;;49476:1;49468:10;;;;;;;;;;;;;:23;;;;;;:26:::0;49460:99:::1;;;;-1:-1:-1::0;;;49460:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49582:27;49598:7;;49606:1;49598:10;;;;;;;;;;;;;49582:11;:15;;:27;;;;:::i;:::-;49568:41;;49640:28;32250:4;49640:7;;49648:1;49640:10;;;;;;;;;;;;;:14;;:28;;;;:::i;:::-;49618:16;49635:1;49618:19;;;;;;;;;::::0;;::::1;::::0;;;;;:50;49446:3:::1;;49412:264;;;-1:-1:-1::0;49717:8:0::1;::::0;49701:42:::1;::::0;49717:25:::1;::::0;49730:11;49717:25:::1;:12;:25;:::i;:::-;49701:11:::0;;:42:::1;:15;:42;:::i;:::-;49690:9;:53;;49682:152;;;;-1:-1:-1::0;;;49682:152:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49860:26;:9;49874:11:::0;49860:26:::1;:13;:26;:::i;:::-;49841:45;;49895:43;;:::i;:::-;49941:250;;;;;;;;-1:-1:-1::0;;;49989:25:0::1;;49941:250;;;;50045:4;-1:-1:-1::0;;;;;49941:250:0::1;;;;;50068:16;49941:250;;;;50105:14;;49941:250;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;49941:250:0;;;-1:-1:-1;49941:250:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;50141:11;;;;;;49941:250;::::1;::::0;50141:11;;49941:250;50141:11;49941:250;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;49941:250:0;;;-1:-1:-1;49941:250:0::1;::::0;::::1;;::::0;;::::1;::::0;49895:296;-1:-1:-1;28343:42:0::1;50198:53;27261:4;50276:43;49895:296:::0;50276:27:::1;:43::i;:::-;50321:34;:16:::0;32250:4:::1;50321:34;:20;:34;:::i;:::-;50198:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;50198:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;50198:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;50368:75:0::1;::::0;;50395:3:::1;50368:75:::0;;50401:10:::1;50368:75;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;-1:-1:-1;50368:75:0;;;;;;;-1:-1:-1;50368:75:0::1;-1:-1:-1::0;50457:4:0::1;::::0;48597:1870;-1:-1:-1;;;;;;;;;;;;48597:1870:0:o;27927:83::-;27968:42;27927:83;:::o;32261:23::-;;;;:::o;28199:87::-;28244:42;28199:87;:::o;27368:44::-;27408:4;27368:44;:::o;34313:291::-;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29337:10:::1;28343:42;29337:39;29329:99;;;;-1:-1:-1::0;;;29329:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34442:35:::2;::::0;::::2;27261:4;34442:35;34438:161;;;34488:37;34516:8;;34488:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;34488:27:0::2;::::0;-1:-1:-1;;;34488:37:0:i:2;:::-;34438:161;;;34553:38;34571:9;34582:8;;34553:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::2;74:27:::0;34553:38:0::2;::::0;137:4:-1::2;117:14:::0;;::::2;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;34553:38:0::0;;::::2;::::0;-1:-1:-1;34553:38:0;;-1:-1:-1;;;;;34553:38:0::2;34438:161;34313:291:::0;;;:::o;51574:289::-;29795:10;28244:42;29795:32;29787:80;;;;-1:-1:-1;;;29787:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51695:36:::1;::::0;;;:24:::1;:36;::::0;;;;;;;:51;;-1:-1:-1;;;;;51695:51:0;;::::1;-1:-1:-1::0;;;;;;51695:51:0;;::::1;::::0;::::1;::::0;;51753:38;;;:24:::1;:38:::0;;;;;:51;;;;51811:21:::1;:35:::0;;;;;:46;51574:289::o;27321:42::-;27359:4;27321:42;:::o;31610:67::-;31658:19;31610:67;:::o;33399:428::-;33515:7;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29497:10:::1;27968:42;29497:30;29489:90;;;;-1:-1:-1::0;;;29489:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33531:20:::2;33563:21;33554:6;:30;:63;;33596:21;33554:63;;;33587:6;33554:63;33531:86;;32202:4;33628:12;:33;33624:64;;;33679:1;33672:8;;;;;33624:64;33698:14:::0;;33694:102:::2;;33723:25;::::0;-1:-1:-1;;;;;33723:11:0;::::2;::::0;:25;::::2;;;::::0;33735:12;;33723:25:::2;::::0;;;33735:12;33723:11;:25;::::2;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;33762:26:0::2;::::0;;-1:-1:-1;;;;;33762:26:0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;33694:102;33809:12:::0;-1:-1:-1;29586:1:0::2;33399:428:::0;;;;:::o;28113:81::-;28152:42;28113:81;:::o;28015:93::-;28066:42;28015:93;:::o;31223:47::-;31269:1;31223:47;:::o;26989:23::-;;;;;;:::o;31401:68::-;31468:1;31401:68;:::o;45673:2918::-;45814:4;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;45847:15:::1;45865:3;45847:21;45835:10;:33;;;;45827:82;;;;-1:-1:-1::0;;;45827:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32250:4;45924:9;:22;:25:::0;45916:102:::1;;;;-1:-1:-1::0;;;45916:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46025:23;::::0;;-1:-1:-1;;;;;46120:26:0;::::1;46116:1766;;46187:8;::::0;46176:20:::1;::::0;:6;;:20:::1;:10;:20;:::i;:::-;46165:9;:31;;46157:141;;;;-1:-1:-1::0;;;46157:141:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32250:4;46315:6:::0;:19:::1;:22:::0;46307:95:::1;;;;-1:-1:-1::0;;;46307:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46428:21;:9;46442:6:::0;46428:21:::1;:13;:21;:::i;:::-;46411:38:::0;-1:-1:-1;46476:24:0::1;:6:::0;32250:4:::1;46476:24;:10;:24;:::i;:::-;-1:-1:-1::0;;;31900:66:0;-1:-1:-1;46458:42:0;-1:-1:-1;46116:1766:0::1;;;-1:-1:-1::0;;;;;46670:38:0;::::1;;::::0;;;:24:::1;:38;::::0;;;;;;-1:-1:-1;46725:30:0;46717:92:::1;;;;-1:-1:-1::0;;;46717:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46837:8;;46826:9;:19;;46818:95;;;;-1:-1:-1::0;;;46818:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;46984:35:0;::::1;46957:26;46984:35:::0;;;:21:::1;:35;::::0;;;;;46939:9:::1;::::0;31842:1:::1;47036:39:::0;::::1;;::::0;:146:::1;;-1:-1:-1::0;31842:1:0::1;47080:38:::0;::::1;:101:::0;::::1;;;-1:-1:-1::0;47122:56:0::1;:6:::0;-1:-1:-1;;47138:38:0;;47133:2:::1;:44;47122:56;:10;:56;:::i;:::-;:59:::0;47080:101:::1;47028:219;;;;-1:-1:-1::0;;;47028:219:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47274:47;47294:6;47302:18;47274:19;:47::i;:::-;47256:65;;47359:32;47375:15;47359;:32::i;:::-;47355:153;;;47431:3;47412:15;:22;;47404:94;;;;-1:-1:-1::0;;;47404:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31842:1;47524:39:::0;::::1;;::::0;:109:::1;;-1:-1:-1::0;31842:1:0::1;47568:38:::0;::::1;:64:::0;::::1;;;;47626:6;47610:15;:22;47568:64;47516:159;;;;-1:-1:-1::0;;;47516:159:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31658:19;47692:15;:38;;47684:104;;;;-1:-1:-1::0;;;47684:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47805:68;::::0;;-1:-1:-1;;;47805:68:0;;47839:10:::1;47805:68;::::0;::::1;::::0;47859:4:::1;47805:68:::0;;;;;;;;;;;;-1:-1:-1;;;;;47805:33:0;::::1;::::0;::::1;::::0;:68;;;;;::::1;::::0;;;;;;;;-1:-1:-1;47805:33:0;:68;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;47805:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47805:68:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;47805:68:0;47797:77:::1;;12:1:-1;9::::0;2:12:::1;47797:77:0;46116:1766;;47888:43;;:::i;:::-;47934:246;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;47934:246:0;::::1;;::::0;::::1;::::0;48050:16;;48064:1:::1;48050:16:::0;;;;;::::1;::::0;;47934:246;;;;;48050:16:::1;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1:::0;;;47934:246:0;;48087:16:::1;::::0;;48101:1:::1;48087:16:::0;;;;;::::1;::::0;;;47934:246:::1;::::0;;::::1;::::0;48087:16;;48101:1;48087:16;;::::1;::::0;47934:246;109:14:-1::1;48087:16:0::0;88:42:-1::1;-1:-1:::0;;;47934:246:0;;48125:16:::1;::::0;;48139:1:::1;48125:16:::0;;;;;::::1;::::0;;;47934:246:::1;::::0;;::::1;::::0;48125:16;;48139:1;48125:16;;::::1;::::0;47934:246;109:14:-1::1;48125:16:0::0;88:42:-1::1;144:17;::::0;-1:-1;48125:16:0::1;47934:246;;;;48162:10;47934:246;;;;::::0;47888:292:::1;;48213:15;48187:14;:22;;;48210:1;48187:25;;;;;;;;;;;;;:41;;;::::0;::::1;48264:9;48235:14;:25;;;48261:1;48235:28;;;;;;;;;;;;;:38;-1:-1:-1::0;;;;;48235:38:0::1;;;-1:-1:-1::0;;;;;48235:38:0::1;;;::::0;::::1;48310:10;48280:14;:26;;;48307:1;48280:29;;;;;;;;-1:-1:-1::0;;;;;48280:40:0;;::::1;:29;::::0;;::::1;::::0;;;;;;;:40;28343:42:::1;48327:53;27261:4;48405:43;48433:14:::0;48405:27:::1;:43::i;:::-;48450:34;:16:::0;32250:4:::1;48450:34;:20;:34;:::i;:::-;48327:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;48327:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;48327:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;48497:70:0::1;::::0;;-1:-1:-1;;;;;48497:70:0;::::1;::::0;;48530:10:::1;48497:70;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;-1:-1:-1;48497:70:0;;;;;;;-1:-1:-1;48497:70:0::1;-1:-1:-1::0;48581:4:0::1;::::0;45673:2918;-1:-1:-1;;;;;;;;45673:2918:0:o;50473:773::-;29033:10;28152:42;29033:26;29025:85;;;;-1:-1:-1;;;29025:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50593:2:::1;50577:18:::0;::::1;50569:58;;;::::0;;-1:-1:-1;;;50569:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50634:22;50659:3;;50634:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;50669:31:0::1;::::0;;::::1;137:4:-1;50669:31:0::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;50634:28;;-1:-1:-1;50669:23:0::1;::::0;:31;-1:-1:-1;50695:5:0;;-1:-1:-1;50695:5:0;;;;50669:31;::::1;50695:5:::0;;;;50669:31;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;;50784:2:0::1;50770:17:::0;::::1;50764:24:::0;50669:31;;-1:-1:-1;;;;50805:89:0;::::1;50801:405;;;51002:2;50986:19:::0;::::1;50980:26:::0;51046:4:::1;51031:19:::0;::::1;::::0;::::1;::::0;:52:::1;;-1:-1:-1::0;32250:4:0::1;51054:11:::0;:26:::1;:29:::0;51031:52:::1;51023:90;;;::::0;;-1:-1:-1;;;51023:90:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51122:8;:22:::0;50801:405:::1;;;51167:31;::::0;;-1:-1:-1;;;51167:31:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51167:31:0;;;;;;;;;;;;;::::1;;51217:23;51229:3;;51234:5;;51217:23;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;137:4:::1;117:14;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;51217:23:0::0;;::::1;::::0;;;;;::::1;;::::0;-1:-1:-1;51217:23:0;;;;;1:33:-1::1;99:1;81:16:::0;;::::1;74:27:::0;51217:23:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;51217:23:0::0;;::::1;::::0;-1:-1:-1;51217:23:0;;-1:-1:-1;;;;;;;51217:23:0::1;29117:1;;;50473:773:::0;;;;:::o;51869:206::-;29795:10;28244:42;29795:32;29787:80;;;;-1:-1:-1;;;29787:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51981:36:::1;::::0;;;:24:::1;:36;::::0;;;;;;;51974:43;;-1:-1:-1;;;;;;51974:43:0::1;::::0;;-1:-1:-1;;;;;52031:38:0;;;::::1;::::0;;:24:::1;:38:::0;;;;52024:45;51869:206::o;31848:118::-;-1:-1:-1;;;31848:118:0;:::o;31980:55::-;32030:5;31980:55;:::o;32291:56::-;;;;;;;;;;;;;:::o;51411:157::-;-1:-1:-1;;;;;51524:38:0;51501:7;51524:38;;;:24;:38;;;;;;;51411:157::o;27656:87::-;27701:42;27656:87;:::o;34610:299::-;28666:11;;;;28658:49;;;;;-1:-1:-1;;;28658:49:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28658:49:0;;;;;;;;;;;;;;;29337:10:::1;28343:42;29337:39;29329:99;;;;-1:-1:-1::0;;;29329:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34743:35:::2;::::0;::::2;27261:4;34743:35;34739:165;;;34789:41;34821:8;;34789:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;34789:31:0::2;::::0;-1:-1:-1;;;34789:41:0:i:2;27748:86::-:0;27792:42;27748:86;:::o;33098:175::-;28570:11;;;;28569:12;28561:50;;;;;-1:-1:-1;;;28561:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32149:4:::1;33142:8;:33:::0;;;33182:35:::1;::::0;;;:21:::1;:35;::::0;33220:2:::1;33182:35:::0;:40;33251:16;;-1:-1:-1;;33251:16:0::1;::::0;;::::1;::::0;;33098:175::o;31474:69::-;31542:1;31474:69;:::o;31548:55::-;31602:1;31548:55;:::o;27466:92::-;27516:42;27466:92;:::o;32040:54::-;32089:5;32040:54;:::o;53639:679::-;-1:-1:-1;;;;;53760:38:0;;53732:25;53760:38;;;:24;:38;;;;;;;;;;53836:13;;;;;;;;;;;53710;;53760:38;;53710:13;;53836;;;;21:6:-1;;108:14;53836:13:0;87:42:-1;-1:-1;;;53901:2:0;53881:23;;53874:50;;;53881:23;-1:-1:-1;53937:22:0;;53970:147;53992:2;53988:1;:6;;;53970:147;;;54014:15;54030:1;54014:18;;;;;;;;;;;;;;-1:-1:-1;;;;;;54014:18:0;:23;54010:100;;54050:18;;;;;54010:100;;;54095:5;;54010:100;53996:3;;53970:147;;;;54123:23;54159:16;54149:27;;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;54149:27:0;87:42:-1;143:17;;-1:-1;54149:27:0;-1:-1:-1;54123:53:0;-1:-1:-1;54188:7:0;54183:98;54205:16;54201:20;;:1;:20;;;54183:98;;;54255:15;54271:1;54255:18;;;;;;;;;;;;;;;;;;54239:10;54250:1;54239:13;;;;;;;;;;;;;:34;-1:-1:-1;;;;;54239:34:0;;;;;;;;-1:-1:-1;54223:3:0;;54183:98;;;-1:-1:-1;54301:10:0;53639:679;-1:-1:-1;;;;;53639:679:0:o;27839:83::-;27880:42;27839:83;:::o;36353:845::-;36429:12;36451:41;;:::i;:::-;36494:12;36510:36;36537:8;36510:26;:36::i;:::-;36450:96;;;;36561:7;36553:51;;;;;-1:-1:-1;;;36553:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36611:14;36628:27;36641:13;36628:12;:27::i;:::-;36611:44;-1:-1:-1;36666:30:0;;;;36662:531;;36748:20;;;;;36792:26;;;;;-1:-1:-1;;;;;36770:49:0;36707:18;36770:49;;;:21;:49;;;;;;;36728:92;;36748:20;36728:19;:92::i;:::-;36707:113;;36829:44;;:::i;:::-;36876:207;;;;;;;;36930:13;:29;;;36876:207;;;;36986:10;36876:207;;;;37021:13;:24;;;-1:-1:-1;;;;;36876:207:0;;;;;37066:7;36876:207;;;;;36829:254;;37099:44;37129:13;37099:29;:44::i;:::-;37092:51;;;;;;;;;36662:531;-1:-1:-1;;37173:12:0;;;37183:1;37173:12;;;;;;;;;-1:-1:-1;37166:19:0;;-1:-1:-1;37166:19:0;6238:181;6296:7;6328:5;;;6352:6;;;;6344:46;;;;;-1:-1:-1;;;6344:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8507:132;8565:7;8592:39;8596:1;8599;8592:39;;;;;;;;;;;;;;;;;:3;:39::i;7568:471::-;7626:7;7871:6;7867:47;;-1:-1:-1;7901:1:0;7894:8;;7867:47;7938:5;;;7942:1;7938;:5;:1;7962:5;;;;;:10;7954:56;;;;-1:-1:-1;;;7954:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6694:136;6752:7;6779:43;6783:1;6786;6779:43;;;;;;;;;;;;;;;;;:3;:43::i;44381:1286::-;44533:14;;;44545:1;44533:14;;;;;;;;;44486:12;;;;44533:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;44578:30:0;;44507:40;;-1:-1:-1;44570:52:0;;:50;:52::i;:::-;44556:8;44565:1;44556:11;;;;;;;;;;;;;:66;;;;44643:43;:14;:27;;;-1:-1:-1;;;;;44643:41:0;;:43::i;:::-;44629:8;44638:1;44629:11;;;;;;;;;;;;;:57;;;;44695:19;44717:14;:22;;;:29;44695:51;;44755:30;44800:11;44788:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44755:57:0;-1:-1:-1;44824:13:0;44819:137;44850:11;44843:5;:18;44819:137;;;44906:42;:14;:22;;;44929:5;44906:29;;;;;;;;;;;;;;:40;:42::i;:::-;44881:15;44897:5;44881:22;;;;;;;;;;;;;;;;;:67;44863:7;;44819:137;;;;44976:28;:15;:26;:28::i;:::-;44962:8;44971:1;44962:11;;;;;;;;;;;;;:42;;;;45013:33;45061:11;45049:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45013:60:0;-1:-1:-1;45085:13:0;45080:147;45111:11;45104:5;:18;45080:147;;;45171:48;:14;:25;;;45197:5;45171:32;;;;;;;;;;;;;;-1:-1:-1;;;;;45171:46:0;;:48::i;:::-;45143:18;45162:5;45143:25;;;;;;;;;;;;;;;;;:76;45124:7;;45080:147;;;;45247:31;:18;:29;:31::i;:::-;45233:8;45242:1;45233:11;;;;;;;;;;;;;:45;;;;45287:34;45336:11;45324:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45287:61:0;-1:-1:-1;45360:13:0;45355:149;45386:11;45379:5;:18;45355:149;;;45447:49;:14;:26;;;45474:5;45447:33;;;;;;;:49;45418:19;45438:5;45418:26;;;;;;;;;;;;;;;;;:78;45399:7;;45355:149;;;;45524:32;:19;:30;:32::i;:::-;45510:8;45519:1;45510:11;;;;;;;;;;;;;:46;;;;45579:47;45587:14;:25;;;45579:34;;:45;:47::i;:::-;45565:8;45574:1;45565:11;;;;;;;;;;;;;:61;;;;45640:21;:8;:19;:21::i;:::-;45633:28;44381:1286;-1:-1:-1;;;;;;;44381:1286:0:o;40190:287::-;40267:43;;:::i;:::-;40312:18;40334:37;40362:8;40334:27;:37::i;:::-;40266:105;;;;40386:13;40378:62;;;;-1:-1:-1;;;40378:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40447:24;40456:14;40447:8;:24::i;9929:130::-;9987:7;10014:37;10018:1;10021;10014:37;;;;;;;;;;;;;;;;;:3;:37::i;52744:313::-;52840:7;31842:1;52860:40;;52856:126;;;52918:56;:6;-1:-1:-1;;52934:38:0;;52929:2;:44;52918:56;:10;:56;:::i;:::-;52911:63;;;;52856:126;52995:56;:6;31842:1;53011:38;;;53006:2;:44;52995:56;:10;:56;:::i;52081:657::-;52185:13;;;52195:2;52185:13;;;;;;;;;52144:4;;52158:24;;52185:13;;;;21:6:-1;;108:14;52185:13:0;87:42:-1;-1:-1;;;52249:2:0;52232:20;;52225:36;;;52232:20;-1:-1:-1;52276:18:0;;52306:145;52328:2;52324:1;:6;;;52306:145;;;52351:11;52363:1;52351:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;52351:14:0;:19;52347:96;;52384:14;;;;;52347:96;;;52427:5;;52347:96;52332:3;;52306:145;;;-1:-1:-1;52477:28:0;52462:43;;;;52458:80;;;52524:5;52517:12;;;;;;52458:80;52549:11;52574:1;52561:12;:14;52549:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52549:27:0;-1:-1:-1;;;52549:35:0;52545:79;;52610:5;52603:12;;;;;;52545:79;52635:11;52660:1;52647:12;:14;52635:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52635:27:0;-1:-1:-1;;;52635:34:0;52631:83;;52700:5;52693:12;;;;;;52631:83;-1:-1:-1;52728:4:0;;52081:657;-1:-1:-1;;;52081:657:0:o;43524:851::-;43605:43;;:::i;:::-;43650:18;43672:37;43700:8;43672:27;:37::i;:::-;43604:105;;;;43724:13;43716:62;;;;-1:-1:-1;;;43716:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43785:43;;:::i;:::-;43865:27;;;;;;-1:-1:-1;;;;;43835:57:0;;;;;43930:22;;;;;43899:28;;;:53;44010:27;;43988:50;43835:27;43988:50;;;:21;:50;;;;;;;44045:174;44065:14;:22;;;:29;44061:3;:33;44045:174;;;44141:70;44163:14;:22;;;44186:3;44163:27;;;;;;;;;;;;;;44192:18;44141:21;:70::i;:::-;44111:14;:22;;;44134:3;44111:27;;;;;;;;;;;;;;;;;:100;44095:5;;44045:174;;;-1:-1:-1;44254:26:0;;;;44225;;;:55;31602:1;44287:21;;;:51;44345:24;44225:14;44345:8;:24::i;:::-;43524:851;;;;;:::o;34915:960::-;34997:27;;:::i;:::-;35026:4;35039:41;;:::i;:::-;35089:30;;:::i;:::-;35122:31;:20;:8;:18;:20::i;:::-;:29;:31::i;:::-;35089:64;-1:-1:-1;35160:12:0;;35207:625;35214:14;:4;:12;:14::i;:::-;35207:625;;;35243:8;35239:571;;35299:20;:11;:4;:9;:11::i;:::-;:18;:20::i;:::-;35253:67;;35239:571;;;35338:3;35345:1;35338:8;35334:476;;;35381:23;:11;:4;:9;:11::i;:::-;:21;:23::i;:::-;-1:-1:-1;;;;;35348:56:0;:26;;;:56;35334:476;;;35422:3;35429:1;35422:8;35418:392;;;35465:20;:11;:4;:9;:11::i;:20::-;35432;;;:53;35418:392;;;35503:3;35510:1;35503:8;35499:311;;;35548:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;35513:60:0;:23;;;:60;35499:311;;;35591:3;35598:1;35591:8;35587:223;;;35634:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;35601:56:0;:24;;;:56;35587:223;;;35675:3;35682:1;35675:8;35671:139;;;35736:20;:11;:4;:9;:11::i;:20::-;35696:61;;:24;;;:61;35778:4;;-1:-1:-1;35671:139:0;;;35805:5;;35671:139;35819:5;;35207:625;;;-1:-1:-1;35846:13:0;;-1:-1:-1;35861:7:0;;-1:-1:-1;;34915:960:0;;;:::o;37204:1655::-;37306:26;;;;37287:6;;-1:-1:-1;;;;;37306:40:0;37302:1552;;37379:13;:24;;;37361:42;;:15;:42;37357:103;;;-1:-1:-1;31329:1:0;37416:34;;37357:103;37496:13;:20;;;37472:21;:44;37468:118;;;-1:-1:-1;31468:1:0;37529:47;;37468:118;37613:23;;;;37680:20;;;;;37613:92;;37595:12;;-1:-1:-1;;;;;37613:28:0;;32089:5;;37595:12;37613:92;37595:12;37613:92;37680:20;37613:28;32089:5;37613:92;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;37594:111:0;;;37719:7;37714:83;;-1:-1:-1;31542:1:0;;-1:-1:-1;37739:48:0;;37714:83;37810:92;37828:13;:26;;;37856:13;:23;;;37881:13;:20;;;37810:92;;;;-1:-1:-1;;;;;37810:92:0;-1:-1:-1;;;;;37810:92:0;;;;;;-1:-1:-1;;;;;37810:92:0;-1:-1:-1;;;;;37810:92:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31269:1:0;;-1:-1:-1;37911:26:0;;37302:1552;37982:13;:24;;;37964:42;;:15;:42;37960:103;;;-1:-1:-1;31329:1:0;38019:34;;37960:103;38130:29;;38100:26;;;;;-1:-1:-1;;;;;38075:52:0;38130:29;38075:52;;;:24;:52;;;;;;;:84;38071:151;;-1:-1:-1;31395:1:0;38172:40;;38071:151;38261:26;;;;;38254:91;;;-1:-1:-1;;;38254:91:0;;38339:4;38254:91;;;;;;38230:21;;-1:-1:-1;;;;;38254:44:0;;;;;;32030:5;;38254:91;;;;;38261:26;38254:91;;;;;:44;:91;;;2:2:-1;;;;27:1;24;17:12;2:2;38254:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38254:91:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38254:91:0;38374:20;;;;38254:91;;-1:-1:-1;38358:36:0;;38354:110;;;-1:-1:-1;31468:1:0;;-1:-1:-1;38407:47:0;;38354:110;38472:12;38494:13;:26;;;-1:-1:-1;;;;;38487:43:0;;32030:5;38563:13;:23;;;38588:13;:20;;;38487:122;;;;;;;;;;;;;-1:-1:-1;;;;;38487:122:0;-1:-1:-1;;;;;38487:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38487:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38487:122:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38487:122:0;;-1:-1:-1;38618:229:0;;;;38647:92;38665:13;:26;;;38693:13;:23;;;38718:13;:20;;;38647:92;;;;-1:-1:-1;;;;;38647:92:0;-1:-1:-1;;;;;38647:92:0;;;;;;-1:-1:-1;;;;;38647:92:0;-1:-1:-1;;;;;38647:92:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31269:1:0;;-1:-1:-1;38750:26:0;;-1:-1:-1;38750:26:0;38618:229;-1:-1:-1;31602:1:0;;-1:-1:-1;38803:34:0;;-1:-1:-1;38803:34:0;35881:466;36036:14;;;36048:1;36036:14;;;;;;;;;35989:12;;;;36036:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;36079:29:0;;36010:40;;-1:-1:-1;36071:51:0;;:49;:51::i;:::-;36057:8;36066:1;36057:11;;;;;;;;;;;;;:65;;;;36143:39;:13;:26;;;:37;:39::i;:::-;36129:8;36138:1;36129:11;;;;;;;;;;;;;:53;;;;36203:40;:13;:24;;;-1:-1:-1;;;;;36203:38:0;;:40::i;:::-;36189:8;36198:1;36189:11;;;;;;;;;;;;;:54;;;;36264:42;36272:13;:20;;;36264:29;;:40;:42::i;:::-;36250:8;36259:1;36250:11;;;;;;;;;;;;;:56;;;;36320:21;:8;:19;:21::i;9127:345::-;9213:7;9315:12;9308:5;9300:28;;;;-1:-1:-1;;;9300:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9300:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9339:9;9355:1;9351;:5;;;;;;;9127:345;-1:-1:-1;;;;;9127:345:0:o;7125:192::-;7211:7;7247:12;7239:6;;;;7231:29;;;;-1:-1:-1;;;7231:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7231:29:0;-1:-1:-1;;;7283:5:0;;;7125:192::o;11938:121::-;11992:12;12024:27;12036:14;12045:4;12036:8;:14::i;:::-;12024:11;:27::i;11448:351::-;11597:4;11591:11;;-1:-1:-1;;;11635:55:0;;11630:2;11623:10;;11616:75;11725:2;11718:10;;11705:24;;;11508:12;;11777:14;11591:11;11777;:14::i;12865:399::-;12929:12;12958:4;:11;12973:1;12958:16;12954:68;;;-1:-1:-1;12998:12:0;;;13008:1;12998:12;;;;;;;;12991:19;;12954:68;13032:20;13055:4;13060:1;13055:7;;;;;;;;;;;;;;13032:30;;13078:6;13087:1;13078:10;;13073:104;13094:4;:11;13090:1;:15;13073:104;;;13137:28;13148:7;13157:4;13162:1;13157:7;;;;;;;;;;;;;;13137:10;:28::i;:::-;13127:38;-1:-1:-1;13107:3:0;;13073:104;;;;13194:62;13205:41;13218:7;:14;10873:4;13205:41;;:12;:41::i;:::-;13248:7;13194:10;:62::i;38865:1319::-;38947:28;;:::i;:::-;38977:4;38990:43;;:::i;:::-;39042:30;;:::i;:::-;39075:31;:20;:8;:18;:20::i;:31::-;39042:64;-1:-1:-1;39113:12:0;;39160:980;39167:14;:4;:12;:14::i;:::-;39160:980;;;39198:8;39194:923;;39251:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;39221:53:0;;;39194:923;;;39305:3;39312:1;39305:8;39301:816;;;39328:31;39362:20;:11;:4;:9;:11::i;:::-;:18;:20::i;:::-;39328:54;;39440:4;:11;39426:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;39426:26:0;-1:-1:-1;39395:28:0;;;:57;39470:13;39465:137;39493:4;:11;39487:5;:17;39465:137;;;39568:20;:4;39573:5;39568:11;;;;;;;;;;;;;;:18;:20::i;:::-;39530:14;:28;;;39559:5;39530:35;;;;;;;;;;;;;;;;;:58;39506:7;;39465:137;;;;39301:816;;;;39632:3;39639:1;39632:8;39628:489;;;39655:31;39689:20;:11;:4;:9;:11::i;:20::-;39655:54;;39765:4;:11;39751:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;39751:26:0;-1:-1:-1;39722:26:0;;;:55;39795:13;39790:138;39818:4;:11;39812:5;:17;39790:138;;;39891:23;:4;39896:5;39891:11;;;;;;;;;;;;;;:21;:23::i;:::-;39855:14;:26;;;39882:5;39855:33;;;;;;;;-1:-1:-1;;;;;39855:59:0;;;:33;;;;;;;;;;;:59;39831:7;;39790:138;;39628:489;39958:3;39965:1;39958:8;39954:163;;;40012:20;:11;:4;:9;:11::i;:20::-;39981:52;;:21;;;:52;40056:4;;-1:-1:-1;39954:163:0;40127:5;;39160:980;;40483:1389;40566:27;;-1:-1:-1;;;;;40566:41:0;40562:1305;;40623:13;40618:597;40648:14;:28;;;:35;40642:5;:41;40618:597;;;40706:12;40724:14;:26;;;40751:5;40724:33;;;;;;;;;;;;;;-1:-1:-1;;;;;40724:38:0;32089:5;40801:14;:28;;;40830:5;40801:35;;;;;;;;;;;;;;;;;;40724:117;;;;;;40801:35;40724:117;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;40705:136:0;;;40857:7;40852:354;;40884:137;40898:14;:27;;;40927:14;:26;;;40954:5;40927:33;;;;;;;;;;;;;;40962:14;:28;;;40991:5;40962:35;;;;;;;;;;;;;;40999:14;:21;;;40884:137;;;;-1:-1:-1;;;;;40884:137:0;-1:-1:-1;;;;;40884:137:0;;;;;;-1:-1:-1;;;;;40884:137:0;-1:-1:-1;;;;;40884:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40852:354;;;41057:137;41071:14;:27;;;41100:14;:26;;;41127:5;41100:33;;;;;;;;;;;;;;41135:14;:28;;;41164:5;41135:35;;;;;;;;;;;;;;41172:14;:21;;;41057:137;;;;-1:-1:-1;;;;;41057:137:0;-1:-1:-1;;;;;41057:137:0;;;;;;-1:-1:-1;;;;;41057:137:0;-1:-1:-1;;;;;41057:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40852:354;-1:-1:-1;40685:7:0;;40618:597;;;;40562:1305;;;41242:13;41237:623;41267:14;:28;;;:35;41261:5;:41;41237:623;;;41324:12;41346:14;:27;;;-1:-1:-1;;;;;41339:44:0;;32030:5;41416:14;:26;;;41443:5;41416:33;;;;;;;;;;;;;;41451:14;:28;;;41480:5;41451:35;;;;;;;;;;;;;;41339:148;;;;;;;;;;;;;-1:-1:-1;;;;;41339:148:0;-1:-1:-1;;;;;41339:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41339:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41339:148:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41339:148:0;;-1:-1:-1;41498:353:0;;;;41529:137;41543:14;:27;;;41572:14;:26;;;41599:5;41572:33;;;;;;;;;;;;;;41607:14;:28;;;41636:5;41607:35;;;;;;;;;;;;;;41644:14;:21;;;41529:137;;;;-1:-1:-1;;;;;41529:137:0;-1:-1:-1;;;;;41529:137:0;;;;;;-1:-1:-1;;;;;41529:137:0;-1:-1:-1;;;;;41529:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41498:353;;;41702:137;41716:14;:27;;;41745:14;:26;;;41772:5;41745:33;;;;;;;;;;;;;;41780:14;:28;;;41809:5;41780:35;;;;;;;;;;;;;;41817:14;:21;;;41702:137;;;;-1:-1:-1;;;;;41702:137:0;-1:-1:-1;;;;;41702:137:0;;;;;;-1:-1:-1;;;;;41702:137:0;-1:-1:-1;;;;;41702:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41498:353;-1:-1:-1;41304:7:0;;41237:623;;;;40562:1305;40483:1389;:::o;10536:166::-;10622:7;10658:12;10650:6;10642:29;;;;-1:-1:-1;;;10642:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;10642:29:0;;10693:1;10689;:5;;;;;;;10536:166;-1:-1:-1;;;;10536:166:0:o;41878:1640::-;41961:28;;:::i;:::-;41991:4;42004:43;;:::i;:::-;42056:30;;:::i;:::-;42089:31;:20;:8;:18;:20::i;:31::-;42056:64;-1:-1:-1;42127:12:0;;42174:1300;42181:14;:4;:12;:14::i;:::-;42174:1300;;;42210:8;42206:1247;;42272:20;:11;:4;:9;:11::i;:20::-;42231:62;;42206:1247;;;42313:3;42320:1;42313:8;42309:1144;;;42364:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;42334:53:0;:27;;;:53;42309:1144;;;42407:3;42414:1;42407:8;42403:1050;;;42428:31;42462:20;:11;:4;:9;:11::i;:20::-;42428:54;;42532:4;:11;42518:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;42518:26:0;-1:-1:-1;42493:22:0;;;:51;42560:13;42555:127;42583:4;:11;42577:5;:17;42555:127;;;42650:20;:4;42655:5;42650:11;;;;;;;:20;42618:14;:22;;;42641:5;42618:29;;;;;;;;;;;;;;;;;:52;42596:7;;42555:127;;;;42403:1050;;;;42701:3;42708:1;42701:8;42697:756;;;42722:31;42756:20;:11;:4;:9;:11::i;:20::-;42722:54;;42829:4;:11;42815:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;42815:26:0;-1:-1:-1;42787:25:0;;;:54;42857:13;42852:133;42880:4;:11;42874:5;:17;42852:133;;;42950:23;:4;42955:5;42950:11;;;;;;;:23;42915:14;:25;;;42941:5;42915:32;;;;;;;;-1:-1:-1;;;;;42915:58:0;;;:32;;;;;;;;;;;:58;42893:7;;42852:133;;42697:756;43004:3;43011:1;43004:8;43000:453;;;43025:31;43059:20;:11;:4;:9;:11::i;:20::-;43025:54;;43133:4;:11;43119:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;43119:26:0;-1:-1:-1;43090:26:0;;;:55;43161:13;43156:134;43184:4;:11;43178:5;:17;43156:134;;;43255:23;:4;43260:5;43255:11;;;;;;;:23;43219:14;:26;;;43246:5;43219:33;;;;;;;;-1:-1:-1;;;;;43219:59:0;;;:33;;;;;;;;;;;:59;43197:7;;43156:134;;43000:453;43309:3;43316:1;43309:8;43305:148;;;43365:20;:11;:4;:9;:11::i;:20::-;43330:56;;:25;;;:56;43407:4;;-1:-1:-1;43305:148:0;43461:5;;42174:1300;;53063:315;53161:7;31842:1;53181:40;;53177:126;;;53239:56;:6;-1:-1:-1;;53255:38:0;;53250:2;:44;53239:56;:10;:56;:::i;53177:126::-;53316:56;:6;31842:1;53332:38;;;53327:2;:44;53316:56;:10;:56;:::i;19132:225::-;19193:14;;:::i;:::-;-1:-1:-1;19321:28:0;;;;;;;;;19329:11;;19321:28;;19286:4;19276:15;;;19321:28;;;;19132:225;;;:::o;19365:221::-;19427:15;;:::i;:::-;19463:12;19470:4;19463:6;:12::i;:::-;19455:21;;12:1:-1;9;2:12;19455:21:0;19489:8;19514:27;19529:4;:11;;;19514:14;:27::i;:::-;19500:11;;;;;19559:19;;;;;;;;;;;;19500:41;;19559:19;;;;;-1:-1:-1;;19365:221:0;;;:::o;18951:173::-;19013:4;19030:19;;:::i;:::-;-1:-1:-1;;19052:9:0;;19108:8;;19094:11;;;;;19079:12;;;;;19094:22;;-1:-1:-1;;18951:173:0:o;18660:283::-;18719:14;;:::i;:::-;18754:13;18762:4;18754:7;:13::i;:::-;18746:22;;12:1:-1;9;2:12;18746:22:0;18792:12;;;;18781:8;18833:16;18792:12;18833:11;:16::i;:::-;18875;;;18860:12;;;;:31;18911:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;18911:24:0;;18660:283;-1:-1:-1;18660:283:0:o;21580:613::-;21665:8;;21640:4;;21665:12;;;;:30;;-1:-1:-1;21681:8:0;;21693:2;-1:-1:-1;21681:14:0;21665:30;21657:39;;12:1:-1;9;2:12;21657:39:0;21709:11;21723:27;21738:4;:11;;;21723:14;:27::i;:::-;21709:41;;21781:6;21769:4;:8;;;:18;;21761:57;;;;;-1:-1:-1;;;21761:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21840:8;;21906:11;;;;;:20;;21971:13;;21840:17;;;;;21971:13;22058:11;;22055:2;;;22128:3;22124:2;22120:12;22115:3;22111:22;22103:6;22099:35;22089:45;;22055:2;-1:-1:-1;22179:6:0;21580:613;-1:-1:-1;;;;21580:613:0:o;21376:196::-;21508:8;;21439:7;;21520:2;21508:14;21500:23;;12:1:-1;9;2:12;21500:23:0;21551:12;21558:4;21551:6;:12::i;17314:788::-;17405:13;;;17415:2;17405:13;;;;;;;;;17363:12;;;;17405:13;;;;21:6:-1;;108:14;17405:13:0;87:42:-1;-1:-1;;;17467:2:0;17460:10;;17453:21;;;17388:30;-1:-1:-1;17495:6:0;-1:-1:-1;;17516:70:0;;17512:272;;-1:-1:-1;17612:2:0;17512:272;;;-1:-1:-1;;17636:70:0;;17632:152;;-1:-1:-1;17732:2:0;17632:152;;;-1:-1:-1;17771:1:0;17632:152;17805:2;17801:1;:6;17794:101;;;17833:1;17835;17833:4;;;;;;;;;;;;-1:-1:-1;;;;;;17833:4:0;:9;17829:55;;17863:5;;17829:55;17809:3;;17794:101;;;17905:11;17924:1;17919:2;:6;17905:20;;17936:15;17964:6;17954:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;17954:17:0;87:42:-1;143:17;;-1:-1;17954:17:0;-1:-1:-1;18013:15:0;;;18006:26;;;;-1:-1:-1;18046:18:0;;-1:-1:-1;18013:15:0;;17314:788;-1:-1:-1;;17314:788:0:o;11050:250::-;11113:12;11142:4;:11;11157:1;11142:16;:35;;;;;11173:4;11162:15;;:4;11167:1;11162:7;;;;;;;;;;;;-1:-1:-1;;;;;;11162:7:0;:15;;11142:35;11138:79;;;-1:-1:-1;11201:4:0;11194:11;;11138:79;11234:58;11245:40;11258:4;:11;10833:4;11245:40;;:12;:40::i;:::-;11287:4;13465:2915;13597:12;13627:22;13829:4;13823:11;13810:24;;13982:9;13976:16;14024:6;14013:9;14006:25;14259:4;14248:9;14244:20;14403:6;14399:2;14395:15;14594:4;14583:9;14579:20;14426:517;14622:3;14618:2;14615:11;14426:517;;;14918:9;;14907:21;;14727:4;14719:13;;;;14756;14426:517;;;-1:-1:-1;15147:17:0;;15208:16;;15196:29;;15178:48;;15147:17;-1:-1:-1;15366:3:0;-1:-1:-1;15498:15:0;;;15578:4;15562:21;;15529:228;15606:3;15602:2;15599:11;15529:228;;;15732:9;;15721:21;;15644:4;15636:13;;;;15673;15529:228;;;-1:-1:-1;16232:16:0;;16220:29;;;;16213:37;16204:47;;;;16275:2;16200:56;-1:-1:-1;;16182:150:0;16176:4;16169:164;-1:-1:-1;16363:9:0;-1:-1:-1;13465:2915:0;;;;:::o;16697:438::-;16768:12;16810:6;16801;:15;16793:42;;;;;-1:-1:-1;;;16793:42:0;;;;;;;;;;;;-1:-1:-1;;;16793:42:0;;;;;;;;;;;;;;;16864:12;;;16874:1;16864:12;;;;;;;;;16846:15;;16864:12;;;21:6:-1;;108:14;16864:12:0;87:42:-1;143:17;;-1:-1;16864:12:0;16846:30;;16901:2;16891:6;:12;16887:105;;16948:6;16939;:15;16928:28;;16920:2;16923:1;16920:5;;;;;;;;;;;:36;-1:-1:-1;;;;;16920:36:0;;;;;;;;-1:-1:-1;16978:2:0;-1:-1:-1;16971:9:0;;16887:105;17002:15;17020:16;17029:6;17020:8;:16::i;:::-;17002:34;;17078:6;17066:2;:9;:18;17087:2;17066:23;17055:36;;17047:2;17050:1;17047:5;;;;;;;;;;;:44;-1:-1:-1;;;;;17047:44:0;;;;;;;;;17109:18;17120:2;17124;17109:10;:18::i;:::-;17102:25;16697:438;-1:-1:-1;;;;;16697:438:0:o;19844:522::-;19904:16;19941:12;19948:4;19941:6;:12::i;:::-;19933:21;;12:1:-1;9;2:12;19933:21:0;19967:10;19980:14;19989:4;19980:8;:14::i;:::-;19967:27;;20005:23;20045:5;20031:20;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20005:46;;20064:11;20092:27;20107:4;:11;;;20092:14;:27::i;:::-;20078:11;;;;:41;;-1:-1:-1;20130:12:0;;20153:180;20174:5;20170:1;:9;20153:180;;;20211:19;20223:6;20211:11;:19::i;:::-;20201:29;;20257:24;;;;;;;;20265:7;20257:24;;;;20274:6;20257:24;;;20245:6;20252:1;20245:9;;;;;;;;;;;;;;;;;:36;20305:16;;;;20181:3;;20153:180;;;-1:-1:-1;20352:6:0;;19844:522;-1:-1:-1;;;;;19844:522:0:o;20374:342::-;20455:8;;20434:4;;20451:31;;-1:-1:-1;20477:5:0;20470:12;;20451:31;20531:11;;;;20594:13;;20495:11;20586:22;;18330:4;20635:24;;20631:55;;;20681:5;20674:12;;;;;;24955:551;25093:13;;25014:4;;25085:22;;18236:4;25134:26;;25130:368;;;25182:1;25175:8;;;;;25130:368;18283:4;25203:25;;;:83;;-1:-1:-1;18330:4:0;25233:25;;;;;:52;;-1:-1:-1;18377:4:0;25262:23;;25233:52;25199:299;;;25308:1;25301:8;;;;;25199:299;18330:4;25329:24;;25325:173;;;-1:-1:-1;;25394:35:0;;-1:-1:-1;25387:42:0;;25325:173;-1:-1:-1;;25465:33:0;;-1:-1:-1;25458:40:0;;23426:1474;23584:13;;23482:4;;;;23576:22;;18236:4;23625:26;;23621:1245;;;23676:1;23666:11;;23621:1245;;;18283:4;23699:25;;23695:1171;;;-1:-1:-1;;23749:30:0;;;-1:-1:-1;23695:1171:0;;;18330:4;23801:24;;23797:1069;;;23842:12;23923:4;23916:5;23912:16;24003:1;23995:6;23991:14;23981:24;;24141:7;24137:2;24133:16;24128:3;24124:26;24115:6;24109:13;24105:46;24094:57;;24239:1;24230:7;24226:15;24217:7;24213:29;24202:40;;;24290:7;24279;:18;;24271:48;;;;;-1:-1:-1;;;24271:48:0;;;;;;;;;;;;-1:-1:-1;;;24271:48:0;;;;;;;;;;;;;;;23797:1069;;;;18377:4;24352:23;;24348:518;;;-1:-1:-1;;24402:28:0;;;-1:-1:-1;24348:518:0;;;24474:12;24555:4;24548:5;24544:16;24600:1;24592:6;24588:14;24578:24;;24669:7;24665:2;24661:16;24656:3;24652:26;24643:6;24637:13;24633:46;24622:57;;24774:1;24765:7;24761:15;24752:7;24748:29;24737:40;;;24825:7;24814;:18;;24806:48;;;;;-1:-1:-1;;;24806:48:0;;;;;;;;;;;;-1:-1:-1;;;24806:48:0;;;;;;;;;;;;;;;24348:518;;-1:-1:-1;24885:7:0;23426:1474;-1:-1:-1;;23426:1474:0:o;22994:424::-;23076:8;;23055:4;;23072:27;;-1:-1:-1;23098:1:0;23091:8;;23072:27;23112:10;23125:1;23112:14;;23137:12;23166:27;23181:4;:11;;;23166:14;:27::i;:::-;23152:11;;;;23232:8;;23152:41;;;;-1:-1:-1;23218:22:0;23251:135;23268:6;23258:7;:16;23251:135;;;23311:20;23323:7;23311:11;:20::i;:::-;23367:7;;;;;23301:30;;;;23251:135;;;-1:-1:-1;23405:5:0;;22994:424;-1:-1:-1;;;22994:424:0:o;30181:24140::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;30181:24140:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://cf38311fc70c7842415f6e43694ca6a2795a904f0541302504db82e7675343ff
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value BSC BNB Chain (BNB)96.76% $695.89 26,115,738.1547 $18,173,673,406.29 BSC 0.78% $0.320011 455,061,080.8166 $145,624,513.37 BSC 0.47% $1.51 58,412,552.4921 $88,202,954.26 BSC 0.40% $3,411.92 21,772.5983 $74,286,410.42 BSC 0.38% $0.156916 460,474,747.2353 $72,255,642.33 BSC 0.32% $1 59,826,632.5959 $59,939,767.45 BSC 0.22% $1.16 34,919,333.5385 $40,561,709.62 BSC 0.12% $0.007639 2,918,987,802.5923 $22,298,994.33 BSC 0.11% $20.56 1,008,796.9367 $20,740,865.02 BSC 0.10% $0.86932 20,602,195.985 $17,909,903.49 BSC 0.09% $0.035075 471,885,546.7795 $16,551,432.19 BSC 0.06% $93,661.83 113.6142 $10,641,316.01 BSC 0.03% $0.999995 6,394,659.4838 $6,394,625.3 BSC 0.03% $0.00007 86,977,793,438.3926 $6,114,564.97 BSC 0.03% $2.07 2,585,860.1423 $5,357,624.83 BSC 0.01% $5.17 466,613.9092 $2,413,616.55 BSC 0.01% $0.999898 2,001,649.7925 $2,001,445.12 BSC 0.01% $0.997956 1,940,884.8228 $1,936,917.65 BSC <0.01% $0.383694 4,749,057.6 $1,822,184.91 BSC <0.01% $0.004571 300,000,000 $1,371,340.66 BSC <0.01% $0.236448 4,990,750.7995 $1,180,054.06 BSC <0.01% $336.2 2,889.6101 $971,482.14 BSC <0.01% $21.18 42,536.9391 $901,060.32 BSC <0.01% $0.003793 200,280,679.3153 $759,618.55 BSC <0.01% $2.93 219,768.2397 $644,097.94 BSC <0.01% $0.786263 818,354.9533 $643,441.86 BSC <0.01% $0.000592 978,205,036.197 $578,823.48 BSC <0.01% $0.000316 1,802,544,000 $569,438.43 BSC <0.01% $0.009053 57,057,782.8717 $516,515.58 BSC <0.01% $6.83 72,658.8806 $496,453.05 BSC <0.01% $114.35 4,215.425 $482,025.35 BSC <0.01% $0.001783 250,000,000 $445,651.96 BSC <0.01% $0.000329 995,410,347.015 $327,032.12 BSC <0.01% $395.34 757.0464 $299,290.42 BSC <0.01% $0.003666 79,048,277.5659 $289,784.66 BSC <0.01% $0.019084 14,960,284.0219 $285,503.01 BSC <0.01% $0.000608 462,685,631.4085 $281,197.33 BSC <0.01% $0.44798 570,603.8382 $255,618.92 BSC <0.01% $5 47,874.3687 $239,176.95 BSC <0.01% $2.53 93,763.218 $237,220.94 BSC <0.01% $13.37 17,457.4535 $233,397.11 BSC <0.01% $0.008314 21,782,675.9244 $181,105.96 BSC <0.01% $447.63 343.8857 $153,934.76 BSC <0.01% $0.256338 591,314.0674 $151,576.33 BSC <0.01% $3.35 44,757.7726 $149,938.54 BSC <0.01% $102.16 1,427.8231 $145,870.58 BSC <0.01% $2,633.48 50 $131,673.76 BSC <0.01% $25.74 4,882.2224 $125,663.37 BSC <0.01% <$0.000001 7,715,989,785,652 $90,910.09 BSC <0.01% $6.37 13,216.728 $84,241.09 BSC <0.01% $1 57,608.0861 $57,613.45 BSC <0.01% $347.41 140.6572 $48,865.71 BSC <0.01% $1.45 32,862.6108 $47,668.64 BSC <0.01% $78.1 485.0335 $37,880.97 BSC <0.01% $59.72 633.5845 $37,835.33 BSC <0.01% $0.038212 942,934.0064 $36,031.49 BSC <0.01% $1.33 26,243.0941 $34,987.18 BSC <0.01% $0.000161 159,546,636.5963 $25,693.39 BSC <0.01% $0.23826 104,711.9067 $24,948.69 BSC <0.01% $1,511.02 13.1017 $19,796.92 BSC <0.01% $3,416.31 4.9058 $16,759.79 BSC <0.01% $8,452.49 1.7889 $15,120.65 BSC <0.01% $0.000137 100,000,000 $13,699 BSC <0.01% $0.000645 16,692,829.5846 $10,759.92 BSC <0.01% $0.000176 49,744,796.0732 $8,768.52 BSC <0.01% $0.581393 13,794.4749 $8,020.01 BSC <0.01% $40.88 176.8089 $7,228.02 BSC <0.01% $0.000002 3,770,083,491.923 $5,655.13 BSC <0.01% $9.63 417.1377 $4,016.01 BSC <0.01% $1 2,599.8754 $2,602.48 BSC <0.01% $0.000313 8,232,752.4617 $2,575.29 BSC <0.01% $696.1 2.416 $1,681.8 BSC <0.01% $0.742098 1,868.3754 $1,386.52 BSC <0.01% <$0.000001 3,000,001,984.9327 $917.7 BSC <0.01% $0.062239 11,864.5707 $738.43 BSC <0.01% $0.000214 2,736,505.2633 $584.79 BSC <0.01% $0.000324 1,100,000 $356.87 BSC <0.01% $0.021126 13,562.5643 $286.52 BSC <0.01% $0.019733 13,075.4943 $258.01 BSC <0.01% $0.759858 265.9854 $202.11 BSC <0.01% $0.000004 41,328,411.9058 $183.91 BSC <0.01% $0.000001 215,613,139.5677 $143.09 BSC <0.01% $0.068699 2,063.4628 $141.76 BSC <0.01% $0.08985 635.4073 $57.09 BSC <0.01% $0.472414 103.7359 $49.01 BSC <0.01% $0.004378 5,815.5439 $25.46 BSC <0.01% $0.171649 127.5421 $21.89 BSC <0.01% <$0.000001 5,609,030,597.3154 $17.61 BSC <0.01% $0.009865 1,191.62 $11.76 BSC <0.01% $0.022258 459.64 $10.23 BSC <0.01% <$0.000001 2,000,000,000,000 $9.1 BSC <0.01% $0.351595 25.0603 $8.81 BSC <0.01% $0.000753 10,175.0297 $7.66 BSC <0.01% <$0.000001 7,530,918,833 $5.64 BSC <0.01% $0.000001 3,430,142.124 $4.36 BSC <0.01% $0.002713 1,418.0318 $3.85 BSC <0.01% $0.05861 60.24 $3.53 BSC <0.01% $0.000002 1,000,000 $2.36 BSC <0.01% $0.000699 3,249.4341 $2.27 BSC <0.01% $2.12 1 $2.12 BSC <0.01% <$0.000001 943,784,470.0803 $0.9475 BSC <0.01% $0.661819 1 $0.6618 BSC <0.01% $0.383446 1.1466 $0.4396 BSC <0.01% <$0.000001 324,129,430.3584 $0.3111 BSC <0.01% $0.000103 2,641 $0.2717 BSC <0.01% $0.008936 29 $0.2591 BSC <0.01% $0.027803 9 $0.2502 BSC <0.01% $0.001746 136.1226 $0.2377 BSC <0.01% $0.000966 200 $0.1931 BSC <0.01% $0.049715 3 $0.1491 ETH <0.01% $3,404.01 25.6991 $87,479.75 ETH <0.01% $15.91 0.1908 $3.04 ARB <0.01% $3,402.68 0.0004153 $1.41 ARB <0.01% $0.004222 29 $0.1224 POL <0.01% $0.467771 0.2055 $0.096118 FTM <0.01% $0.784277 0.0010003 $0.000785 [ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity), KeccakCaching (medium-severity), EmptyByteArrayCopy (medium-severity), DynamicArrayCleanup (medium-severity), MissingEscapingInFormatting (very low-severity), ArraySliceDynamicallyEncodedBaseType (very low-severity), ImplicitConstructorCallvalueCheck (very low-severity), TupleAssignmentMultiStackSlotComponents (very low-severity), MemoryArrayCreationOverflow (low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.