From c2074ed4acc637e7cc1d33273fd7b99cf8cc5356 Mon Sep 17 00:00:00 2001 From: Doublo54 Date: Mon, 27 Feb 2023 13:00:55 +0100 Subject: [PATCH 1/8] feat: Added V3 dex test helpers --- .../dex/contracts/NFTDescriptor.json | 107 ++ .../contracts/NonfungiblePositionManager.json | 1235 +++++++++++++++++ .../NonfungibleTokenPositionDescriptor.json | 161 +++ .../dex/contracts/SwapRouter.json | 574 ++++++++ .../dex/contracts/UniswapV3Factory.json | 245 ++++ .../dex/contracts/UniswapV3Pool.json | 1092 +++++++++++++++ src/dexV3.ts | 162 +++ src/index.ts | 1 + test/dexV3.test.ts | 104 ++ 9 files changed, 3681 insertions(+) create mode 100644 src/artifacts-apeswap/dex/contracts/NFTDescriptor.json create mode 100644 src/artifacts-apeswap/dex/contracts/NonfungiblePositionManager.json create mode 100644 src/artifacts-apeswap/dex/contracts/NonfungibleTokenPositionDescriptor.json create mode 100644 src/artifacts-apeswap/dex/contracts/SwapRouter.json create mode 100644 src/artifacts-apeswap/dex/contracts/UniswapV3Factory.json create mode 100644 src/artifacts-apeswap/dex/contracts/UniswapV3Pool.json create mode 100644 src/dexV3.ts create mode 100644 test/dexV3.test.ts diff --git a/src/artifacts-apeswap/dex/contracts/NFTDescriptor.json b/src/artifacts-apeswap/dex/contracts/NFTDescriptor.json new file mode 100644 index 0000000..e690283 --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/NFTDescriptor.json @@ -0,0 +1,107 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NFTDescriptor", + "sourceName": "contracts/libraries/NFTDescriptor.sol", + "abi": [ + { + "inputs": [], + "name": "T", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "quoteTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "baseTokenAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "quoteTokenSymbol", + "type": "string" + }, + { + "internalType": "string", + "name": "baseTokenSymbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "quoteTokenDecimals", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "baseTokenDecimals", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "flipRatio", + "type": "bool" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickCurrent", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickSpacing", + "type": "int24" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "poolAddress", + "type": "address" + } + ], + "internalType": "struct NFTDescriptor.ConstructTokenURIParams", + "name": "params", + "type": "tuple" + } + ], + "name": "constructTokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6080806040523461001b57615fb3908162000021823930815050f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63c49917d71461002857600080fd5b60031960203682011261018e576004359067ffffffffffffffff90818311610196576101c09083360301126101925761005f610234565b9282600401358452610073602484016102a6565b6020850152610084604484016102a6565b6040850152606483013582811161018e576100a590600436918601016102ea565b6060850152608483013591821161018b5761018761017b856101706101a4876100d3368983016004016102ea565b60808501526100e460a48201610331565b60a08501526100f560c48201610331565b60c085015261010660e4820161033f565b60e0850152610118610104820161034c565b61010085015261012b610124820161034c565b61012085015261013e610144820161034c565b610140850152610151610164820161034c565b610160850152610164610184820161035a565b610180850152016102a6565b6101a08201526103e2565b6040519182918261039f565b0390f35b80fd5b5080fd5b8280fd5b8380fd5b50634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176101cd57604052565b6101d561019a565b604052565b6020810190811067ffffffffffffffff8211176101cd57604052565b6040810190811067ffffffffffffffff8211176101cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176101cd57604052565b604051906101c0820182811067ffffffffffffffff8211176101cd57604052565b60405190610262826101b1565b565b60405190610140820182811067ffffffffffffffff8211176101cd57604052565b60405190610160820182811067ffffffffffffffff8211176101cd57604052565b35906001600160a01b03821682036102ba57565b600080fd5b60209067ffffffffffffffff81116102dd575b601f01601f19160190565b6102e561019a565b6102d2565b81601f820112156102ba57803590610301826102bf565b9261030f6040519485610212565b828452602083830101116102ba57816000926020809301838601378301015290565b359060ff821682036102ba57565b359081151582036102ba57565b35908160020b82036102ba57565b359062ffffff821682036102ba57565b918091926000905b82821061038a575011610383575050565b6000910152565b91508060209183015181860152018291610372565b604091602082526103bf815180928160208601526020868601910161036a565b601f01601f1916010190565b906103de6020928281519485920161036a565b0190565b6106126105136105d160206105bd6105946106069661051361056b61054261018084019361051361042761042161041c885162ffffff1690565b611f1d565b83610fb2565b956105136105196104e06104db6104d56104446060890151610b6a565b61047a60808a01918a61047461046f6101a06104608751610b6a565b9301516001600160a01b031690565b61228a565b91610c7a565b9689610490610489825161087c565b9351610b6a565b602061041c6104c561046f60406104b661046f6104cf968901516001600160a01b031690565b9601516001600160a01b031690565b945162ffffff1690565b93610dcd565b9661239b565b610a3a565b986040519e8f9d8e016009907f7b226e616d65223a22000000000000000000000000000000000000000000000081520190565b906103cb565b7f222c20226465736372697074696f6e223a220000000000000000000000000000815260120190565b7f222c2022696d616765223a2022000000000000000000000000000000000000008152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b03916104db601f1993848101835282610212565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d8301610513565b03908101835282610212565b90565b60405190610622826101da565b60008252565b50634e487b7160e01b600052601160045260246000fd5b600190600019811461064f570190565b6103de610628565b50634e487b7160e01b600052601260045260246000fd5b8015610693575b78010000000000000000000000000000000000000000000000000490565b61069b610657565b610675565b80156106ae575b6000190490565b6106b6610657565b6106a7565b81156106c5570490565b6106cd610657565b0490565b604051906106de826101f6565b6006825260203681840137565b906106f5826102bf565b6107026040519182610212565b8281528092610713601f19916102bf565b0190602036910137565b6001811061072d575b6000190190565b610735610628565b610726565b80602b10610749575b602b0390565b610751610628565b610743565b80600510610765575b60050390565b61076d610628565b61075f565b60058110610782575b6004190190565b61078a610628565b61077b565b6004811061079f575b6003190190565b6107a7610628565b610798565b8181106107b7570390565b6107bf610628565b0390565b600290600219811161064f570190565b602090602019811161064f570190565b600190600119811161064f570190565b600490600419811161064f570190565b600a90600a19811161064f570190565b8119811161064f570190565b50634e487b7160e01b600052603260045260246000fd5b602090805115610844570190565b6103de61081f565b602190805160011015610844570190565b90602091805182101561086f57010190565b61087761081f565b010190565b8015610906576000818181805b6108ee5750610897816106eb565b935b6108a35750505090565b6108ac9061071d565b90600a906001600160f81b03198282066030811981116108e1575b0160f81b16841a6108d8848761085d565b53049081610899565b6108e9610628565b6108c7565b91506108fb600a9161063f565b910480849291610889565b50604051610913816101f6565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b6040519061094d826101b1565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b7f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116001166109d0575b60021b90565b6109d8610628565b6109ca565b7f24924924924924924924924924924924924924924924924924924924924924928111600116610a0e575b60070290565b610a16610628565b610a08565b8060001904821181151516610a2e570290565b610a36610628565b0290565b805115610b4f57610a49610940565b610a65610a60610a5984516107c3565b6003900490565b61099f565b91610a77610a72846107d3565b6106eb565b92835280815182019060208501935b828210610afd57505050600390510680600114610ad257600214610aa8575090565b7f3d0000000000000000000000000000000000000000000000000000000000000090600019015290565b507f3d3d00000000000000000000000000000000000000000000000000000000000090600119015290565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190610a86565b50610612610615565b60ff6001911660ff811461064f570190565b906000805b835160ff821690811015610bd657610bad610ba0610b92601160f91b938861085d565b516001600160f81b03191690565b6001600160f81b03191690565b14610bc1575b610bbc90610b58565b610b6f565b90610bce610bbc91610b58565b919050610bb3565b505060ff80911680610be6575050565b610a72610bf4918551610813565b90600093845b815183821690811015610c715790610c33610b9283601160f91b610c27610ba0610b92610c51988a61085d565b14610c56575b8561085d565b96610c4b610c408261063f565b9860001a918761085d565b53610b58565b610bfa565b605c610c6b610c648c61063f565b9b8a61085d565b53610c2d565b50929450505050565b90610dbf61061292610513610db1609b966105136040519889977f54686973204e465420726570726573656e74732061206c69717569646974792060208a01527f706f736974696f6e20696e206120556e6973776170205633200000000000000060408a01528651610cf38160598c0160208b0161036a565b8901602d60f81b6059820152610d13825180936020605a8501910161036a565b017f20706f6f6c2e2000000000000000000000000000000000000000000000000000605a8201527f546865206f776e6572206f662074686973204e46542063616e206d6f6469667960618201527f206f722072656465656d2074686520706f736974696f6e2e5c6e0000000000006081820152016010907f5c6e506f6f6c20416464726573733a200000000000000000000000000000000081520190565b612e3760f11b815260020190565b03601f198101835282610212565b610ec8610ef1916105136042610dbf959698610612986040519a8b99602a610e268c7f20416464726573733a2000000000000000000000000000000000000000000000948560208301526020815194859301910161036a565b8b01612e3760f11b602a820152610e47825180936020602c8501910161036a565b0190602c820152610e6282518093602060368501910161036a565b017f5c6e46656520546965723a2000000000000000000000000000000000000000006036820152610e9c825180936020868501910161036a565b0101600c907f5c6e546f6b656e2049443a20000000000000000000000000000000000000000081520190565b7f5c6e5c6e00000000000000000000000000000000000000000000000000000000815260040190565b7fe29aa0efb88f20444953434c41494d45523a204475652064696c6967656e636581527f20697320696d7065726174697665207768656e20617373657373696e6720746860208201527f6973204e46542e204d616b65207375726520746f6b656e20616464726573736560408201527f73206d617463682074686520657870656374656420746f6b656e732c2061732060608201527f746f6b656e2073796d626f6c73206d617920626520696d6974617465642e00006080820152609e0190565b90610fc06060830151610b6a565b91610fce6080820151610b6a565b9060e0810190610fde8251151590565b90816111245761010081015160020b5b61016082019261103361102c611005865160020b90565b9260c0860194611016865160ff1690565b60a0880195611026875160ff1690565b926112a4565b9551151590565b928361111657610120015160020b935b5160020b915160ff16905160ff169161105b946112a4565b6040517f556e6973776170202d20000000000000000000000000000000000000000000006020820152948594919391602a8601611097916103cb565b6201016960ed1b81526003016110ac916103cb565b602f60f81b81526001016110bf916103cb565b6201016960ed1b81526003016110d4916103cb565b7f3c3e00000000000000000000000000000000000000000000000000000000000081526002015b611104916103cb565b03601f19810182526106129082610212565b610100015160020b93611043565b61012081015160020b610fee565b60020b8015611145575b620d89e7190590565b61114d610657565b61113c565b60020b8015611164575b620d89e80590565b61116c610657565b61115c565b60020b9060020b9081156111a1575b627fffff198114600019831416611195570590565b61119d610628565b0590565b6111a9610657565b611180565b60020b9060020b9060008213600082139083627fffff818104851183851616611225575b627fffff19936000831293908416868605841216611218575b8260008712950586129085161661120b575b058312911616610a2e570290565b611213610628565b6111fd565b611220610628565b6111eb565b61122d610628565b6111d2565b6040519061123f826101f6565b600382527f4d494e00000000000000000000000000000000000000000000000000000000006020830152565b60405190611278826101f6565b600382527f4d415800000000000000000000000000000000000000000000000000000000006020830152565b906112c06112ba826112b581611132565b6111ae565b60020b90565b908260020b9182146000146112ec575050505050156000146112e457610612611232565b61061261126b565b6112ba816112b56112fc93611152565b03611318575050506113105761061261126b565b610612611232565b9261132561061294611351565b9015611806576113406001600160a01b0361134c921661066e565b6001600160a01b031690565b611806565b60020b60008112156116e557806000035b620d89e881116116bb576001600160a01b0391600182161561169f5770ffffffffffffffffffffffffffffffffff6ffffcb933bd6fad37aa2d162d1a5940015b169160028116611683575b60048116611667575b6008811661164b575b6010811661162f575b60208116611613575b604081166115f7575b6080908181166115dc575b61010081166115c1575b61020081166115a6575b610400811661158b575b6108008116611570575b6110008116611555575b612000811661153a575b614000811661151f575b6180008116611504575b6201000081166114e9575b6202000081166114cf575b6204000081166114b5575b620800001661149a575b5060001261148c575b63ffffffff81166114835760ff60005b169060201c011690565b60ff6001611479565b611495906106a0565b611469565b6b048a170391f7dc42444e8fa26000929302901c9190611460565b6d2216e584f5fa1ea926041bedfe98909302811c92611456565b926e5d6af8dedb81196699c329225ee60402811c9261144b565b926f09aa508b5b7a84e1c677de54f3e99bc902811c92611440565b926f31be135f97d08fd981231505542fcfa602811c92611435565b926f70d869a156d2a1b890bb3df62baf32f702811c9261142b565b926fa9f746462d870fdf8a65dc1f90e061e502811c92611421565b926fd097f3bdfd2022b8845ad8f792aa582502811c92611417565b926fe7159475a2c29b7443b29c7fa6e889d902811c9261140d565b926ff3392b0822b70005940c7a398e4b70f302811c92611403565b926ff987a7253ac413176f2b074cf7815e5402811c926113f9565b926ffcbe86c7900a88aedcffc83b479aa3a402811c926113ef565b926ffe5dee046a99a2a811c461f1969c305302811c926113e5565b916fff2ea16466c96a3843ec78b326b528610260801c916113da565b916fff973b41fa98c081472e6896dfb254c00260801c916113d1565b916fffcb9843d60f6159c9db58835c9266440260801c916113c8565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c916113bf565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c916113b6565b916ffff97272373d413259a46990580e213a0260801c916113ad565b70ffffffffffffffffffffffffffffffffff600160801b6113a2565b60046040517f2bc80f3a000000000000000000000000000000000000000000000000000000008152fd5b80611362565b60ff166001811061072d576000190190565b60ff166004811061079f576003190190565b60ff1680602b1061074957602b0390565b60ff1660028110611733575b6001190190565b61173b610628565b61172c565b60405190610100820182811067ffffffffffffffff821117611791575b6040528160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b61179961019a565b61175d565b60ff168060ff036007116117b3575b60070190565b6117bb610628565b6117ad565b60ff6001911660fe811161064f570190565b60ff6002911660fd811161064f570190565b60ff168060ff036001116117f9575b60010190565b611801610628565b6117f3565b906118119291611e16565b906c0100000000000000000000000061182a83806119c1565b92109182156119ab5761183c90611a55565b915b82836000945b611997575061185661061293946116eb565b9161186383809493611d0f565b939093611983575b506118fe9192611879611740565b9384831561190a576118e46118e9916118dd6118d36118cd6118c860ff886118c260806118b06118ab6118f39d61170f565b61179e565b60ff1660208a01908152980160029052565b1661073a565b6107e3565b60ff1690565b60ff1660a08a0152565b5160ff1690565b6116eb565b60ff166040860152565b8352151560c0830152565b600060e0820152611b80565b50600960ff8216106119595761193e6118e4611928611948936116fd565b60ff1660208801908152600560808901526118dd565b60ff1660a0860152565b600460408501526118f3565b6118f3565b6119796119549161196d6020880160069052565b600560408801526116fd565b60ff166060860152565b6118fe925061199190610b58565b9161186b565b936119a3600a91610b58565b940480611844565b6119b490611a0b565b9161183e565b156102ba57565b6000198282099082810292838084109303928084039314611a02576801000000000000000091838311156102ba570990828211900360c01b910360401c1790565b50505060401c90565b620186a0906000198282099082810292838084109303928084039314611a4c57600160801b91838311156102ba570990828211900360801b910360801c1790565b50505060801c90565b72047bf19673df52e37f2410011d100000000000906000198282099082810292838084109303928084039314611a4c57600160801b91838311156102ba570990828211900360801b910360801c1790565b600160801b6000198183098260801b91828083109203918083039214611b17577003298b075b4b6a5240945790619b37fd4a90828211156102ba577f1f514b8ee5362595de309a65c03ce543f7e851e1625ea646b8fe88b81023b92d940990828211900360ff1b910360011c170290565b50507003298b075b4b6a5240945790619b37fd4a91500490565b7003298b075b4b6a5240945790619b37fd4a906000198282099082810292838084109303928084039314611a4c57600160801b91838311156102ba570990828211900360801b910360801c1790565b611b94610a726118cd602084015160ff1690565b90611ba260e0820151151590565b611cf4575b60c0810151611cd7575b611bc26118cd608083015160ff1690565b611bdb6118cd611bd660a085015160ff1690565b6117c0565b811015611bfd57806030611bf2611bf8938661085d565b5361063f565b611bc2565b50915b825115611cd257611c186118cd606085015160ff1690565b8015159081611cb8575b50611c8b575b611c53611c43611c3a8551600a900690565b60300160ff1690565b60f81b6001600160f81b03191690565b611c7d60408501611c65815160ff1690565b60ff600019820181169092529260001a92168461085d565b538251600a90048352611c00565b602e611cb260408501611c9f815160ff1690565b60ff60001982018116909252168461085d565b53611c28565b905060ff611cca604086015160ff1690565b161438611c22565b915090565b6030611ce283610836565b53602e611cee8361084c565b53611bb1565b6025611d09611d03845161071d565b8461085d565b53611ba7565b6000929160ff1660058111611d57575b50600a600481830611910490611d49575b620186a08114611d3e579190565b600a90049150600190565b611d52906107e3565b611d30565b80600560ff9210611d9d575b6004190116604d8111611d90575b600a0a908115611d83575b0438611d1f565b611d8b610657565b611d7c565b611d98610628565b611d71565b611da5610628565b611d63565b6000821282600160ff1b018212811516611ded575b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213166107b7570390565b611df5610628565b611dbf565b604d8111611e09575b600a0a90565b611e11610628565b611e03565b60ff9182169392909116611e32611e2d8286611daa565b611ec8565b9384151580611ebd575b15611eae57600192839290911115611e7f57611e6c906001600160a01b03611e6587851c611dfa565b9116610a1b565b931614611e7557565b9061061290611b31565b611e9d906001600160a01b03611e9687851c611dfa565b91166106bb565b931603610262579061061290611aa6565b50506001600160a01b03169150565b506012851115611e3c565b6000808212611ed5575090565b600160ff1b82146107b7570390565b60405190611ef1826101f6565b600282527f30250000000000000000000000000000000000000000000000000000000000006020830152565b62ffffff808216801561227f57611f40611f35610255565b62ffffff9094168452565b6020830160009283825260408501938085525b81611f61875162ffffff1690565b168015611ff95782611f74855160ff1690565b9160ff831615611fd757505050611f9e611f97611f92855160ff1690565b610b58565b60ff168452565b611fa8855161063f565b8552611fd2611fc9611fbd885162ffffff1690565b62ffffff600a91160490565b62ffffff168752565b611f53565b600a900616611fe7575b50611f9e565b611f97611ff391610b58565b38611fe1565b50945050919091612008611740565b8251909390600581106121e35750918394918493600461203784516120316118cd865160ff1690565b906107ac565b106121da5760ff845b1696879261204e8551610772565b61205f6118cd6118e4845160ff1690565b11156121625780866121066118cd6106129c6120d3846120ef6121569e60406120e76118cd61212b9f6120d36121259f6121209f6118cd916121109f6120dd6118cd6120d86118dd936120c560806120bb6118e4995160ff1690565b60ff169701968752565b6120d36118cd875160ff1690565b610813565b61071d565b60ff1660a08b0152565b60ff16910152565b6121006118cd611bd6895160ff1690565b90610813565b60ff1660208b0152565b6120316118cd8751925160ff1690565b611dfa565b906106bb565b8452600160e08501525190600482111561215b57506118cd61214c9161078f565b60ff166060830152565b611b80565b905061214c565b80855161216e90610772565b815160ff1661217c906116eb565b60ff16612188916107ac565b6121066118cd6106129c6120d3846120ef6121569e60406120e76118cd61212b9f6120d36121259f6121209f6118cd916121109f6120dd6118cd6120d86118dd936120c560806120bb6118e4996118dd565b60ff6001612040565b612156939161212561212061061298956122736122696122648b6118dd602061225a6118cd61221461212b9d610756565b61224461223a6118cd6120d86122346118cd60808c016118dd8160029052565b85610813565b60ff1660a0880152565b6121006118cd6122558c5160ff1690565b6117d2565b60ff169201918252565b611720565b60ff1660408b0152565b600160c08a0152612110565b505050610612611ee4565b6001600160a01b0316604051906122a0826101b1565b602a8252604036602084013760306122b783610836565b5360786122c38361084c565b536029905b600182116122db57610612915015612336565b806f181899199a1a9b1b9c1cb0b131b232b360811b600f6123169316601081101561231c575b1a61230c848661085d565b5360041c91612329565b906122c8565b61232461081f565b612301565b801561072d576000190190565b1561233d57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b602081019081516123b2906001600160a01b031690565b6123c4906001600160a01b0316612726565b90604081019182516123dc906001600160a01b031690565b6123ee906001600160a01b0316612726565b918451612401906001600160a01b031690565b612413906001600160a01b031661279f565b918451612426906001600160a01b031690565b612438906001600160a01b031661279f565b8651835161244e916001600160a01b03166127f9565b612457906126b4565b8651845161246d916001600160a01b03166127f9565b612476906126fb565b8851855161248c916001600160a01b031661280e565b612495906126b4565b9188516124a8906001600160a01b031690565b86516124bc916001600160a01b031661280e565b6124c5906126fb565b938a516124d8906001600160a01b031690565b87516124ec916001600160a01b031661281f565b6124f5906126b4565b978a51612508906001600160a01b031690565b885161251c916001600160a01b031661281f565b612525906126fb565b9961252e610264565b978852602088015260408701526060860152608085015260a084015260c083015260e08201526101009283820152610120938482015261256d9061297a565b94516001600160a01b03166125819061228a565b93516001600160a01b03166125959061228a565b926101a08201516125ac906001600160a01b031690565b9260608301519060808401516101808501516125ca9062ffffff1690565b6125d390611f1d565b8583015160020b90858701516125e99060020b90565b926101608801516125fa9060020b90565b95610140998a8a015161260d9060020b90565b61261890878761268b565b99519b612623610285565b9d8e5260208e01526001600160a01b031660408d015260608c015260808b015260a08a015260020b60c089015260020b60e0880152860190612667919060020b9052565b840190612676919060000b9052565b82015261268290612899565b61061291612830565b600292830b920b8212156126a157505060001990565b60020b12156126af57600190565b600090565b601060ff610612926101029080600019048211811515166126ee575b0204811981116126e1575b0161087c565b6126e9610628565b6126db565b6126f6610628565b6126d0565b606460ff610612926101809080600019048211811515166126ee570204811981116126e1570161087c565b60881c6127316106d1565b90815190815b61274057505090565b806f181899199a1a9b1b9c1cb0b131b232b360811b600f61277e93166010811015612792575b60018510612785575b1a61230c60001985018661085d565b9081612737565b61278d610628565b61276f565b61279a61081f565b612766565b6127a76106d1565b90815190815b6127b657505090565b806f181899199a1a9b1b9c1cb0b131b232b360811b600f6127f2931660108110156127925760018510612785571a61230c60001985018661085d565b90816127ad565b60ff918261280a9260101c16610a1b565b0690565b60ff918261280a9260201c16610a1b565b60ff918261280a9260301c16610a1b565b602661061291604051938161284f86935180926020808701910161036a565b8201612864825180936020808501910161036a565b017f3c2f7376673e00000000000000000000000000000000000000000000000000006020820152036006810184520182610212565b61061261051391610dbf8151916105136128d760208301516128c8606085019687516080870193845192613b6e565b9551905160a0850151916141a8565b9161051360c082016105136129696128f0835160020b90565b94612963604061295261292560e085019961290c8b5160020b90565b61010087015160020b9061012088015160000b926144b5565b9661014085019961294c61294461293c8d5161087c565b935160020b90565b915160020b90565b91614dd6565b97519201516001600160a01b031690565b90615ab6565b956040519a8b9960208b01906103cb565b805160409081519182602092838201612a4f906081907f3c7376672077696474683d2732393027206865696768743d273530302720766981527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c726563742077696460408201527f74683d27323930707827206865696768743d273530307078272066696c6c3d2760608201527f230000000000000000000000000000000000000000000000000000000000000060808201520190565b612a58916103cb565b6813979f1e17b9bb339f60b91b81526009010392601f19938481018252612a7f9082610212565b612a8890610a3a565b93608081015160a082015190848301518451928392878401612b26906063907f3c7376672077696474683d2732393027206865696768743d273530302720766981527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063604082015262783d2760e81b60608201520190565b612b2f916103cb565b65272063793d2760d01b8152600601612b47916103cb565b7f2720723d273132307078272066696c6c3d2723000000000000000000000000008152601301612b76916103cb565b6813979f1e17b9bb339f60b91b8152600901038581018252612b989082610212565b612ba190610a3a565b60c082015160e08301518484015185517f3c7376672077696474683d2732393027206865696768743d27353030272076698882019081527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063604082015262783d2760e81b60608201529093849391606301612c41916103cb565b65272063793d2760d01b8152600601612c59916103cb565b7f2720723d273132307078272066696c6c3d2723000000000000000000000000008152601301612c88916103cb565b6813979f1e17b9bb339f60b91b8152600901038681018252612caa9082610212565b612cb390610a3a565b906101008301516101208401519060608501518651928392898401612d54906063907f3c7376672077696474683d2732393027206865696768743d273530302720766981527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063604082015262783d2760e81b60608201520190565b612d5d916103cb565b65272063793d2760d01b8152600601612d75916103cb565b7f2720723d273130307078272066696c6c3d2723000000000000000000000000008152601301612da4916103cb565b6813979f1e17b9bb339f60b91b8152600901038781018252612dc69082610212565b612dcf90610a3a565b925193517f3c7376672077696474683d2232393022206865696768743d22353030222076699581019586527f6577426f783d2230203020323930203530302220786d6c6e733d22687474703a60208701527f2f2f7777772e77332e6f72672f323030302f737667220000000000000000000060408701529687956056017f20786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f81527f313939392f786c696e6b273e00000000000000000000000000000000000000006020820152602c017f3c646566733e000000000000000000000000000000000000000000000000000081526006017f3c66696c7465722069643d226631223e3c6665496d61676520726573756c743d81527f2270302220786c696e6b3a687265663d22646174613a696d6167652f7376672b60208201527f786d6c3b6261736536342c0000000000000000000000000000000000000000006040820152604b01612f39916103cb565b7f222f3e3c6665496d61676520726573756c743d2270312220786c696e6b3a687281527f65663d22646174613a696d6167652f7376672b786d6c3b6261736536342c00006020820152603e01612f8e916103cb565b7f222f3e3c6665496d61676520726573756c743d2270322220786c696e6b3a687281527f65663d22646174613a696d6167652f7376672b786d6c3b6261736536342c00006020820152603e01612fe3916103cb565b631110179f60e11b81526004017f3c6665496d61676520726573756c743d2270332220786c696e6b3a687265663d81527f22646174613a696d6167652f7376672b786d6c3b6261736536342c00000000006020820152603b01613045916103cb565b7f22202f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e3d2281527f70302220696e323d22703122202f3e3c6665426c656e64206d6f64653d22657860208201527f636c7573696f6e2220696e323d22703222202f3e3c6665426c656e64206d6f6460408201527f653d226f7665726c61792220696e323d2270332220726573756c743d22626c6560608201527f6e644f757422202f3e3c6665476175737369616e426c7572200000000000000060808201526099017f696e3d22626c656e644f75742220737464446576696174696f6e3d223432222081527f2f3e3c2f66696c7465723e203c636c6970506174682069643d22636f726e657260208201527f73223e3c726563742077696474683d2232393022206865696768743d2235303060408201527f222072783d223432222072793d22343222202f3e3c2f636c6970506174683e006060820152607f017f3c706174682069643d22746578742d706174682d612220643d224d343020313281527f204832353020413238203238203020302031203237382034302056343630204160208201527f323820323820302030203120323530203438382048343020413238203238203060408201527f203020312031322034363020563430204132382032382030203020312034302060608201527f3132207a22202f3e00000000000000000000000000000000000000000000000060808201526088017f3c706174682069643d226d696e696d61702220643d224d32333420343434433281527f3334203435372e393439203234322e323120343633203235332034363322202f6020820152601f60f91b60408201526041017f3c66696c7465722069643d22746f702d726567696f6e2d626c7572223e3c666581527f476175737369616e426c757220696e3d22536f7572636547726170686963222060208201527f737464446576696174696f6e3d22323422202f3e3c2f66696c7465723e0000006040820152605d017f3c6c696e6561724772616469656e742069643d22677261642d7570222078313d81527f2231222078323d2230222079313d2231222079323d2230223e3c73746f70206f60208201527f66667365743d22302e30222073746f702d636f6c6f723d22776869746522207360408201527f746f702d6f7061636974793d223122202f3e000000000000000000000000000060608201526072017f3c73746f70206f66667365743d222e39222073746f702d636f6c6f723d22776881527f697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e65617260208201527f4772616469656e743e000000000000000000000000000000000000000000000060408201526049017f3c6c696e6561724772616469656e742069643d22677261642d646f776e22207881527f313d2230222078323d2231222079313d2230222079323d2231223e3c73746f7060208201527f206f66667365743d22302e30222073746f702d636f6c6f723d2277686974652260408201527f2073746f702d6f7061636974793d223122202f3e3c73746f70206f666673657460608201527f3d22302e39222073746f702d636f6c6f723d227768697465222073746f702d6f60808201527f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e000060a082015260be017f3c6d61736b2069643d22666164652d757022206d61736b436f6e74656e74556e81527f6974733d226f626a656374426f756e64696e67426f78223e3c7265637420776960208201527f6474683d223122206865696768743d2231222066696c6c3d2275726c2823677260408201527f61642d75702922202f3e3c2f6d61736b3e00000000000000000000000000000060608201526071017f3c6d61736b2069643d22666164652d646f776e22206d61736b436f6e74656e7481527f556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742060208201527f77696474683d223122206865696768743d2231222066696c6c3d2275726c282360408201527f677261642d646f776e2922202f3e3c2f6d61736b3e000000000000000000000060608201526075017f3c6d61736b2069643d226e6f6e6522206d61736b436f6e74656e74556e69747381527f3d226f626a656374426f756e64696e67426f78223e3c7265637420776964746860208201527f3d223122206865696768743d2231222066696c6c3d22776869746522202f3e3c60408201527f2f6d61736b3e000000000000000000000000000000000000000000000000000060608201526066017f3c6c696e6561724772616469656e742069643d22677261642d73796d626f6c2281527f3e3c73746f70206f66667365743d22302e37222073746f702d636f6c6f723d2260208201527f7768697465222073746f702d6f7061636974793d223122202f3e3c73746f702060408201527f6f66667365743d222e3935222073746f702d636f6c6f723d227768697465222060608201527f73746f702d6f7061636974793d223022202f3e3c2f6c696e656172477261646960808201527f656e743e0000000000000000000000000000000000000000000000000000000060a082015260a4017f3c6d61736b2069643d22666164652d73796d626f6c22206d61736b436f6e746581527f6e74556e6974733d227573657253706163654f6e557365223e3c72656374207760208201527f696474683d22323930707822206865696768743d223230307078222066696c6c60408201527f3d2275726c2823677261642d73796d626f6c2922202f3e3c2f6d61736b3e3c2f60608201527f646566733e00000000000000000000000000000000000000000000000000000060808201526085017f3c6720636c69702d706174683d2275726c2823636f726e65727329223e0000008152601d017f3c726563742066696c6c3d2200000000000000000000000000000000000000008152600c016138ce916103cb565b7f2220783d223070782220793d22307078222077696474683d223239307078222081527f6865696768743d22353030707822202f3e00000000000000000000000000000060208201526031017f3c72656374207374796c653d2266696c7465723a2075726c282366312922207881527f3d223070782220793d22307078222077696474683d223239307078222068656960208201527f6768743d22353030707822202f3e0000000000000000000000000000000000006040820152604e017f203c67207374796c653d2266696c7465723a75726c2823746f702d726567696f81527f6e2d626c7572293b207472616e73666f726d3a7363616c6528312e35293b207460208201527f72616e73666f726d2d6f726967696e3a63656e74657220746f703b223e0000006040820152605d017f3c726563742066696c6c3d226e6f6e652220783d223070782220793d2230707881527f222077696474683d22323930707822206865696768743d22353030707822202f6020820152601f60f91b60408201526041017f3c656c6c697073652063783d22353025222063793d22307078222072783d223181527f38307078222072793d223132307078222066696c6c3d222330303022206f706160208201527f636974793d22302e383522202f3e3c2f673e000000000000000000000000000060408201526052017f3c7265637420783d22302220793d2230222077696474683d223239302220686581527f696768743d22353030222072783d223432222072793d223432222066696c6c3d60208201527f227267626128302c302c302c302922207374726f6b653d22726762612832353560408201527f2c3235352c3235352c302e322922202f3e3c2f673e000000000000000000000060608201526075010390810182526106129082610212565b604080517f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208201527f656564223e000000000000000000000000000000000000000000000000000000918101919091527f3c74657874506174682073746172744f66667365743d222d313030252220666960458201527f6c6c3d2277686974652220666f6e742d66616d696c793d2227436f757269657260658201527f204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231307060858201527f782220786c696e6b3a687265663d2223746578742d706174682d61223e00000060a582015293849392613c6960c28601826103cb565b64010714051160dd1b8152600501613c8190836103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d223330732220726560408201527f70656174436f756e743d22696e646566696e69746522202f3e0000000000000060608201526079017f3c2f74657874506174683e203c74657874506174682073746172744f6666736581527f743d223025222066696c6c3d2277686974652220666f6e742d66616d696c793d60208201527f2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d60408201527f73697a653d22313070782220786c696e6b3a687265663d2223746578742d706160608201527f74682d61223e00000000000000000000000000000000000000000000000000006080820152608601613de0916103cb565b64010714051160dd1b8152600501613df7916103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d223330732220726560408201527f70656174436f756e743d22696e646566696e69746522202f3e203c2f7465787460608201527f506174683e00000000000000000000000000000000000000000000000000000060808201526085017f3c74657874506174682073746172744f66667365743d22353025222066696c6c81527f3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e60208201527f6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782260408201527f20786c696e6b3a687265663d2223746578742d706174682d61223e00000000006060820152607b01613f5790826103cb565b64010714051160dd1b8152600501613f6f90836103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d22333073220000006040820152605d017f20726570656174436f756e743d22696e646566696e69746522202f3e3c2f746581527f7874506174683e3c74657874506174682073746172744f66667365743d222d3560208201527f3025222066696c6c3d2277686974652220666f6e742d66616d696c793d22274360408201527f6f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a60608201527f653d22313070782220786c696e6b3a687265663d2223746578742d706174682d60808201527f61223e000000000000000000000000000000000000000000000000000000000060a082015260a3016140ce916103cb565b64010714051160dd1b81526005016140e5916103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d223330732220726560408201527f70656174436f756e743d22696e646566696e69746522202f3e3c2f746578745060608201527f6174683e3c2f746578743e0000000000000000000000000000000000000000006080820152608b01611104565b610dbf6143a86143916142e5956105136142f66106129761051360ed806040519c8d809c7f3c67206d61736b3d2275726c2823666164652d73796d626f6c29223e3c72656360208301527f742066696c6c3d226e6f6e652220783d223070782220793d223070782220776960408301527f6474683d22323930707822206865696768743d22323030707822202f3e203c7460608301527f65787420793d22373070782220783d2233327078222066696c6c3d227768697460808301527f652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d60a08301527f6f6e6f73706163652220666f6e742d7765696768743d223230302220666f6e7460c08301527f2d73697a653d2233367078223e0000000000000000000000000000000000000060e08301526020815194859301910161036a565b8a0101600190602f60f81b81520190565b7f3c2f746578743e3c7465787420793d2231313570782220783d2233327078222081527f66696c6c3d2277686974652220666f6e742d66616d696c793d2227436f75726960208201527f6572204e6577272c206d6f6e6f73706163652220666f6e742d7765696768743d60408201527f223230302220666f6e742d73697a653d2233367078223e000000000000000000606082015260770190565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b0190565b7f3c7265637420783d2231362220793d223136222077696474683d22323538222081527f6865696768743d22343638222072783d223236222072793d223236222066696c60208201527f6c3d227267626128302c302c302c302922207374726f6b653d2272676261283260408201527f35352c3235352c3235352c302e322922202f3e00000000000000000000000000606082015260730190565b60405190614450826101f6565b600a82527f23666164652d646f776e000000000000000000000000000000000000000000006020830152565b60405190614489826101f6565b600882527f23666164652d75700000000000000000000000000000000000000000000000006020830152565b916144db918460000b6000600182146000146147db5750506144d561447c565b93614a26565b916144e590614b9e565b6040517f3c67206d61736b3d2275726c2800000000000000000000000000000000000000602082015292839261451e602d8501826103cb565b61149160f11b81526002017f207374796c653d227472616e73666f726d3a7472616e736c617465283732707881527f2c313839707829223e3c7265637420783d222d313670782220793d222d31367060208201527f78222077696474683d22313830707822206865696768743d223138307078222060408201527f66696c6c3d226e6f6e6522202f3e3c7061746820643d2200000000000000000060608201526077016145cb90836103cb565b7f22207374726f6b653d227267626128302c302c302c302e332922207374726f6b81527f652d77696474683d2233327078222066696c6c3d226e6f6e6522207374726f6b60208201527f652d6c696e656361703d22726f756e6422202f3e00000000000000000000000060408201526054017f3c2f673e3c67206d61736b3d2275726c28000000000000000000000000000000815260110161466c916103cb565b61149160f11b81526002017f207374796c653d227472616e73666f726d3a7472616e736c617465283732707881527f2c313839707829223e000000000000000000000000000000000000000000000060208201526029017f3c7265637420783d222d313670782220793d222d31367078222077696474683d81527f22313830707822206865696768743d223138307078222066696c6c3d226e6f6e60208201527f6522202f3e00000000000000000000000000000000000000000000000000000060408201526045017f3c7061746820643d2200000000000000000000000000000000000000000000008152600901614764916103cb565b7f22207374726f6b653d2272676261283235352c3235352c3235352c312922206681527f696c6c3d226e6f6e6522207374726f6b652d6c696e656361703d22726f756e6460208201527f22202f3e3c2f673e00000000000000000000000000000000000000000000000060408201526048016110fb565b50196147e9576144d5614443565b6040516147f5816101f6565b600581527f236e6f6e6500000000000000000000000000000000000000000000000000000060208201526144d5565b600291820b910b600082128015627fffff198401831216614851575b82627fffff018213166107b7570390565b614859610628565b614840565b6040519061486b826101f6565b601882527f4d312031433120393720343920313435203134352031343500000000000000006020830152565b604051906148a4826101f6565b601a82527f4d31203143312038392035372e352031343520313435203134350000000000006020830152565b604051906148dd826101f6565b601882527f4d312031433920383120363520313337203134352031343500000000000000006020830152565b60405190614916826101f6565b601982527f4d312031433137203733203733203132392031343520313435000000000000006020830152565b6040519061494f826101f6565b601982527f4d312031433235203635203831203132312031343520313435000000000000006020830152565b60405190614988826101f6565b601982527f4d312031433333203537203839203131332031343520313435000000000000006020830152565b604051906149c1826101f6565b601982527f4d312031433333203439203937203131332031343520313435000000000000006020830152565b604051906149fa826101f6565b601a82527f4d312031433431203431203130352031303520313435203134350000000000006020830152565b614a3490614a399392614824565b611171565b60020b60048113614a4d57506106126149ed565b60088113614a5e57506106126149b4565b60108113614a6f575061061261497b565b60208113614a805750610612614942565b60408113614a915750610612614909565b60808113614aa257506106126148d0565b61010012614ab257610612614897565b61061261485e565b60405190614ac7826101f6565b600282527f37330000000000000000000000000000000000000000000000000000000000006020830152565b60405190614b00826101f6565b600382527f31393000000000000000000000000000000000000000000000000000000000006020830152565b60405190614b39826101f6565b600382527f32313700000000000000000000000000000000000000000000000000000000006020830152565b60405190614b72826101f6565b600382527f33333400000000000000000000000000000000000000000000000000000000006020830152565b614ba6614aba565b614bae614af3565b91614bb7614b2c565b614bbf614b65565b9160000b600181148015614dcb575b15614cff5761061293610513614c42602095610513614c56610dbf97610513614c426105139d614ca59a600019149687600014614cf8578a5b8815614cf15782955b8915614ce95750975b15614ce15750985b6040519e8f9d8e01600c906b1e31b4b931b6329031bc1e9160a11b81520190565b67383c111031bc9e9160c11b815260080190565b7f70782220723d22347078222066696c6c3d22776869746522202f3e3c6369726381527f6c652063783d2200000000000000000000000000000000000000000000000000602082015260270190565b7f70782220723d2232347078222066696c6c3d226e6f6e6522207374726f6b653d815269113bb434ba329110179f60b11b6020820152602a0190565b905098614c21565b905097614c19565b8195614c10565b849a614c07565b506040516b1e31b4b931b6329031bc1e9160a11b6020820152938493602c8501614d28916103cb565b67383c111031bc9e9160c11b8152600801614d42916103cb565b7f70782220723d22347078222066696c6c3d22776869746522202f3e00000000008152601b016b1e31b4b931b6329031bc1e9160a11b8152600c01614d86916103cb565b67383c111031bc9e9160c11b8152600801614da0916103cb565b7f70782220723d22347078222066696c6c3d22776869746522202f3e00000000008152601b01611104565b506000198114614bce565b91614de082615534565b90614dea81615534565b8451614df5906107f3565b918351614e0190610803565b948251614e0d90610803565b91614e1791615994565b949093614e23906107f3565b614e2c906109dd565b614e359061087c565b95614e3f906107f3565b614e48906109dd565b614e519061087c565b91614e5b906107f3565b614e64906109dd565b614e6d9061087c565b9160405197889760208901614ecc90602d907f203c67207374796c653d227472616e73666f726d3a7472616e736c617465283281527f3970782c20333834707829223e0000000000000000000000000000000000000060208201520190565b6c1e3932b1ba103bb4b23a341e9160991b8152600d01614eeb916103cb565b7f707822206865696768743d2232367078222072783d22387078222072793d223881527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e0000006020820152603d017f3c7465787420783d22313270782220793d22313770782220666f6e742d66616d81527f696c793d2227436f7572696572204e6577272c206d6f6e6f737061636522206660208201527f6f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747360408201527f70616e2066696c6c3d2272676261283235352c3235352c3235352c302e36292260608201527f3e49443a203c2f747370616e3e000000000000000000000000000000000000006080820152608d01614ffe916103cb565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f203c67207374796c653d227472616e73666f726d3a7472616e736c617465283281527f3970782c20343134707829223e000000000000000000000000000000000000006020820152602d016c1e3932b1ba103bb4b23a341e9160991b8152600d0161507d916103cb565b7f707822206865696768743d2232367078222072783d22387078222072793d223881527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e0000006020820152603d017f3c7465787420783d22313270782220793d22313770782220666f6e742d66616d81527f696c793d2227436f7572696572204e6577272c206d6f6e6f737061636522206660208201527f6f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747360408201527f70616e2066696c6c3d2272676261283235352c3235352c3235352c302e36292260608201527f3e4d696e205469636b3a203c2f747370616e3e000000000000000000000000006080820152609301615190916103cb565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f203c67207374796c653d227472616e73666f726d3a7472616e736c617465283281527f3970782c20343434707829223e000000000000000000000000000000000000006020820152602d016c1e3932b1ba103bb4b23a341e9160991b8152600d0161520f916103cb565b7f707822206865696768743d2232367078222072783d22387078222072793d223881527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e0000006020820152603d017f3c7465787420783d22313270782220793d22313770782220666f6e742d66616d81527f696c793d2227436f7572696572204e6577272c206d6f6e6f737061636522206660208201527f6f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747360408201527f70616e2066696c6c3d2272676261283235352c3235352c3235352c302e36292260608201527f3e4d6178205469636b3a203c2f747370616e3e000000000000000000000000006080820152609301615322916103cb565b7f3c2f746578743e3c2f673e3c67207374796c653d227472616e73666f726d3a7481527f72616e736c6174652832323670782c20343333707829223e000000000000000060208201526038017f3c726563742077696474683d223336707822206865696768743d22333670782281527f2072783d22387078222072793d22387078222066696c6c3d226e6f6e6522207360208201527f74726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e60408201526060017f3c70617468207374726f6b652d6c696e656361703d22726f756e642220643d2281527f4d38203943382e30303030342032322e393439342031362e323039392032382060208201527f3237203238222066696c6c3d226e6f6e6522207374726f6b653d2277686974656040820152631110179f60e11b60608201526064017f3c636972636c65207374796c653d227472616e73666f726d3a7472616e736c6181527f746533642800000000000000000000000000000000000000000000000000000060208201526025016154b4916103cb565b7f70782c200000000000000000000000000000000000000000000000000000000081526004016154e3916103cb565b7f70782c2030707829222063783d22307078222063793d223070782220723d223481527f7078222066696c6c3d227768697465222f3e3c2f673e000000000000000000006020820152603601611104565b610612602091604051615546816101da565b60008152908060020b600081128061558d575b505061556c62ffffff610dbf921661087c565b6040519483615584879551809284808901910161036a565b840101906103cb565b9092506001915060008313627fffff19849005600019121682166155f5575b627ffffe19831216166155e8575b600003610dbf61556c62ffffff6040516155d3816101f6565b60018152602d60f81b87820152939250615559565b6155f0610628565b6155ba565b6155fd610628565b6155ac565b60020b9060020b906000811281627fffff038313811516615630575b81627fffff190383121661064f570190565b615638610628565b61561e565b6040519061564a826101f6565b600282527f32340000000000000000000000000000000000000000000000000000000000006020830152565b60405190615683826101f6565b600282527f32370000000000000000000000000000000000000000000000000000000000006020830152565b604051906156bc826101f6565b600282527f32310000000000000000000000000000000000000000000000000000000000006020830152565b604051906156f5826101f6565b600282527f31380000000000000000000000000000000000000000000000000000000000006020830152565b6040519061572e826101f6565b600282527f32360000000000000000000000000000000000000000000000000000000000006020830152565b60405190615767826101f6565b600282527f31350000000000000000000000000000000000000000000000000000000000006020830152565b604051906157a0826101f6565b600282527f32350000000000000000000000000000000000000000000000000000000000006020830152565b604051906157d9826101f6565b600282527f31330000000000000000000000000000000000000000000000000000000000006020830152565b60405190615812826101f6565b600282527f32330000000000000000000000000000000000000000000000000000000000006020830152565b6040519061584b826101f6565b600282527f31310000000000000000000000000000000000000000000000000000000000006020830152565b60405190615884826101f6565b600282527f31300000000000000000000000000000000000000000000000000000000000006020830152565b604051906158bd826101f6565b600182527f38000000000000000000000000000000000000000000000000000000000000006020830152565b604051906158f6826101f6565b600582527f31342e32350000000000000000000000000000000000000000000000000000006020830152565b6040519061592f826101f6565b600482527f31302e35000000000000000000000000000000000000000000000000000000006020830152565b60405190615968826101f6565b600182527f37000000000000000000000000000000000000000000000000000000000000006020830152565b6159aa916159a191615602565b600290810b0590565b60020b6201e847198112156159cb57506159c26158b0565b9061061261595b565b620124f7198112156159e957506159e06158b0565b90610612615922565b6161a719811215615a0657506159fd6158b0565b906106126158e9565b61138719811215615a235750615a1a615877565b906106126156e8565b6000811215615a3e5750615a3561583e565b906106126156af565b611388811215615a5a5750615a516157cc565b90610612615805565b6161a8811215615a765750615a6d61575a565b90610612615793565b620124f8811215615a935750615a8a6156e8565b90610612615721565b6201e8481315615aae57615aa56156af565b90610612615676565b615aa561563d565b90615b736118cd615b6e615b789360405160208101918783526bffffffffffffffffffffffff199060601b16604082015260348152615af4816101b1565b5190209480600091615b078115156119ba565b600160801b811015615f6b575b5080680100000000000000006002921015615f5c575b640100000000811015615f4d575b62010000811015615f3e575b610100811015615f2f575b6010811015615f20575b6004811015615f12575b1015615f0757615f7a565b6117e4565b6106a0565b1115615eff5760405161061281610dbf615e3e615d90615cf5615c5a60208601608d907f3c67207374796c653d227472616e73666f726d3a7472616e736c61746528323281527f3670782c20333932707829223e3c726563742077696474683d2233367078222060208201527f6865696768743d2233367078222072783d22387078222072793d22387078222060408201527f66696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c32353560608201527f2c3235352c302e322922202f3e0000000000000000000000000000000000000060808201520190565b7f3c673e3c70617468207374796c653d227472616e73666f726d3a7472616e736c81527f617465283670782c367078292220643d224d313220304c31322e36353232203960208201527f2e35363538374c313820312e363037374c31332e373831392031302e3231383160408201527f4c32322e3339323320364c31342e343334312000000000000000000000000000606082015260730190565b7f31312e333437384c32342031324c31342e343334312031322e363532324c323281527f2e333932332031384c31332e373831392031332e373831394c31382032322e3360208201527f3932334c31322e363532322031342e343334314c31322032344c31312e33343760408201527f382031342e343334314c362032322e3339000000000000000000000000000000606082015260710190565b7f32334c31302e323138312031332e373831394c312e363037372031384c392e3581527f363538372031322e363532324c302031324c392e35363538372031312e33343760208201527f384c312e3630373720364c31302e323138312031302e323138314c3620312e3660408201527f3037374c31312e3334373820392e35363538374c313220305a222066696c6c3d606082015269113bb434ba329110179f60b11b6080820152608a0190565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d81527f227472616e73666f726d2220747970653d22726f74617465222066726f6d3d2260208201527f302031382031382220746f3d2233363020313820313822206475723d2231307360408201527f2220726570656174436f756e743d22696e646566696e697465222f3e3c2f673e60608201527f3c2f673e00000000000000000000000000000000000000000000000000000000608082015260840190565b610612610615565b60010160ff16615f7a565b91810160ff1691811c615b63565b600492830160ff16921c615b59565b600892830160ff16921c615b4f565b601092830160ff16921c615b44565b602092830160ff16921c615b38565b604092830160ff16921c615b2a565b60809250821c90506002615b14565b6101fe9060ff81168060ff0460021190151516615f99575b60011b1690565b615fa1610628565b615f9256fea164736f6c634300080f000a", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b6000803560e01c63c49917d71461002857600080fd5b60031960203682011261018e576004359067ffffffffffffffff90818311610196576101c09083360301126101925761005f610234565b9282600401358452610073602484016102a6565b6020850152610084604484016102a6565b6040850152606483013582811161018e576100a590600436918601016102ea565b6060850152608483013591821161018b5761018761017b856101706101a4876100d3368983016004016102ea565b60808501526100e460a48201610331565b60a08501526100f560c48201610331565b60c085015261010660e4820161033f565b60e0850152610118610104820161034c565b61010085015261012b610124820161034c565b61012085015261013e610144820161034c565b610140850152610151610164820161034c565b610160850152610164610184820161035a565b610180850152016102a6565b6101a08201526103e2565b6040519182918261039f565b0390f35b80fd5b5080fd5b8280fd5b8380fd5b50634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176101cd57604052565b6101d561019a565b604052565b6020810190811067ffffffffffffffff8211176101cd57604052565b6040810190811067ffffffffffffffff8211176101cd57604052565b90601f8019910116810190811067ffffffffffffffff8211176101cd57604052565b604051906101c0820182811067ffffffffffffffff8211176101cd57604052565b60405190610262826101b1565b565b60405190610140820182811067ffffffffffffffff8211176101cd57604052565b60405190610160820182811067ffffffffffffffff8211176101cd57604052565b35906001600160a01b03821682036102ba57565b600080fd5b60209067ffffffffffffffff81116102dd575b601f01601f19160190565b6102e561019a565b6102d2565b81601f820112156102ba57803590610301826102bf565b9261030f6040519485610212565b828452602083830101116102ba57816000926020809301838601378301015290565b359060ff821682036102ba57565b359081151582036102ba57565b35908160020b82036102ba57565b359062ffffff821682036102ba57565b918091926000905b82821061038a575011610383575050565b6000910152565b91508060209183015181860152018291610372565b604091602082526103bf815180928160208601526020868601910161036a565b601f01601f1916010190565b906103de6020928281519485920161036a565b0190565b6106126105136105d160206105bd6105946106069661051361056b61054261018084019361051361042761042161041c885162ffffff1690565b611f1d565b83610fb2565b956105136105196104e06104db6104d56104446060890151610b6a565b61047a60808a01918a61047461046f6101a06104608751610b6a565b9301516001600160a01b031690565b61228a565b91610c7a565b9689610490610489825161087c565b9351610b6a565b602061041c6104c561046f60406104b661046f6104cf968901516001600160a01b031690565b9601516001600160a01b031690565b945162ffffff1690565b93610dcd565b9661239b565b610a3a565b986040519e8f9d8e016009907f7b226e616d65223a22000000000000000000000000000000000000000000000081520190565b906103cb565b7f222c20226465736372697074696f6e223a220000000000000000000000000000815260120190565b7f222c2022696d616765223a2022000000000000000000000000000000000000008152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b03916104db601f1993848101835282610212565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d8301610513565b03908101835282610212565b90565b60405190610622826101da565b60008252565b50634e487b7160e01b600052601160045260246000fd5b600190600019811461064f570190565b6103de610628565b50634e487b7160e01b600052601260045260246000fd5b8015610693575b78010000000000000000000000000000000000000000000000000490565b61069b610657565b610675565b80156106ae575b6000190490565b6106b6610657565b6106a7565b81156106c5570490565b6106cd610657565b0490565b604051906106de826101f6565b6006825260203681840137565b906106f5826102bf565b6107026040519182610212565b8281528092610713601f19916102bf565b0190602036910137565b6001811061072d575b6000190190565b610735610628565b610726565b80602b10610749575b602b0390565b610751610628565b610743565b80600510610765575b60050390565b61076d610628565b61075f565b60058110610782575b6004190190565b61078a610628565b61077b565b6004811061079f575b6003190190565b6107a7610628565b610798565b8181106107b7570390565b6107bf610628565b0390565b600290600219811161064f570190565b602090602019811161064f570190565b600190600119811161064f570190565b600490600419811161064f570190565b600a90600a19811161064f570190565b8119811161064f570190565b50634e487b7160e01b600052603260045260246000fd5b602090805115610844570190565b6103de61081f565b602190805160011015610844570190565b90602091805182101561086f57010190565b61087761081f565b010190565b8015610906576000818181805b6108ee5750610897816106eb565b935b6108a35750505090565b6108ac9061071d565b90600a906001600160f81b03198282066030811981116108e1575b0160f81b16841a6108d8848761085d565b53049081610899565b6108e9610628565b6108c7565b91506108fb600a9161063f565b910480849291610889565b50604051610913816101f6565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b6040519061094d826101b1565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b7f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116001166109d0575b60021b90565b6109d8610628565b6109ca565b7f24924924924924924924924924924924924924924924924924924924924924928111600116610a0e575b60070290565b610a16610628565b610a08565b8060001904821181151516610a2e570290565b610a36610628565b0290565b805115610b4f57610a49610940565b610a65610a60610a5984516107c3565b6003900490565b61099f565b91610a77610a72846107d3565b6106eb565b92835280815182019060208501935b828210610afd57505050600390510680600114610ad257600214610aa8575090565b7f3d0000000000000000000000000000000000000000000000000000000000000090600019015290565b507f3d3d00000000000000000000000000000000000000000000000000000000000090600119015290565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190610a86565b50610612610615565b60ff6001911660ff811461064f570190565b906000805b835160ff821690811015610bd657610bad610ba0610b92601160f91b938861085d565b516001600160f81b03191690565b6001600160f81b03191690565b14610bc1575b610bbc90610b58565b610b6f565b90610bce610bbc91610b58565b919050610bb3565b505060ff80911680610be6575050565b610a72610bf4918551610813565b90600093845b815183821690811015610c715790610c33610b9283601160f91b610c27610ba0610b92610c51988a61085d565b14610c56575b8561085d565b96610c4b610c408261063f565b9860001a918761085d565b53610b58565b610bfa565b605c610c6b610c648c61063f565b9b8a61085d565b53610c2d565b50929450505050565b90610dbf61061292610513610db1609b966105136040519889977f54686973204e465420726570726573656e74732061206c69717569646974792060208a01527f706f736974696f6e20696e206120556e6973776170205633200000000000000060408a01528651610cf38160598c0160208b0161036a565b8901602d60f81b6059820152610d13825180936020605a8501910161036a565b017f20706f6f6c2e2000000000000000000000000000000000000000000000000000605a8201527f546865206f776e6572206f662074686973204e46542063616e206d6f6469667960618201527f206f722072656465656d2074686520706f736974696f6e2e5c6e0000000000006081820152016010907f5c6e506f6f6c20416464726573733a200000000000000000000000000000000081520190565b612e3760f11b815260020190565b03601f198101835282610212565b610ec8610ef1916105136042610dbf959698610612986040519a8b99602a610e268c7f20416464726573733a2000000000000000000000000000000000000000000000948560208301526020815194859301910161036a565b8b01612e3760f11b602a820152610e47825180936020602c8501910161036a565b0190602c820152610e6282518093602060368501910161036a565b017f5c6e46656520546965723a2000000000000000000000000000000000000000006036820152610e9c825180936020868501910161036a565b0101600c907f5c6e546f6b656e2049443a20000000000000000000000000000000000000000081520190565b7f5c6e5c6e00000000000000000000000000000000000000000000000000000000815260040190565b7fe29aa0efb88f20444953434c41494d45523a204475652064696c6967656e636581527f20697320696d7065726174697665207768656e20617373657373696e6720746860208201527f6973204e46542e204d616b65207375726520746f6b656e20616464726573736560408201527f73206d617463682074686520657870656374656420746f6b656e732c2061732060608201527f746f6b656e2073796d626f6c73206d617920626520696d6974617465642e00006080820152609e0190565b90610fc06060830151610b6a565b91610fce6080820151610b6a565b9060e0810190610fde8251151590565b90816111245761010081015160020b5b61016082019261103361102c611005865160020b90565b9260c0860194611016865160ff1690565b60a0880195611026875160ff1690565b926112a4565b9551151590565b928361111657610120015160020b935b5160020b915160ff16905160ff169161105b946112a4565b6040517f556e6973776170202d20000000000000000000000000000000000000000000006020820152948594919391602a8601611097916103cb565b6201016960ed1b81526003016110ac916103cb565b602f60f81b81526001016110bf916103cb565b6201016960ed1b81526003016110d4916103cb565b7f3c3e00000000000000000000000000000000000000000000000000000000000081526002015b611104916103cb565b03601f19810182526106129082610212565b610100015160020b93611043565b61012081015160020b610fee565b60020b8015611145575b620d89e7190590565b61114d610657565b61113c565b60020b8015611164575b620d89e80590565b61116c610657565b61115c565b60020b9060020b9081156111a1575b627fffff198114600019831416611195570590565b61119d610628565b0590565b6111a9610657565b611180565b60020b9060020b9060008213600082139083627fffff818104851183851616611225575b627fffff19936000831293908416868605841216611218575b8260008712950586129085161661120b575b058312911616610a2e570290565b611213610628565b6111fd565b611220610628565b6111eb565b61122d610628565b6111d2565b6040519061123f826101f6565b600382527f4d494e00000000000000000000000000000000000000000000000000000000006020830152565b60405190611278826101f6565b600382527f4d415800000000000000000000000000000000000000000000000000000000006020830152565b906112c06112ba826112b581611132565b6111ae565b60020b90565b908260020b9182146000146112ec575050505050156000146112e457610612611232565b61061261126b565b6112ba816112b56112fc93611152565b03611318575050506113105761061261126b565b610612611232565b9261132561061294611351565b9015611806576113406001600160a01b0361134c921661066e565b6001600160a01b031690565b611806565b60020b60008112156116e557806000035b620d89e881116116bb576001600160a01b0391600182161561169f5770ffffffffffffffffffffffffffffffffff6ffffcb933bd6fad37aa2d162d1a5940015b169160028116611683575b60048116611667575b6008811661164b575b6010811661162f575b60208116611613575b604081166115f7575b6080908181166115dc575b61010081166115c1575b61020081166115a6575b610400811661158b575b6108008116611570575b6110008116611555575b612000811661153a575b614000811661151f575b6180008116611504575b6201000081166114e9575b6202000081166114cf575b6204000081166114b5575b620800001661149a575b5060001261148c575b63ffffffff81166114835760ff60005b169060201c011690565b60ff6001611479565b611495906106a0565b611469565b6b048a170391f7dc42444e8fa26000929302901c9190611460565b6d2216e584f5fa1ea926041bedfe98909302811c92611456565b926e5d6af8dedb81196699c329225ee60402811c9261144b565b926f09aa508b5b7a84e1c677de54f3e99bc902811c92611440565b926f31be135f97d08fd981231505542fcfa602811c92611435565b926f70d869a156d2a1b890bb3df62baf32f702811c9261142b565b926fa9f746462d870fdf8a65dc1f90e061e502811c92611421565b926fd097f3bdfd2022b8845ad8f792aa582502811c92611417565b926fe7159475a2c29b7443b29c7fa6e889d902811c9261140d565b926ff3392b0822b70005940c7a398e4b70f302811c92611403565b926ff987a7253ac413176f2b074cf7815e5402811c926113f9565b926ffcbe86c7900a88aedcffc83b479aa3a402811c926113ef565b926ffe5dee046a99a2a811c461f1969c305302811c926113e5565b916fff2ea16466c96a3843ec78b326b528610260801c916113da565b916fff973b41fa98c081472e6896dfb254c00260801c916113d1565b916fffcb9843d60f6159c9db58835c9266440260801c916113c8565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c916113bf565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c916113b6565b916ffff97272373d413259a46990580e213a0260801c916113ad565b70ffffffffffffffffffffffffffffffffff600160801b6113a2565b60046040517f2bc80f3a000000000000000000000000000000000000000000000000000000008152fd5b80611362565b60ff166001811061072d576000190190565b60ff166004811061079f576003190190565b60ff1680602b1061074957602b0390565b60ff1660028110611733575b6001190190565b61173b610628565b61172c565b60405190610100820182811067ffffffffffffffff821117611791575b6040528160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b61179961019a565b61175d565b60ff168060ff036007116117b3575b60070190565b6117bb610628565b6117ad565b60ff6001911660fe811161064f570190565b60ff6002911660fd811161064f570190565b60ff168060ff036001116117f9575b60010190565b611801610628565b6117f3565b906118119291611e16565b906c0100000000000000000000000061182a83806119c1565b92109182156119ab5761183c90611a55565b915b82836000945b611997575061185661061293946116eb565b9161186383809493611d0f565b939093611983575b506118fe9192611879611740565b9384831561190a576118e46118e9916118dd6118d36118cd6118c860ff886118c260806118b06118ab6118f39d61170f565b61179e565b60ff1660208a01908152980160029052565b1661073a565b6107e3565b60ff1690565b60ff1660a08a0152565b5160ff1690565b6116eb565b60ff166040860152565b8352151560c0830152565b600060e0820152611b80565b50600960ff8216106119595761193e6118e4611928611948936116fd565b60ff1660208801908152600560808901526118dd565b60ff1660a0860152565b600460408501526118f3565b6118f3565b6119796119549161196d6020880160069052565b600560408801526116fd565b60ff166060860152565b6118fe925061199190610b58565b9161186b565b936119a3600a91610b58565b940480611844565b6119b490611a0b565b9161183e565b156102ba57565b6000198282099082810292838084109303928084039314611a02576801000000000000000091838311156102ba570990828211900360c01b910360401c1790565b50505060401c90565b620186a0906000198282099082810292838084109303928084039314611a4c57600160801b91838311156102ba570990828211900360801b910360801c1790565b50505060801c90565b72047bf19673df52e37f2410011d100000000000906000198282099082810292838084109303928084039314611a4c57600160801b91838311156102ba570990828211900360801b910360801c1790565b600160801b6000198183098260801b91828083109203918083039214611b17577003298b075b4b6a5240945790619b37fd4a90828211156102ba577f1f514b8ee5362595de309a65c03ce543f7e851e1625ea646b8fe88b81023b92d940990828211900360ff1b910360011c170290565b50507003298b075b4b6a5240945790619b37fd4a91500490565b7003298b075b4b6a5240945790619b37fd4a906000198282099082810292838084109303928084039314611a4c57600160801b91838311156102ba570990828211900360801b910360801c1790565b611b94610a726118cd602084015160ff1690565b90611ba260e0820151151590565b611cf4575b60c0810151611cd7575b611bc26118cd608083015160ff1690565b611bdb6118cd611bd660a085015160ff1690565b6117c0565b811015611bfd57806030611bf2611bf8938661085d565b5361063f565b611bc2565b50915b825115611cd257611c186118cd606085015160ff1690565b8015159081611cb8575b50611c8b575b611c53611c43611c3a8551600a900690565b60300160ff1690565b60f81b6001600160f81b03191690565b611c7d60408501611c65815160ff1690565b60ff600019820181169092529260001a92168461085d565b538251600a90048352611c00565b602e611cb260408501611c9f815160ff1690565b60ff60001982018116909252168461085d565b53611c28565b905060ff611cca604086015160ff1690565b161438611c22565b915090565b6030611ce283610836565b53602e611cee8361084c565b53611bb1565b6025611d09611d03845161071d565b8461085d565b53611ba7565b6000929160ff1660058111611d57575b50600a600481830611910490611d49575b620186a08114611d3e579190565b600a90049150600190565b611d52906107e3565b611d30565b80600560ff9210611d9d575b6004190116604d8111611d90575b600a0a908115611d83575b0438611d1f565b611d8b610657565b611d7c565b611d98610628565b611d71565b611da5610628565b611d63565b6000821282600160ff1b018212811516611ded575b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213166107b7570390565b611df5610628565b611dbf565b604d8111611e09575b600a0a90565b611e11610628565b611e03565b60ff9182169392909116611e32611e2d8286611daa565b611ec8565b9384151580611ebd575b15611eae57600192839290911115611e7f57611e6c906001600160a01b03611e6587851c611dfa565b9116610a1b565b931614611e7557565b9061061290611b31565b611e9d906001600160a01b03611e9687851c611dfa565b91166106bb565b931603610262579061061290611aa6565b50506001600160a01b03169150565b506012851115611e3c565b6000808212611ed5575090565b600160ff1b82146107b7570390565b60405190611ef1826101f6565b600282527f30250000000000000000000000000000000000000000000000000000000000006020830152565b62ffffff808216801561227f57611f40611f35610255565b62ffffff9094168452565b6020830160009283825260408501938085525b81611f61875162ffffff1690565b168015611ff95782611f74855160ff1690565b9160ff831615611fd757505050611f9e611f97611f92855160ff1690565b610b58565b60ff168452565b611fa8855161063f565b8552611fd2611fc9611fbd885162ffffff1690565b62ffffff600a91160490565b62ffffff168752565b611f53565b600a900616611fe7575b50611f9e565b611f97611ff391610b58565b38611fe1565b50945050919091612008611740565b8251909390600581106121e35750918394918493600461203784516120316118cd865160ff1690565b906107ac565b106121da5760ff845b1696879261204e8551610772565b61205f6118cd6118e4845160ff1690565b11156121625780866121066118cd6106129c6120d3846120ef6121569e60406120e76118cd61212b9f6120d36121259f6121209f6118cd916121109f6120dd6118cd6120d86118dd936120c560806120bb6118e4995160ff1690565b60ff169701968752565b6120d36118cd875160ff1690565b610813565b61071d565b60ff1660a08b0152565b60ff16910152565b6121006118cd611bd6895160ff1690565b90610813565b60ff1660208b0152565b6120316118cd8751925160ff1690565b611dfa565b906106bb565b8452600160e08501525190600482111561215b57506118cd61214c9161078f565b60ff166060830152565b611b80565b905061214c565b80855161216e90610772565b815160ff1661217c906116eb565b60ff16612188916107ac565b6121066118cd6106129c6120d3846120ef6121569e60406120e76118cd61212b9f6120d36121259f6121209f6118cd916121109f6120dd6118cd6120d86118dd936120c560806120bb6118e4996118dd565b60ff6001612040565b612156939161212561212061061298956122736122696122648b6118dd602061225a6118cd61221461212b9d610756565b61224461223a6118cd6120d86122346118cd60808c016118dd8160029052565b85610813565b60ff1660a0880152565b6121006118cd6122558c5160ff1690565b6117d2565b60ff169201918252565b611720565b60ff1660408b0152565b600160c08a0152612110565b505050610612611ee4565b6001600160a01b0316604051906122a0826101b1565b602a8252604036602084013760306122b783610836565b5360786122c38361084c565b536029905b600182116122db57610612915015612336565b806f181899199a1a9b1b9c1cb0b131b232b360811b600f6123169316601081101561231c575b1a61230c848661085d565b5360041c91612329565b906122c8565b61232461081f565b612301565b801561072d576000190190565b1561233d57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b602081019081516123b2906001600160a01b031690565b6123c4906001600160a01b0316612726565b90604081019182516123dc906001600160a01b031690565b6123ee906001600160a01b0316612726565b918451612401906001600160a01b031690565b612413906001600160a01b031661279f565b918451612426906001600160a01b031690565b612438906001600160a01b031661279f565b8651835161244e916001600160a01b03166127f9565b612457906126b4565b8651845161246d916001600160a01b03166127f9565b612476906126fb565b8851855161248c916001600160a01b031661280e565b612495906126b4565b9188516124a8906001600160a01b031690565b86516124bc916001600160a01b031661280e565b6124c5906126fb565b938a516124d8906001600160a01b031690565b87516124ec916001600160a01b031661281f565b6124f5906126b4565b978a51612508906001600160a01b031690565b885161251c916001600160a01b031661281f565b612525906126fb565b9961252e610264565b978852602088015260408701526060860152608085015260a084015260c083015260e08201526101009283820152610120938482015261256d9061297a565b94516001600160a01b03166125819061228a565b93516001600160a01b03166125959061228a565b926101a08201516125ac906001600160a01b031690565b9260608301519060808401516101808501516125ca9062ffffff1690565b6125d390611f1d565b8583015160020b90858701516125e99060020b90565b926101608801516125fa9060020b90565b95610140998a8a015161260d9060020b90565b61261890878761268b565b99519b612623610285565b9d8e5260208e01526001600160a01b031660408d015260608c015260808b015260a08a015260020b60c089015260020b60e0880152860190612667919060020b9052565b840190612676919060000b9052565b82015261268290612899565b61061291612830565b600292830b920b8212156126a157505060001990565b60020b12156126af57600190565b600090565b601060ff610612926101029080600019048211811515166126ee575b0204811981116126e1575b0161087c565b6126e9610628565b6126db565b6126f6610628565b6126d0565b606460ff610612926101809080600019048211811515166126ee570204811981116126e1570161087c565b60881c6127316106d1565b90815190815b61274057505090565b806f181899199a1a9b1b9c1cb0b131b232b360811b600f61277e93166010811015612792575b60018510612785575b1a61230c60001985018661085d565b9081612737565b61278d610628565b61276f565b61279a61081f565b612766565b6127a76106d1565b90815190815b6127b657505090565b806f181899199a1a9b1b9c1cb0b131b232b360811b600f6127f2931660108110156127925760018510612785571a61230c60001985018661085d565b90816127ad565b60ff918261280a9260101c16610a1b565b0690565b60ff918261280a9260201c16610a1b565b60ff918261280a9260301c16610a1b565b602661061291604051938161284f86935180926020808701910161036a565b8201612864825180936020808501910161036a565b017f3c2f7376673e00000000000000000000000000000000000000000000000000006020820152036006810184520182610212565b61061261051391610dbf8151916105136128d760208301516128c8606085019687516080870193845192613b6e565b9551905160a0850151916141a8565b9161051360c082016105136129696128f0835160020b90565b94612963604061295261292560e085019961290c8b5160020b90565b61010087015160020b9061012088015160000b926144b5565b9661014085019961294c61294461293c8d5161087c565b935160020b90565b915160020b90565b91614dd6565b97519201516001600160a01b031690565b90615ab6565b956040519a8b9960208b01906103cb565b805160409081519182602092838201612a4f906081907f3c7376672077696474683d2732393027206865696768743d273530302720766981527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c726563742077696460408201527f74683d27323930707827206865696768743d273530307078272066696c6c3d2760608201527f230000000000000000000000000000000000000000000000000000000000000060808201520190565b612a58916103cb565b6813979f1e17b9bb339f60b91b81526009010392601f19938481018252612a7f9082610212565b612a8890610a3a565b93608081015160a082015190848301518451928392878401612b26906063907f3c7376672077696474683d2732393027206865696768743d273530302720766981527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063604082015262783d2760e81b60608201520190565b612b2f916103cb565b65272063793d2760d01b8152600601612b47916103cb565b7f2720723d273132307078272066696c6c3d2723000000000000000000000000008152601301612b76916103cb565b6813979f1e17b9bb339f60b91b8152600901038581018252612b989082610212565b612ba190610a3a565b60c082015160e08301518484015185517f3c7376672077696474683d2732393027206865696768743d27353030272076698882019081527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063604082015262783d2760e81b60608201529093849391606301612c41916103cb565b65272063793d2760d01b8152600601612c59916103cb565b7f2720723d273132307078272066696c6c3d2723000000000000000000000000008152601301612c88916103cb565b6813979f1e17b9bb339f60b91b8152600901038681018252612caa9082610212565b612cb390610a3a565b906101008301516101208401519060608501518651928392898401612d54906063907f3c7376672077696474683d2732393027206865696768743d273530302720766981527f6577426f783d2730203020323930203530302720786d6c6e733d27687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063604082015262783d2760e81b60608201520190565b612d5d916103cb565b65272063793d2760d01b8152600601612d75916103cb565b7f2720723d273130307078272066696c6c3d2723000000000000000000000000008152601301612da4916103cb565b6813979f1e17b9bb339f60b91b8152600901038781018252612dc69082610212565b612dcf90610a3a565b925193517f3c7376672077696474683d2232393022206865696768743d22353030222076699581019586527f6577426f783d2230203020323930203530302220786d6c6e733d22687474703a60208701527f2f2f7777772e77332e6f72672f323030302f737667220000000000000000000060408701529687956056017f20786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f81527f313939392f786c696e6b273e00000000000000000000000000000000000000006020820152602c017f3c646566733e000000000000000000000000000000000000000000000000000081526006017f3c66696c7465722069643d226631223e3c6665496d61676520726573756c743d81527f2270302220786c696e6b3a687265663d22646174613a696d6167652f7376672b60208201527f786d6c3b6261736536342c0000000000000000000000000000000000000000006040820152604b01612f39916103cb565b7f222f3e3c6665496d61676520726573756c743d2270312220786c696e6b3a687281527f65663d22646174613a696d6167652f7376672b786d6c3b6261736536342c00006020820152603e01612f8e916103cb565b7f222f3e3c6665496d61676520726573756c743d2270322220786c696e6b3a687281527f65663d22646174613a696d6167652f7376672b786d6c3b6261736536342c00006020820152603e01612fe3916103cb565b631110179f60e11b81526004017f3c6665496d61676520726573756c743d2270332220786c696e6b3a687265663d81527f22646174613a696d6167652f7376672b786d6c3b6261736536342c00000000006020820152603b01613045916103cb565b7f22202f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e3d2281527f70302220696e323d22703122202f3e3c6665426c656e64206d6f64653d22657860208201527f636c7573696f6e2220696e323d22703222202f3e3c6665426c656e64206d6f6460408201527f653d226f7665726c61792220696e323d2270332220726573756c743d22626c6560608201527f6e644f757422202f3e3c6665476175737369616e426c7572200000000000000060808201526099017f696e3d22626c656e644f75742220737464446576696174696f6e3d223432222081527f2f3e3c2f66696c7465723e203c636c6970506174682069643d22636f726e657260208201527f73223e3c726563742077696474683d2232393022206865696768743d2235303060408201527f222072783d223432222072793d22343222202f3e3c2f636c6970506174683e006060820152607f017f3c706174682069643d22746578742d706174682d612220643d224d343020313281527f204832353020413238203238203020302031203237382034302056343630204160208201527f323820323820302030203120323530203438382048343020413238203238203060408201527f203020312031322034363020563430204132382032382030203020312034302060608201527f3132207a22202f3e00000000000000000000000000000000000000000000000060808201526088017f3c706174682069643d226d696e696d61702220643d224d32333420343434433281527f3334203435372e393439203234322e323120343633203235332034363322202f6020820152601f60f91b60408201526041017f3c66696c7465722069643d22746f702d726567696f6e2d626c7572223e3c666581527f476175737369616e426c757220696e3d22536f7572636547726170686963222060208201527f737464446576696174696f6e3d22323422202f3e3c2f66696c7465723e0000006040820152605d017f3c6c696e6561724772616469656e742069643d22677261642d7570222078313d81527f2231222078323d2230222079313d2231222079323d2230223e3c73746f70206f60208201527f66667365743d22302e30222073746f702d636f6c6f723d22776869746522207360408201527f746f702d6f7061636974793d223122202f3e000000000000000000000000000060608201526072017f3c73746f70206f66667365743d222e39222073746f702d636f6c6f723d22776881527f697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e65617260208201527f4772616469656e743e000000000000000000000000000000000000000000000060408201526049017f3c6c696e6561724772616469656e742069643d22677261642d646f776e22207881527f313d2230222078323d2231222079313d2230222079323d2231223e3c73746f7060208201527f206f66667365743d22302e30222073746f702d636f6c6f723d2277686974652260408201527f2073746f702d6f7061636974793d223122202f3e3c73746f70206f666673657460608201527f3d22302e39222073746f702d636f6c6f723d227768697465222073746f702d6f60808201527f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e000060a082015260be017f3c6d61736b2069643d22666164652d757022206d61736b436f6e74656e74556e81527f6974733d226f626a656374426f756e64696e67426f78223e3c7265637420776960208201527f6474683d223122206865696768743d2231222066696c6c3d2275726c2823677260408201527f61642d75702922202f3e3c2f6d61736b3e00000000000000000000000000000060608201526071017f3c6d61736b2069643d22666164652d646f776e22206d61736b436f6e74656e7481527f556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742060208201527f77696474683d223122206865696768743d2231222066696c6c3d2275726c282360408201527f677261642d646f776e2922202f3e3c2f6d61736b3e000000000000000000000060608201526075017f3c6d61736b2069643d226e6f6e6522206d61736b436f6e74656e74556e69747381527f3d226f626a656374426f756e64696e67426f78223e3c7265637420776964746860208201527f3d223122206865696768743d2231222066696c6c3d22776869746522202f3e3c60408201527f2f6d61736b3e000000000000000000000000000000000000000000000000000060608201526066017f3c6c696e6561724772616469656e742069643d22677261642d73796d626f6c2281527f3e3c73746f70206f66667365743d22302e37222073746f702d636f6c6f723d2260208201527f7768697465222073746f702d6f7061636974793d223122202f3e3c73746f702060408201527f6f66667365743d222e3935222073746f702d636f6c6f723d227768697465222060608201527f73746f702d6f7061636974793d223022202f3e3c2f6c696e656172477261646960808201527f656e743e0000000000000000000000000000000000000000000000000000000060a082015260a4017f3c6d61736b2069643d22666164652d73796d626f6c22206d61736b436f6e746581527f6e74556e6974733d227573657253706163654f6e557365223e3c72656374207760208201527f696474683d22323930707822206865696768743d223230307078222066696c6c60408201527f3d2275726c2823677261642d73796d626f6c2922202f3e3c2f6d61736b3e3c2f60608201527f646566733e00000000000000000000000000000000000000000000000000000060808201526085017f3c6720636c69702d706174683d2275726c2823636f726e65727329223e0000008152601d017f3c726563742066696c6c3d2200000000000000000000000000000000000000008152600c016138ce916103cb565b7f2220783d223070782220793d22307078222077696474683d223239307078222081527f6865696768743d22353030707822202f3e00000000000000000000000000000060208201526031017f3c72656374207374796c653d2266696c7465723a2075726c282366312922207881527f3d223070782220793d22307078222077696474683d223239307078222068656960208201527f6768743d22353030707822202f3e0000000000000000000000000000000000006040820152604e017f203c67207374796c653d2266696c7465723a75726c2823746f702d726567696f81527f6e2d626c7572293b207472616e73666f726d3a7363616c6528312e35293b207460208201527f72616e73666f726d2d6f726967696e3a63656e74657220746f703b223e0000006040820152605d017f3c726563742066696c6c3d226e6f6e652220783d223070782220793d2230707881527f222077696474683d22323930707822206865696768743d22353030707822202f6020820152601f60f91b60408201526041017f3c656c6c697073652063783d22353025222063793d22307078222072783d223181527f38307078222072793d223132307078222066696c6c3d222330303022206f706160208201527f636974793d22302e383522202f3e3c2f673e000000000000000000000000000060408201526052017f3c7265637420783d22302220793d2230222077696474683d223239302220686581527f696768743d22353030222072783d223432222072793d223432222066696c6c3d60208201527f227267626128302c302c302c302922207374726f6b653d22726762612832353560408201527f2c3235352c3235352c302e322922202f3e3c2f673e000000000000000000000060608201526075010390810182526106129082610212565b604080517f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208201527f656564223e000000000000000000000000000000000000000000000000000000918101919091527f3c74657874506174682073746172744f66667365743d222d313030252220666960458201527f6c6c3d2277686974652220666f6e742d66616d696c793d2227436f757269657260658201527f204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231307060858201527f782220786c696e6b3a687265663d2223746578742d706174682d61223e00000060a582015293849392613c6960c28601826103cb565b64010714051160dd1b8152600501613c8190836103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d223330732220726560408201527f70656174436f756e743d22696e646566696e69746522202f3e0000000000000060608201526079017f3c2f74657874506174683e203c74657874506174682073746172744f6666736581527f743d223025222066696c6c3d2277686974652220666f6e742d66616d696c793d60208201527f2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d60408201527f73697a653d22313070782220786c696e6b3a687265663d2223746578742d706160608201527f74682d61223e00000000000000000000000000000000000000000000000000006080820152608601613de0916103cb565b64010714051160dd1b8152600501613df7916103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d223330732220726560408201527f70656174436f756e743d22696e646566696e69746522202f3e203c2f7465787460608201527f506174683e00000000000000000000000000000000000000000000000000000060808201526085017f3c74657874506174682073746172744f66667365743d22353025222066696c6c81527f3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e60208201527f6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782260408201527f20786c696e6b3a687265663d2223746578742d706174682d61223e00000000006060820152607b01613f5790826103cb565b64010714051160dd1b8152600501613f6f90836103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d22333073220000006040820152605d017f20726570656174436f756e743d22696e646566696e69746522202f3e3c2f746581527f7874506174683e3c74657874506174682073746172744f66667365743d222d3560208201527f3025222066696c6c3d2277686974652220666f6e742d66616d696c793d22274360408201527f6f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a60608201527f653d22313070782220786c696e6b3a687265663d2223746578742d706174682d60808201527f61223e000000000000000000000000000000000000000000000000000000000060a082015260a3016140ce916103cb565b64010714051160dd1b81526005016140e5916103cb565b7f203c616e696d6174652061646469746976653d2273756d22206174747269627581527f74654e616d653d2273746172744f6666736574222066726f6d3d22302522207460208201527f6f3d22313030252220626567696e3d22307322206475723d223330732220726560408201527f70656174436f756e743d22696e646566696e69746522202f3e3c2f746578745060608201527f6174683e3c2f746578743e0000000000000000000000000000000000000000006080820152608b01611104565b610dbf6143a86143916142e5956105136142f66106129761051360ed806040519c8d809c7f3c67206d61736b3d2275726c2823666164652d73796d626f6c29223e3c72656360208301527f742066696c6c3d226e6f6e652220783d223070782220793d223070782220776960408301527f6474683d22323930707822206865696768743d22323030707822202f3e203c7460608301527f65787420793d22373070782220783d2233327078222066696c6c3d227768697460808301527f652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d60a08301527f6f6e6f73706163652220666f6e742d7765696768743d223230302220666f6e7460c08301527f2d73697a653d2233367078223e0000000000000000000000000000000000000060e08301526020815194859301910161036a565b8a0101600190602f60f81b81520190565b7f3c2f746578743e3c7465787420793d2231313570782220783d2233327078222081527f66696c6c3d2277686974652220666f6e742d66616d696c793d2227436f75726960208201527f6572204e6577272c206d6f6e6f73706163652220666f6e742d7765696768743d60408201527f223230302220666f6e742d73697a653d2233367078223e000000000000000000606082015260770190565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b0190565b7f3c7265637420783d2231362220793d223136222077696474683d22323538222081527f6865696768743d22343638222072783d223236222072793d223236222066696c60208201527f6c3d227267626128302c302c302c302922207374726f6b653d2272676261283260408201527f35352c3235352c3235352c302e322922202f3e00000000000000000000000000606082015260730190565b60405190614450826101f6565b600a82527f23666164652d646f776e000000000000000000000000000000000000000000006020830152565b60405190614489826101f6565b600882527f23666164652d75700000000000000000000000000000000000000000000000006020830152565b916144db918460000b6000600182146000146147db5750506144d561447c565b93614a26565b916144e590614b9e565b6040517f3c67206d61736b3d2275726c2800000000000000000000000000000000000000602082015292839261451e602d8501826103cb565b61149160f11b81526002017f207374796c653d227472616e73666f726d3a7472616e736c617465283732707881527f2c313839707829223e3c7265637420783d222d313670782220793d222d31367060208201527f78222077696474683d22313830707822206865696768743d223138307078222060408201527f66696c6c3d226e6f6e6522202f3e3c7061746820643d2200000000000000000060608201526077016145cb90836103cb565b7f22207374726f6b653d227267626128302c302c302c302e332922207374726f6b81527f652d77696474683d2233327078222066696c6c3d226e6f6e6522207374726f6b60208201527f652d6c696e656361703d22726f756e6422202f3e00000000000000000000000060408201526054017f3c2f673e3c67206d61736b3d2275726c28000000000000000000000000000000815260110161466c916103cb565b61149160f11b81526002017f207374796c653d227472616e73666f726d3a7472616e736c617465283732707881527f2c313839707829223e000000000000000000000000000000000000000000000060208201526029017f3c7265637420783d222d313670782220793d222d31367078222077696474683d81527f22313830707822206865696768743d223138307078222066696c6c3d226e6f6e60208201527f6522202f3e00000000000000000000000000000000000000000000000000000060408201526045017f3c7061746820643d2200000000000000000000000000000000000000000000008152600901614764916103cb565b7f22207374726f6b653d2272676261283235352c3235352c3235352c312922206681527f696c6c3d226e6f6e6522207374726f6b652d6c696e656361703d22726f756e6460208201527f22202f3e3c2f673e00000000000000000000000000000000000000000000000060408201526048016110fb565b50196147e9576144d5614443565b6040516147f5816101f6565b600581527f236e6f6e6500000000000000000000000000000000000000000000000000000060208201526144d5565b600291820b910b600082128015627fffff198401831216614851575b82627fffff018213166107b7570390565b614859610628565b614840565b6040519061486b826101f6565b601882527f4d312031433120393720343920313435203134352031343500000000000000006020830152565b604051906148a4826101f6565b601a82527f4d31203143312038392035372e352031343520313435203134350000000000006020830152565b604051906148dd826101f6565b601882527f4d312031433920383120363520313337203134352031343500000000000000006020830152565b60405190614916826101f6565b601982527f4d312031433137203733203733203132392031343520313435000000000000006020830152565b6040519061494f826101f6565b601982527f4d312031433235203635203831203132312031343520313435000000000000006020830152565b60405190614988826101f6565b601982527f4d312031433333203537203839203131332031343520313435000000000000006020830152565b604051906149c1826101f6565b601982527f4d312031433333203439203937203131332031343520313435000000000000006020830152565b604051906149fa826101f6565b601a82527f4d312031433431203431203130352031303520313435203134350000000000006020830152565b614a3490614a399392614824565b611171565b60020b60048113614a4d57506106126149ed565b60088113614a5e57506106126149b4565b60108113614a6f575061061261497b565b60208113614a805750610612614942565b60408113614a915750610612614909565b60808113614aa257506106126148d0565b61010012614ab257610612614897565b61061261485e565b60405190614ac7826101f6565b600282527f37330000000000000000000000000000000000000000000000000000000000006020830152565b60405190614b00826101f6565b600382527f31393000000000000000000000000000000000000000000000000000000000006020830152565b60405190614b39826101f6565b600382527f32313700000000000000000000000000000000000000000000000000000000006020830152565b60405190614b72826101f6565b600382527f33333400000000000000000000000000000000000000000000000000000000006020830152565b614ba6614aba565b614bae614af3565b91614bb7614b2c565b614bbf614b65565b9160000b600181148015614dcb575b15614cff5761061293610513614c42602095610513614c56610dbf97610513614c426105139d614ca59a600019149687600014614cf8578a5b8815614cf15782955b8915614ce95750975b15614ce15750985b6040519e8f9d8e01600c906b1e31b4b931b6329031bc1e9160a11b81520190565b67383c111031bc9e9160c11b815260080190565b7f70782220723d22347078222066696c6c3d22776869746522202f3e3c6369726381527f6c652063783d2200000000000000000000000000000000000000000000000000602082015260270190565b7f70782220723d2232347078222066696c6c3d226e6f6e6522207374726f6b653d815269113bb434ba329110179f60b11b6020820152602a0190565b905098614c21565b905097614c19565b8195614c10565b849a614c07565b506040516b1e31b4b931b6329031bc1e9160a11b6020820152938493602c8501614d28916103cb565b67383c111031bc9e9160c11b8152600801614d42916103cb565b7f70782220723d22347078222066696c6c3d22776869746522202f3e00000000008152601b016b1e31b4b931b6329031bc1e9160a11b8152600c01614d86916103cb565b67383c111031bc9e9160c11b8152600801614da0916103cb565b7f70782220723d22347078222066696c6c3d22776869746522202f3e00000000008152601b01611104565b506000198114614bce565b91614de082615534565b90614dea81615534565b8451614df5906107f3565b918351614e0190610803565b948251614e0d90610803565b91614e1791615994565b949093614e23906107f3565b614e2c906109dd565b614e359061087c565b95614e3f906107f3565b614e48906109dd565b614e519061087c565b91614e5b906107f3565b614e64906109dd565b614e6d9061087c565b9160405197889760208901614ecc90602d907f203c67207374796c653d227472616e73666f726d3a7472616e736c617465283281527f3970782c20333834707829223e0000000000000000000000000000000000000060208201520190565b6c1e3932b1ba103bb4b23a341e9160991b8152600d01614eeb916103cb565b7f707822206865696768743d2232367078222072783d22387078222072793d223881527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e0000006020820152603d017f3c7465787420783d22313270782220793d22313770782220666f6e742d66616d81527f696c793d2227436f7572696572204e6577272c206d6f6e6f737061636522206660208201527f6f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747360408201527f70616e2066696c6c3d2272676261283235352c3235352c3235352c302e36292260608201527f3e49443a203c2f747370616e3e000000000000000000000000000000000000006080820152608d01614ffe916103cb565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f203c67207374796c653d227472616e73666f726d3a7472616e736c617465283281527f3970782c20343134707829223e000000000000000000000000000000000000006020820152602d016c1e3932b1ba103bb4b23a341e9160991b8152600d0161507d916103cb565b7f707822206865696768743d2232367078222072783d22387078222072793d223881527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e0000006020820152603d017f3c7465787420783d22313270782220793d22313770782220666f6e742d66616d81527f696c793d2227436f7572696572204e6577272c206d6f6e6f737061636522206660208201527f6f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747360408201527f70616e2066696c6c3d2272676261283235352c3235352c3235352c302e36292260608201527f3e4d696e205469636b3a203c2f747370616e3e000000000000000000000000006080820152609301615190916103cb565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f203c67207374796c653d227472616e73666f726d3a7472616e736c617465283281527f3970782c20343434707829223e000000000000000000000000000000000000006020820152602d016c1e3932b1ba103bb4b23a341e9160991b8152600d0161520f916103cb565b7f707822206865696768743d2232367078222072783d22387078222072793d223881527f7078222066696c6c3d227267626128302c302c302c302e362922202f3e0000006020820152603d017f3c7465787420783d22313270782220793d22313770782220666f6e742d66616d81527f696c793d2227436f7572696572204e6577272c206d6f6e6f737061636522206660208201527f6f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747360408201527f70616e2066696c6c3d2272676261283235352c3235352c3235352c302e36292260608201527f3e4d6178205469636b3a203c2f747370616e3e000000000000000000000000006080820152609301615322916103cb565b7f3c2f746578743e3c2f673e3c67207374796c653d227472616e73666f726d3a7481527f72616e736c6174652832323670782c20343333707829223e000000000000000060208201526038017f3c726563742077696474683d223336707822206865696768743d22333670782281527f2072783d22387078222072793d22387078222066696c6c3d226e6f6e6522207360208201527f74726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e60408201526060017f3c70617468207374726f6b652d6c696e656361703d22726f756e642220643d2281527f4d38203943382e30303030342032322e393439342031362e323039392032382060208201527f3237203238222066696c6c3d226e6f6e6522207374726f6b653d2277686974656040820152631110179f60e11b60608201526064017f3c636972636c65207374796c653d227472616e73666f726d3a7472616e736c6181527f746533642800000000000000000000000000000000000000000000000000000060208201526025016154b4916103cb565b7f70782c200000000000000000000000000000000000000000000000000000000081526004016154e3916103cb565b7f70782c2030707829222063783d22307078222063793d223070782220723d223481527f7078222066696c6c3d227768697465222f3e3c2f673e000000000000000000006020820152603601611104565b610612602091604051615546816101da565b60008152908060020b600081128061558d575b505061556c62ffffff610dbf921661087c565b6040519483615584879551809284808901910161036a565b840101906103cb565b9092506001915060008313627fffff19849005600019121682166155f5575b627ffffe19831216166155e8575b600003610dbf61556c62ffffff6040516155d3816101f6565b60018152602d60f81b87820152939250615559565b6155f0610628565b6155ba565b6155fd610628565b6155ac565b60020b9060020b906000811281627fffff038313811516615630575b81627fffff190383121661064f570190565b615638610628565b61561e565b6040519061564a826101f6565b600282527f32340000000000000000000000000000000000000000000000000000000000006020830152565b60405190615683826101f6565b600282527f32370000000000000000000000000000000000000000000000000000000000006020830152565b604051906156bc826101f6565b600282527f32310000000000000000000000000000000000000000000000000000000000006020830152565b604051906156f5826101f6565b600282527f31380000000000000000000000000000000000000000000000000000000000006020830152565b6040519061572e826101f6565b600282527f32360000000000000000000000000000000000000000000000000000000000006020830152565b60405190615767826101f6565b600282527f31350000000000000000000000000000000000000000000000000000000000006020830152565b604051906157a0826101f6565b600282527f32350000000000000000000000000000000000000000000000000000000000006020830152565b604051906157d9826101f6565b600282527f31330000000000000000000000000000000000000000000000000000000000006020830152565b60405190615812826101f6565b600282527f32330000000000000000000000000000000000000000000000000000000000006020830152565b6040519061584b826101f6565b600282527f31310000000000000000000000000000000000000000000000000000000000006020830152565b60405190615884826101f6565b600282527f31300000000000000000000000000000000000000000000000000000000000006020830152565b604051906158bd826101f6565b600182527f38000000000000000000000000000000000000000000000000000000000000006020830152565b604051906158f6826101f6565b600582527f31342e32350000000000000000000000000000000000000000000000000000006020830152565b6040519061592f826101f6565b600482527f31302e35000000000000000000000000000000000000000000000000000000006020830152565b60405190615968826101f6565b600182527f37000000000000000000000000000000000000000000000000000000000000006020830152565b6159aa916159a191615602565b600290810b0590565b60020b6201e847198112156159cb57506159c26158b0565b9061061261595b565b620124f7198112156159e957506159e06158b0565b90610612615922565b6161a719811215615a0657506159fd6158b0565b906106126158e9565b61138719811215615a235750615a1a615877565b906106126156e8565b6000811215615a3e5750615a3561583e565b906106126156af565b611388811215615a5a5750615a516157cc565b90610612615805565b6161a8811215615a765750615a6d61575a565b90610612615793565b620124f8811215615a935750615a8a6156e8565b90610612615721565b6201e8481315615aae57615aa56156af565b90610612615676565b615aa561563d565b90615b736118cd615b6e615b789360405160208101918783526bffffffffffffffffffffffff199060601b16604082015260348152615af4816101b1565b5190209480600091615b078115156119ba565b600160801b811015615f6b575b5080680100000000000000006002921015615f5c575b640100000000811015615f4d575b62010000811015615f3e575b610100811015615f2f575b6010811015615f20575b6004811015615f12575b1015615f0757615f7a565b6117e4565b6106a0565b1115615eff5760405161061281610dbf615e3e615d90615cf5615c5a60208601608d907f3c67207374796c653d227472616e73666f726d3a7472616e736c61746528323281527f3670782c20333932707829223e3c726563742077696474683d2233367078222060208201527f6865696768743d2233367078222072783d22387078222072793d22387078222060408201527f66696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c32353560608201527f2c3235352c302e322922202f3e0000000000000000000000000000000000000060808201520190565b7f3c673e3c70617468207374796c653d227472616e73666f726d3a7472616e736c81527f617465283670782c367078292220643d224d313220304c31322e36353232203960208201527f2e35363538374c313820312e363037374c31332e373831392031302e3231383160408201527f4c32322e3339323320364c31342e343334312000000000000000000000000000606082015260730190565b7f31312e333437384c32342031324c31342e343334312031322e363532324c323281527f2e333932332031384c31332e373831392031332e373831394c31382032322e3360208201527f3932334c31322e363532322031342e343334314c31322032344c31312e33343760408201527f382031342e343334314c362032322e3339000000000000000000000000000000606082015260710190565b7f32334c31302e323138312031332e373831394c312e363037372031384c392e3581527f363538372031322e363532324c302031324c392e35363538372031312e33343760208201527f384c312e3630373720364c31302e323138312031302e323138314c3620312e3660408201527f3037374c31312e3334373820392e35363538374c313220305a222066696c6c3d606082015269113bb434ba329110179f60b11b6080820152608a0190565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d81527f227472616e73666f726d2220747970653d22726f74617465222066726f6d3d2260208201527f302031382031382220746f3d2233363020313820313822206475723d2231307360408201527f2220726570656174436f756e743d22696e646566696e697465222f3e3c2f673e60608201527f3c2f673e00000000000000000000000000000000000000000000000000000000608082015260840190565b610612610615565b60010160ff16615f7a565b91810160ff1691811c615b63565b600492830160ff16921c615b59565b600892830160ff16921c615b4f565b601092830160ff16921c615b44565b602092830160ff16921c615b38565b604092830160ff16921c615b2a565b60809250821c90506002615b14565b6101fe9060ff81168060ff0460021190151516615f99575b60011b1690565b615fa1610628565b615f9256fea164736f6c634300080f000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/artifacts-apeswap/dex/contracts/NonfungiblePositionManager.json b/src/artifacts-apeswap/dex/contracts/NonfungiblePositionManager.json new file mode 100644 index 0000000..7038247 --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/NonfungiblePositionManager.json @@ -0,0 +1,1235 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NonfungiblePositionManager", + "sourceName": "contracts/NonfungiblePositionManager.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH9", + "type": "address" + }, + { + "internalType": "address", + "name": "_tokenDescriptor_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "T", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Collect", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "DecreaseLiquidity", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "IncreaseLiquidity", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH9", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint128", + "name": "amount0Max", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Max", + "type": "uint128" + } + ], + "internalType": "struct INonfungiblePositionManager.CollectParams", + "name": "params", + "type": "tuple" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + } + ], + "name": "createAndInitializePoolIfNecessary", + "outputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct INonfungiblePositionManager.DecreaseLiquidityParams", + "name": "params", + "type": "tuple" + } + ], + "name": "decreaseLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount0Desired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Desired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct INonfungiblePositionManager.IncreaseLiquidityParams", + "name": "params", + "type": "tuple" + } + ], + "name": "increaseLiquidity", + "outputs": [ + { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint256", + "name": "amount0Desired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Desired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct INonfungiblePositionManager.MintParams", + "name": "params", + "type": "tuple" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "positions", + "outputs": [ + { + "internalType": "uint96", + "name": "nonce", + "type": "uint96" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside0LastX128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside1LastX128", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "tokensOwed0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "tokensOwed1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "refundETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitAllowed", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitAllowedIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount0Owed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Owed", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "uniswapV3MintCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x610120604052760100000000000000000000000000000000000000000001600d553480156200002d57600080fd5b50604051620061b7380380620061b783398101604081905262000050916200013f565b82826040518060400160405280601b81526020017f556e697377617020563320506f736974696f6e73204e46542d563100000000008152506040518060400160405280600a815260200169554e492d56332d504f5360b01b815250604051806040016040528060018152602001603160f81b81525082828160009081620000d891906200022e565b506001620000e782826200022e565b5050835160209485012060805250805192019190912060a052506001600160a01b0391821660c052811660e052166101005250620002fa9050565b80516001600160a01b03811681146200013a57600080fd5b919050565b6000806000606084860312156200015557600080fd5b620001608462000122565b9250620001706020850162000122565b9150620001806040850162000122565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b457607f821691505b602082108103620001d557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022957600081815260208120601f850160051c81016020861015620002045750805b601f850160051c820191505b81811015620002255782815560010162000210565b5050505b505050565b81516001600160401b038111156200024a576200024a62000189565b62000262816200025b84546200019f565b84620001db565b602080601f8311600181146200029a5760008415620002815750858301515b600019600386901b1c1916600185901b17855562000225565b600085815260208120601f198616915b82811015620002cb57888601518255948401946001909101908401620002aa565b5085821015620002ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161010051615e16620003a16000396000612e11015260008181610299015281816105f001528181611a6701528181611b6101528181614479015281816144bf015261456d0152600081816107b901528181610ce7015281816110f5015281816111bb01528181612e9d015281816131a90152613af40152600081816105250152611e330152600081816105040152611e120152615e166000f3fe6080604052600436106102895760003560e01c80636352211e11610153578063ac9650d8116100cb578063d34879971161007f578063e985e9c511610064578063e985e9c51461082e578063f3995c6714610877578063fc6f78651461088a57600080fd5b8063d3487997146107fb578063df2ab5bb1461081b57600080fd5b8063c2e3140a116100b0578063c2e3140a14610794578063c45a0155146107a7578063c87b56dd146107db57600080fd5b8063ac9650d814610754578063b88d4fde1461077457600080fd5b8063883164561161012257806399fbab881161010757806399fbab88146106e9578063a22cb46514610721578063a4a78f0c1461074157600080fd5b8063883164561461069957806395d89b41146106d457600080fd5b80636352211e146106325780636c0360eb1461065257806370a08231146106665780637ac2ff7b1461068657600080fd5b806323b872dd1161020157806342966c68116101b557806349404b7c1161019a57806349404b7c146105cb5780634aa4a4fc146105de5780634f6ccce71461061257600080fd5b806342966c68146105a55780634659a494146105b857600080fd5b806330adf81f116101e657806330adf81f1461049b5780633644e515146104cf57806342842e0e1461058557600080fd5b806323b872dd1461045b5780632f745c591461047b57600080fd5b80630c49ccbe1161025857806313ead5621161023d57806313ead562146103f157806318160ddd14610404578063219f5d171461042357600080fd5b80630c49ccbe146103c157806312210e8a146103e957600080fd5b806301ffc9a71461031257806306fdde0314610347578063081812fc14610369578063095ea7b3146103a157600080fd5b3661030d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030b5760405162461bcd60e51b815260206004820152600960248201527f4e6f74205745544839000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561031e57600080fd5b5061033261032d366004615150565b61089d565b60405190151581526020015b60405180910390f35b34801561035357600080fd5b5061035c6108e1565b60405161033e91906151c5565b34801561037557600080fd5b506103896103843660046151d8565b610973565b6040516001600160a01b03909116815260200161033e565b3480156103ad57600080fd5b5061030b6103bc366004615206565b610a29565b6103d46103cf366004615232565b610b5a565b6040805192835260208301919091520161033e565b61030b611078565b6103896103ff36600461525d565b61108a565b34801561041057600080fd5b506008545b60405190815260200161033e565b6104366104313660046152b7565b6113a1565b604080516001600160801b03909416845260208401929092529082015260600161033e565b34801561046757600080fd5b5061030b6104763660046152c9565b61170f565b34801561048757600080fd5b50610415610496366004615206565b611796565b3480156104a757600080fd5b506104157f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b3480156104db57600080fd5b5061041560007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b34801561059157600080fd5b5061030b6105a03660046152c9565b61183e565b61030b6105b33660046151d8565b611859565b61030b6105c6366004615319565b611988565b61030b6105d9366004615375565b611a36565b3480156105ea57600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b34801561061e57600080fd5b5061041561062d3660046151d8565b611bcf565b34801561063e57600080fd5b5061038961064d3660046151d8565b611c73565b34801561065e57600080fd5b50606061035c565b34801561067257600080fd5b506104156106813660046153a5565b611cfe565b61030b610694366004615319565b611d98565b6106ac6106a73660046153c2565b61227f565b604080519485526001600160801b03909316602085015291830152606082015260800161033e565b3480156106e057600080fd5b5061035c612817565b3480156106f557600080fd5b506107096107043660046151d8565b612826565b60405161033e9c9b9a999897969594939291906153d5565b34801561072d57600080fd5b5061030b61073c366004615489565b612a7f565b61030b61074f366004615319565b612a8e565b6107676107623660046154b7565b612b35565b60405161033e919061552c565b34801561078057600080fd5b5061030b61078f36600461561b565b612c8d565b61030b6107a2366004615319565b612d1b565b3480156107b357600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b3480156107e757600080fd5b5061035c6107f63660046151d8565b612db8565b34801561080757600080fd5b5061030b6108163660046156ca565b612e88565b61030b61082936600461574a565b612f06565b34801561083a57600080fd5b5061033261084936600461578c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61030b610885366004615319565b612fed565b6103d46108983660046157ba565b61305d565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806108db57506108db826135bd565b92915050565b6060600080546108f0906157cc565b80601f016020809104026020016040519081016040528092919081815260200182805461091c906157cc565b80156109695780601f1061093e57610100808354040283529160200191610969565b820191906000526020600020905b81548152906001019060200180831161094c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109fd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610302565b506000908152600c60205260409020546c0100000000000000000000000090046001600160a01b031690565b6000610a3482611c73565b9050806001600160a01b0316836001600160a01b031603610abd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610302565b336001600160a01b0382161480610ad95750610ad98133610849565b610b4b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610302565b610b558383613658565b505050565b6000808235610b6933826136dc565b610bb55760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420617070726f76656400000000000000000000000000000000000000006044820152606401610302565b608084013580421115610c0a5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610302565b6000610c1c6040870160208801615815565b6001600160801b031611610c2f57600080fd5b84356000908152600c602090815260409182902060018101549092600160801b9091046001600160801b031691610c6a918901908901615815565b6001600160801b0316816001600160801b03161015610c8857600080fd5b60018281015469ffffffffffffffffffff166000908152600b60209081526040808320815160608101835281546001600160a01b039081168252919095015490811692850192909252600160a01b90910462ffffff1690830152610d0c7f0000000000000000000000000000000000000000000000000000000000000000836137e3565b60018501549091506001600160a01b0382169063a34123a7906a01000000000000000000008104600290810b91600160681b9004900b610d5260408e0160208f01615815565b6040516001600160e01b031960e086901b168152600293840b60048201529190920b60248201526001600160801b03909116604482015260640160408051808303816000875af1158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190615832565b909850965060408901358810801590610deb575088606001358710155b610e375760405162461bcd60e51b815260206004820152601460248201527f507269636520736c69707061676520636865636b0000000000000000000000006044820152606401610302565b6001840154600090610e679030906a01000000000000000000008104600290810b91600160681b9004900b6138e4565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401610e9a91815260200190565b60a060405180830381865afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb9190615856565b50509250925050610f09876002015483610ef591906158ce565b876001600160801b0316600160801b613938565b610f13908c6158e5565b600488018054600090610f309084906001600160801b03166158e5565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550610f67876003015482610ef591906158ce565b610f71908b6158e5565b600488018054601090610f95908490600160801b90046001600160801b03166158e5565b82546001600160801b039182166101009390930a9283029190920219909116179055506002870182905560038701819055610fd660408d0160208e01615815565b610fe09087615910565b8760010160106101000a8154816001600160801b0302191690836001600160801b031602179055508b600001357f26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b48d60200160208101906110419190615815565b604080516001600160801b039092168252602082018f905281018d90526060015b60405180910390a2505050505050505050915091565b47156110885761108833476139ea565b565b6000836001600160a01b0316856001600160a01b0316106110aa57600080fd5b6040517f1698ee820000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015262ffffff851660448301527f00000000000000000000000000000000000000000000000000000000000000001690631698ee8290606401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190615938565b90506001600160a01b0381166112a5576040517fa16712950000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015262ffffff851660448301527f0000000000000000000000000000000000000000000000000000000000000000169063a1671295906064016020604051808303816000875af1158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190615938565b6040517ff637731d0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529192509082169063f637731d90602401600060405180830381600087803b15801561128857600080fd5b505af115801561129c573d6000803e3d6000fd5b50505050611399565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156112e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113099190615976565b5050505050509050806001600160a01b0316600003611397576040517ff637731d0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283169063f637731d90602401600060405180830381600087803b15801561137e57600080fd5b505af1158015611392573d6000803e3d6000fd5b505050505b505b949350505050565b6000808060a0840135804211156113fa5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610302565b84356000908152600c6020908152604080832060018082015469ffffffffffffffffffff81168652600b855283862084516060808201875282546001600160a01b039081168352929094015480831682890190815262ffffff600160a01b9092048216838901908152885161014081018a528451861681529151909416818a01529251168287015230828501526a01000000000000000000008304600290810b608080850191909152600160681b909404900b60a0830152958c013560c0820152938b013560e0850152908a013561010084015289013561012083015292906114e290613aa7565b6001870154939a509198509650915060009061151c9030906a01000000000000000000008104600290810b91600160681b9004900b6138e4565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b815260040161154f91815260200190565b60a060405180830381865afa15801561156c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115909190615856565b505092509250506115c78660020154836115aa91906158ce565b60018801546001600160801b03600160801b918290041690613938565b6004870180546000906115e49084906001600160801b03166158e5565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061161b8660030154826115aa91906158ce565b60048701805460109061163f908490600160801b90046001600160801b03166158e5565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550818660020181905550808660030181905550898660010160108282829054906101000a90046001600160801b031661169b91906158e5565b82546101009290920a6001600160801b0381810219909316918316021790915560408051918d168252602082018c905281018a90528c3591507f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f9060600160405180910390a2505050505050509193909250565b61171933826136dc565b61178b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610302565b610b55838383613d2f565b60006117a183611cfe565b82106118155760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610302565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b5583838360405180602001604052806000815250612c8d565b8061186433826136dc565b6118b05760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420617070726f76656400000000000000000000000000000000000000006044820152606401610302565b6000828152600c602052604090206001810154600160801b90046001600160801b03161580156118eb575060048101546001600160801b0316155b801561190957506004810154600160801b90046001600160801b0316155b6119555760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420636c65617265640000000000000000000000000000000000000000006044820152606401610302565b6000838152600c6020526040812081815560018101829055600281018290556003810182905560040155610b5583613f14565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e481018290526001600160a01b03871690638fcbaf0c90610104015b600060405180830381600087803b158015611a1657600080fd5b505af1158015611a2a573d6000803e3d6000fd5b50505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ada9190615a08565b905082811015611b2c5760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420574554483900000000000000000000000000006044820152606401610302565b8015610b55576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bad57600080fd5b505af1158015611bc1573d6000803e3d6000fd5b50505050610b5582826139ea565b6000611bda60085490565b8210611c4e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610302565b60088281548110611c6157611c61615a21565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806108db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610302565b60006001600160a01b038216611d7c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610302565b506001600160a01b031660009081526003602052604090205490565b83421115611de85760405162461bcd60e51b815260206004820152600e60248201527f5065726d697420657870697265640000000000000000000000000000000000006044820152606401610302565b6000611e9360007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad8888611ebf81613fc8565b6040805160208101959095526001600160a01b03909316928401929092526060830152608082015260a0810187905260c00160405160208183030381529060405280519060200120604051602001611f499291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000611f6c87611c73565b9050806001600160a01b0316886001600160a01b031603611ff55760405162461bcd60e51b815260206004820152602760248201527f4552433732315065726d69743a20617070726f76616c20746f2063757272656e60448201527f74206f776e6572000000000000000000000000000000000000000000000000006064820152608401610302565b6001600160a01b0381163b1561215157604080516020810186905280820185905260f887901b7fff000000000000000000000000000000000000000000000000000000000000001660608201528151604181830301815260618201928390527f1626ba7e000000000000000000000000000000000000000000000000000000009092526001600160a01b03831691631626ba7e91612097918691606501615a37565b602060405180830381865afa1580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d89190615a50565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916631626ba7e60e01b1461214c5760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610302565b61226b565b6040805160008082526020820180845285905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156121a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166122085760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610302565b816001600160a01b0316816001600160a01b0316146122695760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610302565b505b6122758888613658565b5050505050505050565b6000808080610140850135804211156122da5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610302565b6040805161014081019091526000906123a690806122fb60208b018b6153a5565b6001600160a01b0316815260200189602001602081019061231c91906153a5565b6001600160a01b0316815260200161233a60608b0160408c01615a6d565b62ffffff16815230602082015260400161235a60808b0160608c01615a88565b60020b815260200161237260a08b0160808c01615a88565b60020b81526020018960a0013581526020018960c0013581526020018960e001358152602001896101000135815250613aa7565b9297509095509350905061244f6123c561014089016101208a016153a5565b600d805475ffffffffffffffffffffffffffffffffffffffffffff169060006123ed83615aa5565b91906101000a81548175ffffffffffffffffffffffffffffffffffffffffffff021916908375ffffffffffffffffffffffffffffffffffffffffffff16021790555075ffffffffffffffffffffffffffffffffffffffffffff16975087614034565b600061247a3061246560808b0160608c01615a88565b61247560a08c0160808d01615a88565b6138e4565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b81526004016124ad91815260200190565b60a060405180830381865afa1580156124ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ee9190615856565b5050925092505060006125678560405180606001604052808e600001602081019061251991906153a5565b6001600160a01b031681526020018e602001602081019061253a91906153a5565b6001600160a01b031681526020018e604001602081019061255b9190615a6d565b62ffffff16905261418f565b905060405180610140016040528060006bffffffffffffffffffffffff16815260200160006001600160a01b031681526020018269ffffffffffffffffffff1681526020018c60600160208101906125bf9190615a88565b60020b81526020016125d760a08e0160808f01615a88565b60020b81526020018a6001600160801b0316815260200184815260200183815260200160006001600160801b0316815260200160006001600160801b0316815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550606082015181600101600a6101000a81548162ffffff021916908360020b62ffffff160217905550608082015181600101600d6101000a81548162ffffff021916908360020b62ffffff16021790555060a08201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060c0820151816002015560e082015181600301556101008201518160040160006101000a8154816001600160801b0302191690836001600160801b031602179055506101208201518160040160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050897f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f8a8a8a604051612802939291906001600160801b039390931683526020830191909152604082015260600190565b60405180910390a25050505050509193509193565b6060600180546108f0906157cc565b6000818152600c6020908152604080832081516101408101835281546bffffffffffffffffffffffff811682526001600160a01b036c010000000000000000000000009091041693810193909352600181015469ffffffffffffffffffff81169284018390526a01000000000000000000008104600290810b6060860152600160681b8204810b60808601526001600160801b03600160801b92839004811660a08701529083015460c0860152600383015460e08601526004909201548083166101008601520416610120830152829182918291829182918291829182918291829182919082036129595760405162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e204944000000000000000000000000000000006044820152606401610302565b6000600b6000836040015169ffffffffffffffffffff1669ffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905081600001518260200151826000015183602001518460400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001519d509d509d509d509d509d509d509d509d509d509d509d50505091939597999b5091939597999b565b612a8a3383836142df565b5050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152600019906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015612af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b199190615a08565b1015612b2d57612b2d868686868686611988565b505050505050565b60608167ffffffffffffffff811115612b5057612b506155ac565b604051908082528060200260200182016040528015612b8357816020015b6060815260200190600190039081612b6e5790505b50905060005b82811015612c865760008030868685818110612ba757612ba7615a21565b9050602002810190612bb99190615ada565b604051612bc7929190615b46565b600060405180830381855af49150503d8060008114612c02576040519150601f19603f3d011682016040523d82523d6000602084013e612c07565b606091505b509150915081612c5357604481511015612c2057600080fd5b60048101905080806020019051810190612c3a9190615b56565b60405162461bcd60e51b815260040161030291906151c5565b80848481518110612c6657612c66615a21565b602002602001018190525050508080612c7e90615bc4565b915050612b89565b5092915050565b612c9733836136dc565b612d095760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610302565b612d15848484846143cb565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015285906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015612d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da49190615a08565b1015612b2d57612b2d868686868686612fed565b6000818152600260205260409020546060906001600160a01b0316612ddc57600080fd5b6040517fe9dc6375000000000000000000000000000000000000000000000000000000008152306004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9dc637590604401600060405180830381865afa158015612e60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108db9190810190615b56565b6000612e9682840184615bde565b9050612ec67f00000000000000000000000000000000000000000000000000000000000000008260000151614454565b508415612ee1578051516020820151612ee191903388614477565b8315612eff57612eff81600001516020015182602001513387614477565b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8a9190615a08565b905082811015612fdc5760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420746f6b656e00000000000000000000000000006044820152606401610302565b8015612d1557612d15848383614610565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b0387169063d505accf9060e4016119fc565b600080823561306c33826136dc565b6130b85760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420617070726f76656400000000000000000000000000000000000000006044820152606401610302565b60006130ca6060860160408701615815565b6001600160801b031611806130f7575060006130ec6080860160608701615815565b6001600160801b0316115b61310057600080fd5b60008061311360408701602088016153a5565b6001600160a01b0316146131365761313160408601602087016153a5565b613138565b305b85356000908152600c6020908152604080832060018082015469ffffffffffffffffffff168552600b8452828520835160608101855281546001600160a01b039081168252919092015490811694820194909452600160a01b90930462ffffff1691830191909152929350906131ce7f0000000000000000000000000000000000000000000000000000000000000000836137e3565b600484015460018501549192506001600160801b0380821692600160801b92839004821692900416156133bf5760018501546040517fa34123a70000000000000000000000000000000000000000000000000000000081526a01000000000000000000008204600290810b6004830152600160681b90920490910b6024820152600060448201526001600160a01b0384169063a34123a79060640160408051808303816000875af1158015613287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ab9190615832565b5050600185015460009081906001600160a01b0386169063514ea4bf906132f09030906a01000000000000000000008104600290810b91600160681b9004900b6138e4565b6040518263ffffffff1660e01b815260040161330e91815260200190565b60a060405180830381865afa15801561332b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061334f9190615856565b5050925092505061338687600201548361336991906158ce565b60018901546001600160801b03600160801b918290041690613938565b61339090856158e5565b93506133a587600301548261336991906158ce565b6133af90846158e5565b6002880192909255600387015590505b6000806001600160801b0384166133dc60608e0160408f01615815565b6001600160801b0316116133ff576133fa60608d0160408e01615815565b613401565b835b836001600160801b03168d606001602081019061341e9190615815565b6001600160801b0316116134415761343c60808e0160608f01615815565b613443565b835b60018901546040517f4f1eb3d80000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301526a01000000000000000000008304600290810b6024840152600160681b90930490920b60448201526001600160801b03808516606483015283166084820152929450909250861690634f1eb3d89060a40160408051808303816000875af11580156134ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135119190615c9d565b6001600160801b039182169c5016995061352b8285615910565b6135358285615910565b6001600160801b03918216908216600160801b027fffffffffffffffffffffffffffffffff0000000000000000000000000000000016176004890155604080516001600160a01b038b1681528483166020820152918316908201528c35907f40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f0190606001611062565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061362057506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108db57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146108db565b6000818152600c6020526040902080546bffffffffffffffffffffffff166c010000000000000000000000006001600160a01b0385169081029190911790915581906136a382611c73565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166137665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610302565b600061377183611c73565b9050806001600160a01b0316846001600160a01b031614806137b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806113995750836001600160a01b03166137d184610973565b6001600160a01b031614949350505050565b600081602001516001600160a01b031682600001516001600160a01b03161061380b57600080fd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085038201815260808501909252815191909201207fff0000000000000000000000000000000000000000000000000000000000000060a08401529085901b6bffffffffffffffffffffffff191660a183015260b58201527fa598dd2fba360510c5a8f02f44423a4468e902df5857dbce3ca162a43a3a31ff60d582015260f50160408051601f1981840301815291905280516020909101209392505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260e883811b603483015282901b6037820152600090603a016040516020818303038152906040528051906020012090505b9392505050565b6000808060001985870985870292508281108382030391505080600003613971576000841161396657600080fd5b508290049050613931565b80841161397d57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b604080516000808252602082019092526001600160a01b038416908390604051613a149190615ccc565b60006040518083038185875af1925050503d8060008114613a51576040519150601f19603f3d011682016040523d82523d6000602084013e613a56565b606091505b5050905080610b555760405162461bcd60e51b815260206004820152600360248201527f53544500000000000000000000000000000000000000000000000000000000006044820152606401610302565b6000806000806000604051806060016040528087600001516001600160a01b0316815260200187602001516001600160a01b03168152602001876040015162ffffff168152509050613b197f0000000000000000000000000000000000000000000000000000000000000000826137e3565b91506000826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015613b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7f9190615976565b50505050505090506000613b968860800151614752565b90506000613ba78960a00151614752565b9050613bbe8383838c60c001518d60e00151614a8e565b9750505050816001600160a01b0316633c8a7d8d876060015188608001518960a00151896040518060400160405280888152602001336001600160a01b0316815250604051602001613c4b9190815180516001600160a01b03908116835260208083015182168185015260409283015162ffffff1692840192909252920151909116606082015260800190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401613c7a959493929190615ce8565b60408051808303816000875af1158015613c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbc9190615832565b61010088015191955093508410801590613cdb57508561012001518310155b613d275760405162461bcd60e51b815260206004820152601460248201527f507269636520736c69707061676520636865636b0000000000000000000000006044820152606401610302565b509193509193565b826001600160a01b0316613d4282611c73565b6001600160a01b031614613dbe5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610302565b6001600160a01b038216613e395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610302565b613e44838383614b52565b613e4f600082613658565b6001600160a01b0383166000908152600360205260408120805460019290613e789084906158ce565b90915550506001600160a01b0382166000908152600360205260408120805460019290613ea6908490615d36565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613f1f82611c73565b9050613f2d81600084614b52565b613f38600083613658565b6001600160a01b0381166000908152600360205260408120805460019290613f619084906158ce565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000818152600c6020526040812080546bffffffffffffffffffffffff169082613ff183615d4e565b91906101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506bffffffffffffffffffffffff169050919050565b6001600160a01b03821661408a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610302565b6000818152600260205260409020546001600160a01b0316156140ef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610302565b6140fb60008383614b52565b6001600160a01b0382166000908152600360205260408120805460019290614124908490615d36565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0382166000908152600a602052604081205469ffffffffffffffffffff16908190036108db57600d8054760100000000000000000000000000000000000000000000900469ffffffffffffffffffff169060166141f283615d6f565b82546101009290920a69ffffffffffffffffffff8181021990931691831602179091556001600160a01b039485166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169486169485179055928252600b8152908290208551815473ffffffffffffffffffffffffffffffffffffffff1916908816178155908501516001919091018054959092015195167fffffffffffffffffff000000000000000000000000000000000000000000000090941693909317600160a01b62ffffff90951694909402939093179091555090565b816001600160a01b0316836001600160a01b0316036143405760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610302565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6143d6848484613d2f565b6143e284848484614c0a565b612d155760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610302565b600061446083836137e3565b9050336001600160a01b038216146108db57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03161480156144b85750804710155b156145e4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561451857600080fd5b505af115801561452c573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156145ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145de9190615d8e565b50612d15565b306001600160a01b03841603614604576145ff848383614610565b612d15565b612d1584848484614d90565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283929087169161469a9190615ccc565b6000604051808303816000865af19150503d80600081146146d7576040519150601f19603f3d011682016040523d82523d6000602084013e6146dc565b606091505b50915091508180156147065750805115806147065750808060200190518101906147069190615d8e565b612eff5760405162461bcd60e51b815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610302565b60008060008360020b12614769578260020b614771565b8260020b6000035b9050620d89e88111156147b0576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036147c757600160801b6147d9565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561480d576ffff97272373d413259a46990580e213a0260801c5b600482161561482c576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561484b576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b601082161561486a576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615614889576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156148a8576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156148c7576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156148e7576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614907576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614927576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615614947576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615614967576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615614987576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156149a7576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156149c7576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156149e8576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614a08576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614a27576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614a44576b048a170391f7dc42444e8fa20260801c5b60008460020b1315614a65578060001981614a6157614a61615dab565b0490505b640100000000810615614a79576001614a7c565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b03161115614aae579293925b846001600160a01b0316866001600160a01b031611614ad957614ad2858585614eda565b9050614b49565b836001600160a01b0316866001600160a01b03161015614b3b576000614b00878686614eda565b90506000614b0f878986614f46565b9050806001600160801b0316826001600160801b031610614b305780614b32565b815b92505050614b49565b614b46858584614f46565b90505b95945050505050565b6001600160a01b038316614bad57614ba881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614bd0565b816001600160a01b0316836001600160a01b031614614bd057614bd08382614f8c565b6001600160a01b038216614be757610b5581615029565b826001600160a01b0316826001600160a01b031614610b5557610b5582826150d8565b60006001600160a01b0384163b15614d88576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290614c67903390899088908890600401615dc1565b6020604051808303816000875af1925050508015614ca2575060408051601f3d908101601f19168201909252614c9f91810190615a50565b60015b614d55573d808015614cd0576040519150601f19603f3d011682016040523d82523d6000602084013e614cd5565b606091505b508051600003614d4d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610302565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611399565b506001611399565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614e229190615ccc565b6000604051808303816000865af19150503d8060008114614e5f576040519150601f19603f3d011682016040523d82523d6000602084013e614e64565b606091505b5091509150818015614e8e575080511580614e8e575080806020019051810190614e8e9190615d8e565b612b2d5760405162461bcd60e51b815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610302565b6000826001600160a01b0316846001600160a01b03161115614efa579192915b6000614f26856001600160a01b0316856001600160a01b03166c01000000000000000000000000613938565b9050614b49614f4184838888036001600160a01b0316613938565b61511c565b6000826001600160a01b0316846001600160a01b03161115614f66579192915b611399614f41836c010000000000000000000000008787036001600160a01b0316613938565b60006001614f9984611cfe565b614fa391906158ce565b600083815260076020526040902054909150808214614ff6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061503b906001906158ce565b6000838152600960205260408120546008805493945090928490811061506357615063615a21565b90600052602060002001549050806008838154811061508457615084615a21565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806150bc576150bc615df3565b6001900381819060005260206000200160009055905550505050565b60006150e383611cfe565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b806001600160801b038116811461513257600080fd5b919050565b6001600160e01b03198116811461514d57600080fd5b50565b60006020828403121561516257600080fd5b813561393181615137565b60005b83811015615188578181015183820152602001615170565b83811115612d155750506000910152565b600081518084526151b181602086016020860161516d565b601f01601f19169290920160200192915050565b6020815260006139316020830184615199565b6000602082840312156151ea57600080fd5b5035919050565b6001600160a01b038116811461514d57600080fd5b6000806040838503121561521957600080fd5b8235615224816151f1565b946020939093013593505050565b600060a0828403121561524457600080fd5b50919050565b803562ffffff8116811461513257600080fd5b6000806000806080858703121561527357600080fd5b843561527e816151f1565b9350602085013561528e816151f1565b925061529c6040860161524a565b915060608501356152ac816151f1565b939692955090935050565b600060c0828403121561524457600080fd5b6000806000606084860312156152de57600080fd5b83356152e9816151f1565b925060208401356152f9816151f1565b929592945050506040919091013590565b60ff8116811461514d57600080fd5b60008060008060008060c0878903121561533257600080fd5b863561533d816151f1565b95506020870135945060408701359350606087013561535b8161530a565b9598949750929560808101359460a0909101359350915050565b6000806040838503121561538857600080fd5b82359150602083013561539a816151f1565b809150509250929050565b6000602082840312156153b757600080fd5b8135613931816151f1565b6000610160828403121561524457600080fd5b6bffffffffffffffffffffffff8d1681526001600160a01b038c811660208301528b811660408301528a16606082015262ffffff89166080820152600288810b60a083015287900b60c082015261018081016001600160801b03871660e0830152856101008301528461012083015261545a6101408301856001600160801b03169052565b6001600160801b0383166101608301529d9c50505050505050505050505050565b801515811461514d57600080fd5b6000806040838503121561549c57600080fd5b82356154a7816151f1565b9150602083013561539a8161547b565b600080602083850312156154ca57600080fd5b823567ffffffffffffffff808211156154e257600080fd5b818501915085601f8301126154f657600080fd5b81358181111561550557600080fd5b8660208260051b850101111561551a57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561559f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261558d858351615199565b94509285019290850190600101615553565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156155eb576155eb6155ac565b604052919050565b600067ffffffffffffffff82111561560d5761560d6155ac565b50601f01601f191660200190565b6000806000806080858703121561563157600080fd5b843561563c816151f1565b9350602085013561564c816151f1565b925060408501359150606085013567ffffffffffffffff81111561566f57600080fd5b8501601f8101871361568057600080fd5b803561569361568e826155f3565b6155c2565b8181528860208385010111156156a857600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600080606085870312156156e057600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561570657600080fd5b818701915087601f83011261571a57600080fd5b81358181111561572957600080fd5b88602082850101111561573b57600080fd5b95989497505060200194505050565b60008060006060848603121561575f57600080fd5b833561576a816151f1565b9250602084013591506040840135615781816151f1565b809150509250925092565b6000806040838503121561579f57600080fd5b82356157aa816151f1565b9150602083013561539a816151f1565b60006080828403121561524457600080fd5b600181811c908216806157e057607f821691505b60208210810361524457634e487b7160e01b600052602260045260246000fd5b6001600160801b038116811461514d57600080fd5b60006020828403121561582757600080fd5b813561393181615800565b6000806040838503121561584557600080fd5b505080516020909101519092909150565b600080600080600060a0868803121561586e57600080fd5b855161587981615800565b809550506020860151935060408601519250606086015161589981615800565b60808701519092506158aa81615800565b809150509295509295909350565b634e487b7160e01b600052601160045260246000fd5b6000828210156158e0576158e06158b8565b500390565b60006001600160801b03808316818516808303821115615907576159076158b8565b01949350505050565b60006001600160801b0383811690831681811015615930576159306158b8565b039392505050565b60006020828403121561594a57600080fd5b8151613931816151f1565b8060020b811461514d57600080fd5b805161ffff8116811461513257600080fd5b600080600080600080600060e0888a03121561599157600080fd5b875161599c816151f1565b60208901519097506159ad81615955565b95506159bb60408901615964565b94506159c960608901615964565b93506159d760808901615964565b925060a08801516159e78161530a565b60c08901519092506159f88161547b565b8091505092959891949750929550565b600060208284031215615a1a57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006113996040830184615199565b600060208284031215615a6257600080fd5b815161393181615137565b600060208284031215615a7f57600080fd5b6139318261524a565b600060208284031215615a9a57600080fd5b813561393181615955565b600075ffffffffffffffffffffffffffffffffffffffffffff808316818103615ad057615ad06158b8565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615b0f57600080fd5b83018035915067ffffffffffffffff821115615b2a57600080fd5b602001915036819003821315615b3f57600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215615b6857600080fd5b815167ffffffffffffffff811115615b7f57600080fd5b8201601f81018413615b9057600080fd5b8051615b9e61568e826155f3565b818152856020838501011115615bb357600080fd5b614b4982602083016020860161516d565b60006000198203615bd757615bd76158b8565b5060010190565b60008183036080811215615bf157600080fd5b6040516040810167ffffffffffffffff8282108183111715615c1557615c156155ac565b816040526060841215615c2757600080fd5b60a0830193508184108185111715615c4157615c416155ac565b508260405284359250615c53836151f1565b918252602084013591615c65836151f1565b826060830152615c776040860161524a565b6080830152815260608401359150615c8e826151f1565b60208101919091529392505050565b60008060408385031215615cb057600080fd5b8251615cbb81615800565b602084015190925061539a81615800565b60008251615cde81846020870161516d565b9190910192915050565b6001600160a01b03861681528460020b60208201528360020b60408201526001600160801b038316606082015260a060808201526000615d2b60a0830184615199565b979650505050505050565b60008219821115615d4957615d496158b8565b500190565b60006bffffffffffffffffffffffff808316818103615ad057615ad06158b8565b600069ffffffffffffffffffff808316818103615ad057615ad06158b8565b600060208284031215615da057600080fd5b81516139318161547b565b634e487b7160e01b600052601260045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152614b466080830184615199565b634e487b7160e01b600052603160045260246000fdfea164736f6c634300080f000a", + "deployedBytecode": "0x6080604052600436106102895760003560e01c80636352211e11610153578063ac9650d8116100cb578063d34879971161007f578063e985e9c511610064578063e985e9c51461082e578063f3995c6714610877578063fc6f78651461088a57600080fd5b8063d3487997146107fb578063df2ab5bb1461081b57600080fd5b8063c2e3140a116100b0578063c2e3140a14610794578063c45a0155146107a7578063c87b56dd146107db57600080fd5b8063ac9650d814610754578063b88d4fde1461077457600080fd5b8063883164561161012257806399fbab881161010757806399fbab88146106e9578063a22cb46514610721578063a4a78f0c1461074157600080fd5b8063883164561461069957806395d89b41146106d457600080fd5b80636352211e146106325780636c0360eb1461065257806370a08231146106665780637ac2ff7b1461068657600080fd5b806323b872dd1161020157806342966c68116101b557806349404b7c1161019a57806349404b7c146105cb5780634aa4a4fc146105de5780634f6ccce71461061257600080fd5b806342966c68146105a55780634659a494146105b857600080fd5b806330adf81f116101e657806330adf81f1461049b5780633644e515146104cf57806342842e0e1461058557600080fd5b806323b872dd1461045b5780632f745c591461047b57600080fd5b80630c49ccbe1161025857806313ead5621161023d57806313ead562146103f157806318160ddd14610404578063219f5d171461042357600080fd5b80630c49ccbe146103c157806312210e8a146103e957600080fd5b806301ffc9a71461031257806306fdde0314610347578063081812fc14610369578063095ea7b3146103a157600080fd5b3661030d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030b5760405162461bcd60e51b815260206004820152600960248201527f4e6f74205745544839000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561031e57600080fd5b5061033261032d366004615150565b61089d565b60405190151581526020015b60405180910390f35b34801561035357600080fd5b5061035c6108e1565b60405161033e91906151c5565b34801561037557600080fd5b506103896103843660046151d8565b610973565b6040516001600160a01b03909116815260200161033e565b3480156103ad57600080fd5b5061030b6103bc366004615206565b610a29565b6103d46103cf366004615232565b610b5a565b6040805192835260208301919091520161033e565b61030b611078565b6103896103ff36600461525d565b61108a565b34801561041057600080fd5b506008545b60405190815260200161033e565b6104366104313660046152b7565b6113a1565b604080516001600160801b03909416845260208401929092529082015260600161033e565b34801561046757600080fd5b5061030b6104763660046152c9565b61170f565b34801561048757600080fd5b50610415610496366004615206565b611796565b3480156104a757600080fd5b506104157f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b3480156104db57600080fd5b5061041560007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b34801561059157600080fd5b5061030b6105a03660046152c9565b61183e565b61030b6105b33660046151d8565b611859565b61030b6105c6366004615319565b611988565b61030b6105d9366004615375565b611a36565b3480156105ea57600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b34801561061e57600080fd5b5061041561062d3660046151d8565b611bcf565b34801561063e57600080fd5b5061038961064d3660046151d8565b611c73565b34801561065e57600080fd5b50606061035c565b34801561067257600080fd5b506104156106813660046153a5565b611cfe565b61030b610694366004615319565b611d98565b6106ac6106a73660046153c2565b61227f565b604080519485526001600160801b03909316602085015291830152606082015260800161033e565b3480156106e057600080fd5b5061035c612817565b3480156106f557600080fd5b506107096107043660046151d8565b612826565b60405161033e9c9b9a999897969594939291906153d5565b34801561072d57600080fd5b5061030b61073c366004615489565b612a7f565b61030b61074f366004615319565b612a8e565b6107676107623660046154b7565b612b35565b60405161033e919061552c565b34801561078057600080fd5b5061030b61078f36600461561b565b612c8d565b61030b6107a2366004615319565b612d1b565b3480156107b357600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b3480156107e757600080fd5b5061035c6107f63660046151d8565b612db8565b34801561080757600080fd5b5061030b6108163660046156ca565b612e88565b61030b61082936600461574a565b612f06565b34801561083a57600080fd5b5061033261084936600461578c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61030b610885366004615319565b612fed565b6103d46108983660046157ba565b61305d565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806108db57506108db826135bd565b92915050565b6060600080546108f0906157cc565b80601f016020809104026020016040519081016040528092919081815260200182805461091c906157cc565b80156109695780601f1061093e57610100808354040283529160200191610969565b820191906000526020600020905b81548152906001019060200180831161094c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109fd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610302565b506000908152600c60205260409020546c0100000000000000000000000090046001600160a01b031690565b6000610a3482611c73565b9050806001600160a01b0316836001600160a01b031603610abd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610302565b336001600160a01b0382161480610ad95750610ad98133610849565b610b4b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610302565b610b558383613658565b505050565b6000808235610b6933826136dc565b610bb55760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420617070726f76656400000000000000000000000000000000000000006044820152606401610302565b608084013580421115610c0a5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610302565b6000610c1c6040870160208801615815565b6001600160801b031611610c2f57600080fd5b84356000908152600c602090815260409182902060018101549092600160801b9091046001600160801b031691610c6a918901908901615815565b6001600160801b0316816001600160801b03161015610c8857600080fd5b60018281015469ffffffffffffffffffff166000908152600b60209081526040808320815160608101835281546001600160a01b039081168252919095015490811692850192909252600160a01b90910462ffffff1690830152610d0c7f0000000000000000000000000000000000000000000000000000000000000000836137e3565b60018501549091506001600160a01b0382169063a34123a7906a01000000000000000000008104600290810b91600160681b9004900b610d5260408e0160208f01615815565b6040516001600160e01b031960e086901b168152600293840b60048201529190920b60248201526001600160801b03909116604482015260640160408051808303816000875af1158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190615832565b909850965060408901358810801590610deb575088606001358710155b610e375760405162461bcd60e51b815260206004820152601460248201527f507269636520736c69707061676520636865636b0000000000000000000000006044820152606401610302565b6001840154600090610e679030906a01000000000000000000008104600290810b91600160681b9004900b6138e4565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401610e9a91815260200190565b60a060405180830381865afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb9190615856565b50509250925050610f09876002015483610ef591906158ce565b876001600160801b0316600160801b613938565b610f13908c6158e5565b600488018054600090610f309084906001600160801b03166158e5565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550610f67876003015482610ef591906158ce565b610f71908b6158e5565b600488018054601090610f95908490600160801b90046001600160801b03166158e5565b82546001600160801b039182166101009390930a9283029190920219909116179055506002870182905560038701819055610fd660408d0160208e01615815565b610fe09087615910565b8760010160106101000a8154816001600160801b0302191690836001600160801b031602179055508b600001357f26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b48d60200160208101906110419190615815565b604080516001600160801b039092168252602082018f905281018d90526060015b60405180910390a2505050505050505050915091565b47156110885761108833476139ea565b565b6000836001600160a01b0316856001600160a01b0316106110aa57600080fd5b6040517f1698ee820000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015262ffffff851660448301527f00000000000000000000000000000000000000000000000000000000000000001690631698ee8290606401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190615938565b90506001600160a01b0381166112a5576040517fa16712950000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015262ffffff851660448301527f0000000000000000000000000000000000000000000000000000000000000000169063a1671295906064016020604051808303816000875af1158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190615938565b6040517ff637731d0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529192509082169063f637731d90602401600060405180830381600087803b15801561128857600080fd5b505af115801561129c573d6000803e3d6000fd5b50505050611399565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156112e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113099190615976565b5050505050509050806001600160a01b0316600003611397576040517ff637731d0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283169063f637731d90602401600060405180830381600087803b15801561137e57600080fd5b505af1158015611392573d6000803e3d6000fd5b505050505b505b949350505050565b6000808060a0840135804211156113fa5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610302565b84356000908152600c6020908152604080832060018082015469ffffffffffffffffffff81168652600b855283862084516060808201875282546001600160a01b039081168352929094015480831682890190815262ffffff600160a01b9092048216838901908152885161014081018a528451861681529151909416818a01529251168287015230828501526a01000000000000000000008304600290810b608080850191909152600160681b909404900b60a0830152958c013560c0820152938b013560e0850152908a013561010084015289013561012083015292906114e290613aa7565b6001870154939a509198509650915060009061151c9030906a01000000000000000000008104600290810b91600160681b9004900b6138e4565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b815260040161154f91815260200190565b60a060405180830381865afa15801561156c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115909190615856565b505092509250506115c78660020154836115aa91906158ce565b60018801546001600160801b03600160801b918290041690613938565b6004870180546000906115e49084906001600160801b03166158e5565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061161b8660030154826115aa91906158ce565b60048701805460109061163f908490600160801b90046001600160801b03166158e5565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550818660020181905550808660030181905550898660010160108282829054906101000a90046001600160801b031661169b91906158e5565b82546101009290920a6001600160801b0381810219909316918316021790915560408051918d168252602082018c905281018a90528c3591507f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f9060600160405180910390a2505050505050509193909250565b61171933826136dc565b61178b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610302565b610b55838383613d2f565b60006117a183611cfe565b82106118155760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610302565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b5583838360405180602001604052806000815250612c8d565b8061186433826136dc565b6118b05760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420617070726f76656400000000000000000000000000000000000000006044820152606401610302565b6000828152600c602052604090206001810154600160801b90046001600160801b03161580156118eb575060048101546001600160801b0316155b801561190957506004810154600160801b90046001600160801b0316155b6119555760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420636c65617265640000000000000000000000000000000000000000006044820152606401610302565b6000838152600c6020526040812081815560018101829055600281018290556003810182905560040155610b5583613f14565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e481018290526001600160a01b03871690638fcbaf0c90610104015b600060405180830381600087803b158015611a1657600080fd5b505af1158015611a2a573d6000803e3d6000fd5b50505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ada9190615a08565b905082811015611b2c5760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420574554483900000000000000000000000000006044820152606401610302565b8015610b55576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bad57600080fd5b505af1158015611bc1573d6000803e3d6000fd5b50505050610b5582826139ea565b6000611bda60085490565b8210611c4e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610302565b60088281548110611c6157611c61615a21565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806108db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610302565b60006001600160a01b038216611d7c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610302565b506001600160a01b031660009081526003602052604090205490565b83421115611de85760405162461bcd60e51b815260206004820152600e60248201527f5065726d697420657870697265640000000000000000000000000000000000006044820152606401610302565b6000611e9360007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad8888611ebf81613fc8565b6040805160208101959095526001600160a01b03909316928401929092526060830152608082015260a0810187905260c00160405160208183030381529060405280519060200120604051602001611f499291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000611f6c87611c73565b9050806001600160a01b0316886001600160a01b031603611ff55760405162461bcd60e51b815260206004820152602760248201527f4552433732315065726d69743a20617070726f76616c20746f2063757272656e60448201527f74206f776e6572000000000000000000000000000000000000000000000000006064820152608401610302565b6001600160a01b0381163b1561215157604080516020810186905280820185905260f887901b7fff000000000000000000000000000000000000000000000000000000000000001660608201528151604181830301815260618201928390527f1626ba7e000000000000000000000000000000000000000000000000000000009092526001600160a01b03831691631626ba7e91612097918691606501615a37565b602060405180830381865afa1580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d89190615a50565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916631626ba7e60e01b1461214c5760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610302565b61226b565b6040805160008082526020820180845285905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156121a5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166122085760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610302565b816001600160a01b0316816001600160a01b0316146122695760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610302565b505b6122758888613658565b5050505050505050565b6000808080610140850135804211156122da5760405162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c64000000000000000000000000006044820152606401610302565b6040805161014081019091526000906123a690806122fb60208b018b6153a5565b6001600160a01b0316815260200189602001602081019061231c91906153a5565b6001600160a01b0316815260200161233a60608b0160408c01615a6d565b62ffffff16815230602082015260400161235a60808b0160608c01615a88565b60020b815260200161237260a08b0160808c01615a88565b60020b81526020018960a0013581526020018960c0013581526020018960e001358152602001896101000135815250613aa7565b9297509095509350905061244f6123c561014089016101208a016153a5565b600d805475ffffffffffffffffffffffffffffffffffffffffffff169060006123ed83615aa5565b91906101000a81548175ffffffffffffffffffffffffffffffffffffffffffff021916908375ffffffffffffffffffffffffffffffffffffffffffff16021790555075ffffffffffffffffffffffffffffffffffffffffffff16975087614034565b600061247a3061246560808b0160608c01615a88565b61247560a08c0160808d01615a88565b6138e4565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b81526004016124ad91815260200190565b60a060405180830381865afa1580156124ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ee9190615856565b5050925092505060006125678560405180606001604052808e600001602081019061251991906153a5565b6001600160a01b031681526020018e602001602081019061253a91906153a5565b6001600160a01b031681526020018e604001602081019061255b9190615a6d565b62ffffff16905261418f565b905060405180610140016040528060006bffffffffffffffffffffffff16815260200160006001600160a01b031681526020018269ffffffffffffffffffff1681526020018c60600160208101906125bf9190615a88565b60020b81526020016125d760a08e0160808f01615a88565b60020b81526020018a6001600160801b0316815260200184815260200183815260200160006001600160801b0316815260200160006001600160801b0316815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550606082015181600101600a6101000a81548162ffffff021916908360020b62ffffff160217905550608082015181600101600d6101000a81548162ffffff021916908360020b62ffffff16021790555060a08201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060c0820151816002015560e082015181600301556101008201518160040160006101000a8154816001600160801b0302191690836001600160801b031602179055506101208201518160040160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050897f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f8a8a8a604051612802939291906001600160801b039390931683526020830191909152604082015260600190565b60405180910390a25050505050509193509193565b6060600180546108f0906157cc565b6000818152600c6020908152604080832081516101408101835281546bffffffffffffffffffffffff811682526001600160a01b036c010000000000000000000000009091041693810193909352600181015469ffffffffffffffffffff81169284018390526a01000000000000000000008104600290810b6060860152600160681b8204810b60808601526001600160801b03600160801b92839004811660a08701529083015460c0860152600383015460e08601526004909201548083166101008601520416610120830152829182918291829182918291829182918291829182919082036129595760405162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e204944000000000000000000000000000000006044820152606401610302565b6000600b6000836040015169ffffffffffffffffffff1669ffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905081600001518260200151826000015183602001518460400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001519d509d509d509d509d509d509d509d509d509d509d509d50505091939597999b5091939597999b565b612a8a3383836142df565b5050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152600019906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015612af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b199190615a08565b1015612b2d57612b2d868686868686611988565b505050505050565b60608167ffffffffffffffff811115612b5057612b506155ac565b604051908082528060200260200182016040528015612b8357816020015b6060815260200190600190039081612b6e5790505b50905060005b82811015612c865760008030868685818110612ba757612ba7615a21565b9050602002810190612bb99190615ada565b604051612bc7929190615b46565b600060405180830381855af49150503d8060008114612c02576040519150601f19603f3d011682016040523d82523d6000602084013e612c07565b606091505b509150915081612c5357604481511015612c2057600080fd5b60048101905080806020019051810190612c3a9190615b56565b60405162461bcd60e51b815260040161030291906151c5565b80848481518110612c6657612c66615a21565b602002602001018190525050508080612c7e90615bc4565b915050612b89565b5092915050565b612c9733836136dc565b612d095760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610302565b612d15848484846143cb565b50505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015285906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015612d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da49190615a08565b1015612b2d57612b2d868686868686612fed565b6000818152600260205260409020546060906001600160a01b0316612ddc57600080fd5b6040517fe9dc6375000000000000000000000000000000000000000000000000000000008152306004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9dc637590604401600060405180830381865afa158015612e60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108db9190810190615b56565b6000612e9682840184615bde565b9050612ec67f00000000000000000000000000000000000000000000000000000000000000008260000151614454565b508415612ee1578051516020820151612ee191903388614477565b8315612eff57612eff81600001516020015182602001513387614477565b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8a9190615a08565b905082811015612fdc5760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420746f6b656e00000000000000000000000000006044820152606401610302565b8015612d1557612d15848383614610565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b0387169063d505accf9060e4016119fc565b600080823561306c33826136dc565b6130b85760405162461bcd60e51b815260206004820152600c60248201527f4e6f7420617070726f76656400000000000000000000000000000000000000006044820152606401610302565b60006130ca6060860160408701615815565b6001600160801b031611806130f7575060006130ec6080860160608701615815565b6001600160801b0316115b61310057600080fd5b60008061311360408701602088016153a5565b6001600160a01b0316146131365761313160408601602087016153a5565b613138565b305b85356000908152600c6020908152604080832060018082015469ffffffffffffffffffff168552600b8452828520835160608101855281546001600160a01b039081168252919092015490811694820194909452600160a01b90930462ffffff1691830191909152929350906131ce7f0000000000000000000000000000000000000000000000000000000000000000836137e3565b600484015460018501549192506001600160801b0380821692600160801b92839004821692900416156133bf5760018501546040517fa34123a70000000000000000000000000000000000000000000000000000000081526a01000000000000000000008204600290810b6004830152600160681b90920490910b6024820152600060448201526001600160a01b0384169063a34123a79060640160408051808303816000875af1158015613287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ab9190615832565b5050600185015460009081906001600160a01b0386169063514ea4bf906132f09030906a01000000000000000000008104600290810b91600160681b9004900b6138e4565b6040518263ffffffff1660e01b815260040161330e91815260200190565b60a060405180830381865afa15801561332b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061334f9190615856565b5050925092505061338687600201548361336991906158ce565b60018901546001600160801b03600160801b918290041690613938565b61339090856158e5565b93506133a587600301548261336991906158ce565b6133af90846158e5565b6002880192909255600387015590505b6000806001600160801b0384166133dc60608e0160408f01615815565b6001600160801b0316116133ff576133fa60608d0160408e01615815565b613401565b835b836001600160801b03168d606001602081019061341e9190615815565b6001600160801b0316116134415761343c60808e0160608f01615815565b613443565b835b60018901546040517f4f1eb3d80000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301526a01000000000000000000008304600290810b6024840152600160681b90930490920b60448201526001600160801b03808516606483015283166084820152929450909250861690634f1eb3d89060a40160408051808303816000875af11580156134ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135119190615c9d565b6001600160801b039182169c5016995061352b8285615910565b6135358285615910565b6001600160801b03918216908216600160801b027fffffffffffffffffffffffffffffffff0000000000000000000000000000000016176004890155604080516001600160a01b038b1681528483166020820152918316908201528c35907f40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f0190606001611062565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061362057506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108db57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146108db565b6000818152600c6020526040902080546bffffffffffffffffffffffff166c010000000000000000000000006001600160a01b0385169081029190911790915581906136a382611c73565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166137665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610302565b600061377183611c73565b9050806001600160a01b0316846001600160a01b031614806137b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806113995750836001600160a01b03166137d184610973565b6001600160a01b031614949350505050565b600081602001516001600160a01b031682600001516001600160a01b03161061380b57600080fd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085038201815260808501909252815191909201207fff0000000000000000000000000000000000000000000000000000000000000060a08401529085901b6bffffffffffffffffffffffff191660a183015260b58201527fa598dd2fba360510c5a8f02f44423a4468e902df5857dbce3ca162a43a3a31ff60d582015260f50160408051601f1981840301815291905280516020909101209392505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260e883811b603483015282901b6037820152600090603a016040516020818303038152906040528051906020012090505b9392505050565b6000808060001985870985870292508281108382030391505080600003613971576000841161396657600080fd5b508290049050613931565b80841161397d57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b604080516000808252602082019092526001600160a01b038416908390604051613a149190615ccc565b60006040518083038185875af1925050503d8060008114613a51576040519150601f19603f3d011682016040523d82523d6000602084013e613a56565b606091505b5050905080610b555760405162461bcd60e51b815260206004820152600360248201527f53544500000000000000000000000000000000000000000000000000000000006044820152606401610302565b6000806000806000604051806060016040528087600001516001600160a01b0316815260200187602001516001600160a01b03168152602001876040015162ffffff168152509050613b197f0000000000000000000000000000000000000000000000000000000000000000826137e3565b91506000826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015613b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7f9190615976565b50505050505090506000613b968860800151614752565b90506000613ba78960a00151614752565b9050613bbe8383838c60c001518d60e00151614a8e565b9750505050816001600160a01b0316633c8a7d8d876060015188608001518960a00151896040518060400160405280888152602001336001600160a01b0316815250604051602001613c4b9190815180516001600160a01b03908116835260208083015182168185015260409283015162ffffff1692840192909252920151909116606082015260800190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401613c7a959493929190615ce8565b60408051808303816000875af1158015613c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbc9190615832565b61010088015191955093508410801590613cdb57508561012001518310155b613d275760405162461bcd60e51b815260206004820152601460248201527f507269636520736c69707061676520636865636b0000000000000000000000006044820152606401610302565b509193509193565b826001600160a01b0316613d4282611c73565b6001600160a01b031614613dbe5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610302565b6001600160a01b038216613e395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610302565b613e44838383614b52565b613e4f600082613658565b6001600160a01b0383166000908152600360205260408120805460019290613e789084906158ce565b90915550506001600160a01b0382166000908152600360205260408120805460019290613ea6908490615d36565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613f1f82611c73565b9050613f2d81600084614b52565b613f38600083613658565b6001600160a01b0381166000908152600360205260408120805460019290613f619084906158ce565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000818152600c6020526040812080546bffffffffffffffffffffffff169082613ff183615d4e565b91906101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506bffffffffffffffffffffffff169050919050565b6001600160a01b03821661408a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610302565b6000818152600260205260409020546001600160a01b0316156140ef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610302565b6140fb60008383614b52565b6001600160a01b0382166000908152600360205260408120805460019290614124908490615d36565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0382166000908152600a602052604081205469ffffffffffffffffffff16908190036108db57600d8054760100000000000000000000000000000000000000000000900469ffffffffffffffffffff169060166141f283615d6f565b82546101009290920a69ffffffffffffffffffff8181021990931691831602179091556001600160a01b039485166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169486169485179055928252600b8152908290208551815473ffffffffffffffffffffffffffffffffffffffff1916908816178155908501516001919091018054959092015195167fffffffffffffffffff000000000000000000000000000000000000000000000090941693909317600160a01b62ffffff90951694909402939093179091555090565b816001600160a01b0316836001600160a01b0316036143405760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610302565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6143d6848484613d2f565b6143e284848484614c0a565b612d155760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610302565b600061446083836137e3565b9050336001600160a01b038216146108db57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03161480156144b85750804710155b156145e4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561451857600080fd5b505af115801561452c573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156145ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145de9190615d8e565b50612d15565b306001600160a01b03841603614604576145ff848383614610565b612d15565b612d1584848484614d90565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283929087169161469a9190615ccc565b6000604051808303816000865af19150503d80600081146146d7576040519150601f19603f3d011682016040523d82523d6000602084013e6146dc565b606091505b50915091508180156147065750805115806147065750808060200190518101906147069190615d8e565b612eff5760405162461bcd60e51b815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610302565b60008060008360020b12614769578260020b614771565b8260020b6000035b9050620d89e88111156147b0576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036147c757600160801b6147d9565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561480d576ffff97272373d413259a46990580e213a0260801c5b600482161561482c576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561484b576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b601082161561486a576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615614889576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156148a8576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156148c7576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156148e7576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614907576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614927576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615614947576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615614967576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615614987576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156149a7576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156149c7576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156149e8576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614a08576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614a27576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614a44576b048a170391f7dc42444e8fa20260801c5b60008460020b1315614a65578060001981614a6157614a61615dab565b0490505b640100000000810615614a79576001614a7c565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b03161115614aae579293925b846001600160a01b0316866001600160a01b031611614ad957614ad2858585614eda565b9050614b49565b836001600160a01b0316866001600160a01b03161015614b3b576000614b00878686614eda565b90506000614b0f878986614f46565b9050806001600160801b0316826001600160801b031610614b305780614b32565b815b92505050614b49565b614b46858584614f46565b90505b95945050505050565b6001600160a01b038316614bad57614ba881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614bd0565b816001600160a01b0316836001600160a01b031614614bd057614bd08382614f8c565b6001600160a01b038216614be757610b5581615029565b826001600160a01b0316826001600160a01b031614610b5557610b5582826150d8565b60006001600160a01b0384163b15614d88576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290614c67903390899088908890600401615dc1565b6020604051808303816000875af1925050508015614ca2575060408051601f3d908101601f19168201909252614c9f91810190615a50565b60015b614d55573d808015614cd0576040519150601f19603f3d011682016040523d82523d6000602084013e614cd5565b606091505b508051600003614d4d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610302565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611399565b506001611399565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614e229190615ccc565b6000604051808303816000865af19150503d8060008114614e5f576040519150601f19603f3d011682016040523d82523d6000602084013e614e64565b606091505b5091509150818015614e8e575080511580614e8e575080806020019051810190614e8e9190615d8e565b612b2d5760405162461bcd60e51b815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610302565b6000826001600160a01b0316846001600160a01b03161115614efa579192915b6000614f26856001600160a01b0316856001600160a01b03166c01000000000000000000000000613938565b9050614b49614f4184838888036001600160a01b0316613938565b61511c565b6000826001600160a01b0316846001600160a01b03161115614f66579192915b611399614f41836c010000000000000000000000008787036001600160a01b0316613938565b60006001614f9984611cfe565b614fa391906158ce565b600083815260076020526040902054909150808214614ff6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061503b906001906158ce565b6000838152600960205260408120546008805493945090928490811061506357615063615a21565b90600052602060002001549050806008838154811061508457615084615a21565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806150bc576150bc615df3565b6001900381819060005260206000200160009055905550505050565b60006150e383611cfe565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b806001600160801b038116811461513257600080fd5b919050565b6001600160e01b03198116811461514d57600080fd5b50565b60006020828403121561516257600080fd5b813561393181615137565b60005b83811015615188578181015183820152602001615170565b83811115612d155750506000910152565b600081518084526151b181602086016020860161516d565b601f01601f19169290920160200192915050565b6020815260006139316020830184615199565b6000602082840312156151ea57600080fd5b5035919050565b6001600160a01b038116811461514d57600080fd5b6000806040838503121561521957600080fd5b8235615224816151f1565b946020939093013593505050565b600060a0828403121561524457600080fd5b50919050565b803562ffffff8116811461513257600080fd5b6000806000806080858703121561527357600080fd5b843561527e816151f1565b9350602085013561528e816151f1565b925061529c6040860161524a565b915060608501356152ac816151f1565b939692955090935050565b600060c0828403121561524457600080fd5b6000806000606084860312156152de57600080fd5b83356152e9816151f1565b925060208401356152f9816151f1565b929592945050506040919091013590565b60ff8116811461514d57600080fd5b60008060008060008060c0878903121561533257600080fd5b863561533d816151f1565b95506020870135945060408701359350606087013561535b8161530a565b9598949750929560808101359460a0909101359350915050565b6000806040838503121561538857600080fd5b82359150602083013561539a816151f1565b809150509250929050565b6000602082840312156153b757600080fd5b8135613931816151f1565b6000610160828403121561524457600080fd5b6bffffffffffffffffffffffff8d1681526001600160a01b038c811660208301528b811660408301528a16606082015262ffffff89166080820152600288810b60a083015287900b60c082015261018081016001600160801b03871660e0830152856101008301528461012083015261545a6101408301856001600160801b03169052565b6001600160801b0383166101608301529d9c50505050505050505050505050565b801515811461514d57600080fd5b6000806040838503121561549c57600080fd5b82356154a7816151f1565b9150602083013561539a8161547b565b600080602083850312156154ca57600080fd5b823567ffffffffffffffff808211156154e257600080fd5b818501915085601f8301126154f657600080fd5b81358181111561550557600080fd5b8660208260051b850101111561551a57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561559f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261558d858351615199565b94509285019290850190600101615553565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156155eb576155eb6155ac565b604052919050565b600067ffffffffffffffff82111561560d5761560d6155ac565b50601f01601f191660200190565b6000806000806080858703121561563157600080fd5b843561563c816151f1565b9350602085013561564c816151f1565b925060408501359150606085013567ffffffffffffffff81111561566f57600080fd5b8501601f8101871361568057600080fd5b803561569361568e826155f3565b6155c2565b8181528860208385010111156156a857600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600080606085870312156156e057600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561570657600080fd5b818701915087601f83011261571a57600080fd5b81358181111561572957600080fd5b88602082850101111561573b57600080fd5b95989497505060200194505050565b60008060006060848603121561575f57600080fd5b833561576a816151f1565b9250602084013591506040840135615781816151f1565b809150509250925092565b6000806040838503121561579f57600080fd5b82356157aa816151f1565b9150602083013561539a816151f1565b60006080828403121561524457600080fd5b600181811c908216806157e057607f821691505b60208210810361524457634e487b7160e01b600052602260045260246000fd5b6001600160801b038116811461514d57600080fd5b60006020828403121561582757600080fd5b813561393181615800565b6000806040838503121561584557600080fd5b505080516020909101519092909150565b600080600080600060a0868803121561586e57600080fd5b855161587981615800565b809550506020860151935060408601519250606086015161589981615800565b60808701519092506158aa81615800565b809150509295509295909350565b634e487b7160e01b600052601160045260246000fd5b6000828210156158e0576158e06158b8565b500390565b60006001600160801b03808316818516808303821115615907576159076158b8565b01949350505050565b60006001600160801b0383811690831681811015615930576159306158b8565b039392505050565b60006020828403121561594a57600080fd5b8151613931816151f1565b8060020b811461514d57600080fd5b805161ffff8116811461513257600080fd5b600080600080600080600060e0888a03121561599157600080fd5b875161599c816151f1565b60208901519097506159ad81615955565b95506159bb60408901615964565b94506159c960608901615964565b93506159d760808901615964565b925060a08801516159e78161530a565b60c08901519092506159f88161547b565b8091505092959891949750929550565b600060208284031215615a1a57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b8281526040602082015260006113996040830184615199565b600060208284031215615a6257600080fd5b815161393181615137565b600060208284031215615a7f57600080fd5b6139318261524a565b600060208284031215615a9a57600080fd5b813561393181615955565b600075ffffffffffffffffffffffffffffffffffffffffffff808316818103615ad057615ad06158b8565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615b0f57600080fd5b83018035915067ffffffffffffffff821115615b2a57600080fd5b602001915036819003821315615b3f57600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215615b6857600080fd5b815167ffffffffffffffff811115615b7f57600080fd5b8201601f81018413615b9057600080fd5b8051615b9e61568e826155f3565b818152856020838501011115615bb357600080fd5b614b4982602083016020860161516d565b60006000198203615bd757615bd76158b8565b5060010190565b60008183036080811215615bf157600080fd5b6040516040810167ffffffffffffffff8282108183111715615c1557615c156155ac565b816040526060841215615c2757600080fd5b60a0830193508184108185111715615c4157615c416155ac565b508260405284359250615c53836151f1565b918252602084013591615c65836151f1565b826060830152615c776040860161524a565b6080830152815260608401359150615c8e826151f1565b60208101919091529392505050565b60008060408385031215615cb057600080fd5b8251615cbb81615800565b602084015190925061539a81615800565b60008251615cde81846020870161516d565b9190910192915050565b6001600160a01b03861681528460020b60208201528360020b60408201526001600160801b038316606082015260a060808201526000615d2b60a0830184615199565b979650505050505050565b60008219821115615d4957615d496158b8565b500190565b60006bffffffffffffffffffffffff808316818103615ad057615ad06158b8565b600069ffffffffffffffffffff808316818103615ad057615ad06158b8565b600060208284031215615da057600080fd5b81516139318161547b565b634e487b7160e01b600052601260045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152614b466080830184615199565b634e487b7160e01b600052603160045260246000fdfea164736f6c634300080f000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/artifacts-apeswap/dex/contracts/NonfungibleTokenPositionDescriptor.json b/src/artifacts-apeswap/dex/contracts/NonfungibleTokenPositionDescriptor.json new file mode 100644 index 0000000..a293f0f --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/NonfungibleTokenPositionDescriptor.json @@ -0,0 +1,161 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NonfungibleTokenPositionDescriptor", + "sourceName": "contracts/NonfungibleTokenPositionDescriptor.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_WETH9", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_nativeCurrencyLabelBytes", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "WETH9", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "flipRatio", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeCurrencyLabel", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeCurrencyLabelBytes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "tokenRatioPriority", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract INonfungiblePositionManager", + "name": "positionManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c03461009f57601f61119338819003918201601f19168301916001600160401b038311848410176100a457808492604094855283398101031261009f578051906001600160a01b038216820361009f57602001519060805260a0526040516110d890816100bb8239608051818181610295015281816102db015281816109840152610c96015260a0518181816108c601528181610b380152610b9d0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c9081634aa4a4fc14610966575080637e5af771146109185780639d7b0ea8146108e9578063a18246e2146108ae578063b7af3cdc1461087e5763e9dc63751461006157600080fd5b34610627576040366003190112610627576004356001600160a01b038116809103610627576040517f99fbab88000000000000000000000000000000000000000000000000000000008152602435600482015261018081602481855afa80156105d1576000926000936000916000946000946107aa575b506020600491604051928380927fc45a01550000000000000000000000000000000000000000000000000000000082525afa9081156105d157600091610770575b5060405180606081011067ffffffffffffffff6060830111176105dd57606081016040526001600160a01b03831681526001600160a01b0387166020820152604062ffffff85169101526001600160a01b0386166001600160a01b0383161015610627576001600160a01b039060405160208101908385168252838916604082015262ffffff86166060820152606081526101b381610a3d565b5190206040519060208201926001600160f81b031984526bffffffffffffffffffffffff199060601b16602183015260358201527fa598dd2fba360510c5a8f02f44423a4468e902df5857dbce3ca162a43a3a31ff60558201526055815261021a81610a3d565b51902016936102294683610c87565b6102334688610c87565b1291821596876000146107695780975b156107615750935b604051917f3850c7bd00000000000000000000000000000000000000000000000000000000835260e0836004818a5afa9283156105d1576000936106d0575b506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166001600160a01b038916146000146106c1576102cf610b0c565b935b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166001600160a01b038816146000146106b257610315610b0c565b985b6040519563313ce56760e01b87526020876004816001600160a01b0386165afa9081156105d157600091610670575b60405163313ce56760e01b815297506020886004816001600160a01b038e165afa9182156105d157600092610634575b6040517fd0c93a7c00000000000000000000000000000000000000000000000000000000815298506020896004818f5afa9889156105d1576000996105f3575b506040519c8d67ffffffffffffffff6101c08281810110920111176105dd5760808e60ff96946001600160a01b0362ffffff9f818a986101c086016040526024358652166020850152166040830152606082015201521660a08c01521660c08a015260e089015260020b61010088015260020b61012087015260020b61014086015260020b610160850152166101808301526101a082015260006040518080937fc49917d700000000000000000000000000000000000000000000000000000000825260206004830152805160248301526001600160a01b0360208201511660448301526001600160a01b0360408201511660648301526001600160a01b036101a06104ec6104d660608501516101c060848801526101e48701906109f3565b60808501518682036023190160a48801526109f3565b9260ff60a08201511660c486015260ff60c08201511660e486015260e0810151151561010486015261010081015160020b61012486015261012081015160020b61014486015261014081015160020b61016486015261016081015160020b61018486015262ffffff610180820151166101a48601520151166101c4830152038173__$cea9be979eee3d87fb124d6cbb244bb0b5$__5af480156105d1576105aa916000916105ae575b506040519182916020835260208301906109f3565b0390f35b6105cb91503d806000833e6105c38183610a75565b810190610c25565b38610595565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b9098506020813d60201161062c575b8161060f60209383610a75565b810103126106275761062090610bdd565b97386103b6565b600080fd5b3d9150610602565b91506020883d602011610668575b8161064f60209383610a75565b8101031261062757610662600498610c17565b91610376565b3d9150610642565b90506020873d6020116106aa575b8161068b60209383610a75565b81010312610627576106a46001600160a01b0397610c17565b90610346565b3d915061067e565b6106bb87610d7d565b98610317565b6106ca88610d7d565b936102d1565b90925060e0813d60e011610759575b816106ec60e09383610a75565b810103126106275780516001600160a01b038116036106275760c061071360208301610bdd565b9161072060408201610c08565b5061072d60608201610c08565b5061073a60808201610c08565b5061074760a08201610c17565b5001518015150361062757913861028a565b3d91506106df565b90509361024b565b8197610243565b90506020813d6020116107a2575b8161078b60209383610a75565b810103126106275761079c90610bc9565b38610119565b3d915061077e565b94509450505050610180813d61018011610876575b816107cd6101809383610a75565b810103126106275780516bffffffffffffffffffffffff811603610627576107f760208201610bc9565b5061080460408201610bc9565b9161081160608301610bc9565b9260808301519362ffffff85168503610627576004602061083460a08701610bdd565b9361086961016061084760c08a01610bdd565b9861085460e08201610beb565b506108626101408201610beb565b5001610beb565b50929693959491506100d8565b3d91506107bf565b34610627576000366003190112610627576105aa61089a610b0c565b6040519182916020835260208301906109f3565b346106275760003660031901126106275760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346106275760403660031901126106275760206109106109076109a8565b60243590610c87565b604051908152f35b34610627576060366003190112610627576109316109a8565b6024356001600160a01b03811681036106275761095d6020926109576044358092610c87565b92610c87565b12604051908152f35b34610627576000366003190112610627576020906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b600435906001600160a01b038216820361062757565b918091926000905b8282106109de5750116109d7575050565b6000910152565b915080602091830151818601520182916109c6565b90602091610a0c815180928185528580860191016109be565b601f01601f1916010190565b6000198114610a275760010190565b634e487b7160e01b600052601160045260246000fd5b6080810190811067ffffffffffffffff8211176105dd57604052565b6020810190811067ffffffffffffffff8211176105dd57604052565b90601f8019910116810190811067ffffffffffffffff8211176105dd57604052565b67ffffffffffffffff81116105dd57601f01601f191660200190565b90610abd82610a97565b610aca6040519182610a75565b8281528092610adb601f1991610a97565b0190602036910137565b908151811015610af6570160200190565b634e487b7160e01b600052603260045260246000fd5b60005b6020811080610b8d575b15610b2c57610b2790610a18565b610b0f565b610b3581610ab3565b907f00000000000000000000000000000000000000000000000000000000000000009060005b818110610b685750505090565b6020811015610af6578083610b88921a610b828287610ae5565b53610a18565b610b5b565b15610af6576001600160f81b03197f0000000000000000000000000000000000000000000000000000000000000000821a60f81b161515610b19565b51906001600160a01b038216820361062757565b51908160020b820361062757565b51906fffffffffffffffffffffffffffffffff8216820361062757565b519061ffff8216820361062757565b519060ff8216820361062757565b6020818303126106275780519067ffffffffffffffff8211610627570181601f82011215610627578051610c5881610a97565b92610c666040519485610a75565b8184526020828401011161062757610c8491602080850191016109be565b90565b906001600160a01b03809216917f0000000000000000000000000000000000000000000000000000000000000000168214610d7557600114610cc95750600090565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488103610ceb575061012c90565b73dac17f958d2ee523a2206206994597c13d831ec78103610d0c575060c890565b736b175474e89094c44da98b954eedeac495271d0f8103610d2d5750606490565b738daebade922df735c38c80c7ebd708af50815faa8103610d4f575060c71990565b732260fac5e5542a773aa44fbcfedf7c193bc2c59903610d705761012b1990565b600090565b505060631990565b610d8681610f10565b90815115610d92575090565b6040805193925083019067ffffffffffffffff8211848310176105dd576001600160a01b03916040526006845260203681860137169060005b600380821015610e97576013828110610a2757829003906001917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81118316610a275785911b1c9060ff821660f08316808210610a2757610e5491610e36600f600496871c16610ece565b610e4d610e4288610e9e565b9160001a918b610ae5565b5303610ece565b610e5d84610e9e565b926001198411610e825750610e7d939291610b829160001a920187610ae5565b610dcb565b601190634e487b7160e01b6000525260246000fd5b5090915050565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111600116610a275760011b90565b60ff16600a811015610ef55760cf8111610a275760300160f81b6001600160f81b03191690565b60c88111610a275760370160f81b6001600160f81b03191690565b60409081519060208083017f95d89b41000000000000000000000000000000000000000000000000000000008152600484528484019367ffffffffffffffff94818110868211176105dd5786526000938492839251915afa3d156110c3573d90610f7982610a97565b91610f8687519384610a75565b82523d848484013e5b1580156110ba575b6110aa57805182810361107a575081818051810103126110765781015192845194808601918683109083111761106257528084528036818601378192825b82811061102357505050610fe882610ab3565b92815b838110610ff9575050505090565b806001600160f81b031961101061101e9385610ae5565b5116841a610b828288610ae5565b610feb565b81811a6001600160f81b03198160f81b16611048575b5061104390610a18565b610fd5565b8561105b91610b8261104394988a610ae5565b9490611039565b602484634e487b7160e01b81526041600452fd5b8280fd5b909294809450811161109957505050519061109482610a59565b815290565b610c84945082018101925001610c25565b5050919050519061109482610a59565b50805115610f97565b606090610f8f56fea164736f6c634300080f000a", + "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c9081634aa4a4fc14610966575080637e5af771146109185780639d7b0ea8146108e9578063a18246e2146108ae578063b7af3cdc1461087e5763e9dc63751461006157600080fd5b34610627576040366003190112610627576004356001600160a01b038116809103610627576040517f99fbab88000000000000000000000000000000000000000000000000000000008152602435600482015261018081602481855afa80156105d1576000926000936000916000946000946107aa575b506020600491604051928380927fc45a01550000000000000000000000000000000000000000000000000000000082525afa9081156105d157600091610770575b5060405180606081011067ffffffffffffffff6060830111176105dd57606081016040526001600160a01b03831681526001600160a01b0387166020820152604062ffffff85169101526001600160a01b0386166001600160a01b0383161015610627576001600160a01b039060405160208101908385168252838916604082015262ffffff86166060820152606081526101b381610a3d565b5190206040519060208201926001600160f81b031984526bffffffffffffffffffffffff199060601b16602183015260358201527fa598dd2fba360510c5a8f02f44423a4468e902df5857dbce3ca162a43a3a31ff60558201526055815261021a81610a3d565b51902016936102294683610c87565b6102334688610c87565b1291821596876000146107695780975b156107615750935b604051917f3850c7bd00000000000000000000000000000000000000000000000000000000835260e0836004818a5afa9283156105d1576000936106d0575b506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166001600160a01b038916146000146106c1576102cf610b0c565b935b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166001600160a01b038816146000146106b257610315610b0c565b985b6040519563313ce56760e01b87526020876004816001600160a01b0386165afa9081156105d157600091610670575b60405163313ce56760e01b815297506020886004816001600160a01b038e165afa9182156105d157600092610634575b6040517fd0c93a7c00000000000000000000000000000000000000000000000000000000815298506020896004818f5afa9889156105d1576000996105f3575b506040519c8d67ffffffffffffffff6101c08281810110920111176105dd5760808e60ff96946001600160a01b0362ffffff9f818a986101c086016040526024358652166020850152166040830152606082015201521660a08c01521660c08a015260e089015260020b61010088015260020b61012087015260020b61014086015260020b610160850152166101808301526101a082015260006040518080937fc49917d700000000000000000000000000000000000000000000000000000000825260206004830152805160248301526001600160a01b0360208201511660448301526001600160a01b0360408201511660648301526001600160a01b036101a06104ec6104d660608501516101c060848801526101e48701906109f3565b60808501518682036023190160a48801526109f3565b9260ff60a08201511660c486015260ff60c08201511660e486015260e0810151151561010486015261010081015160020b61012486015261012081015160020b61014486015261014081015160020b61016486015261016081015160020b61018486015262ffffff610180820151166101a48601520151166101c4830152038173__$cea9be979eee3d87fb124d6cbb244bb0b5$__5af480156105d1576105aa916000916105ae575b506040519182916020835260208301906109f3565b0390f35b6105cb91503d806000833e6105c38183610a75565b810190610c25565b38610595565b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b9098506020813d60201161062c575b8161060f60209383610a75565b810103126106275761062090610bdd565b97386103b6565b600080fd5b3d9150610602565b91506020883d602011610668575b8161064f60209383610a75565b8101031261062757610662600498610c17565b91610376565b3d9150610642565b90506020873d6020116106aa575b8161068b60209383610a75565b81010312610627576106a46001600160a01b0397610c17565b90610346565b3d915061067e565b6106bb87610d7d565b98610317565b6106ca88610d7d565b936102d1565b90925060e0813d60e011610759575b816106ec60e09383610a75565b810103126106275780516001600160a01b038116036106275760c061071360208301610bdd565b9161072060408201610c08565b5061072d60608201610c08565b5061073a60808201610c08565b5061074760a08201610c17565b5001518015150361062757913861028a565b3d91506106df565b90509361024b565b8197610243565b90506020813d6020116107a2575b8161078b60209383610a75565b810103126106275761079c90610bc9565b38610119565b3d915061077e565b94509450505050610180813d61018011610876575b816107cd6101809383610a75565b810103126106275780516bffffffffffffffffffffffff811603610627576107f760208201610bc9565b5061080460408201610bc9565b9161081160608301610bc9565b9260808301519362ffffff85168503610627576004602061083460a08701610bdd565b9361086961016061084760c08a01610bdd565b9861085460e08201610beb565b506108626101408201610beb565b5001610beb565b50929693959491506100d8565b3d91506107bf565b34610627576000366003190112610627576105aa61089a610b0c565b6040519182916020835260208301906109f3565b346106275760003660031901126106275760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346106275760403660031901126106275760206109106109076109a8565b60243590610c87565b604051908152f35b34610627576060366003190112610627576109316109a8565b6024356001600160a01b03811681036106275761095d6020926109576044358092610c87565b92610c87565b12604051908152f35b34610627576000366003190112610627576020906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b600435906001600160a01b038216820361062757565b918091926000905b8282106109de5750116109d7575050565b6000910152565b915080602091830151818601520182916109c6565b90602091610a0c815180928185528580860191016109be565b601f01601f1916010190565b6000198114610a275760010190565b634e487b7160e01b600052601160045260246000fd5b6080810190811067ffffffffffffffff8211176105dd57604052565b6020810190811067ffffffffffffffff8211176105dd57604052565b90601f8019910116810190811067ffffffffffffffff8211176105dd57604052565b67ffffffffffffffff81116105dd57601f01601f191660200190565b90610abd82610a97565b610aca6040519182610a75565b8281528092610adb601f1991610a97565b0190602036910137565b908151811015610af6570160200190565b634e487b7160e01b600052603260045260246000fd5b60005b6020811080610b8d575b15610b2c57610b2790610a18565b610b0f565b610b3581610ab3565b907f00000000000000000000000000000000000000000000000000000000000000009060005b818110610b685750505090565b6020811015610af6578083610b88921a610b828287610ae5565b53610a18565b610b5b565b15610af6576001600160f81b03197f0000000000000000000000000000000000000000000000000000000000000000821a60f81b161515610b19565b51906001600160a01b038216820361062757565b51908160020b820361062757565b51906fffffffffffffffffffffffffffffffff8216820361062757565b519061ffff8216820361062757565b519060ff8216820361062757565b6020818303126106275780519067ffffffffffffffff8211610627570181601f82011215610627578051610c5881610a97565b92610c666040519485610a75565b8184526020828401011161062757610c8491602080850191016109be565b90565b906001600160a01b03809216917f0000000000000000000000000000000000000000000000000000000000000000168214610d7557600114610cc95750600090565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488103610ceb575061012c90565b73dac17f958d2ee523a2206206994597c13d831ec78103610d0c575060c890565b736b175474e89094c44da98b954eedeac495271d0f8103610d2d5750606490565b738daebade922df735c38c80c7ebd708af50815faa8103610d4f575060c71990565b732260fac5e5542a773aa44fbcfedf7c193bc2c59903610d705761012b1990565b600090565b505060631990565b610d8681610f10565b90815115610d92575090565b6040805193925083019067ffffffffffffffff8211848310176105dd576001600160a01b03916040526006845260203681860137169060005b600380821015610e97576013828110610a2757829003906001917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81118316610a275785911b1c9060ff821660f08316808210610a2757610e5491610e36600f600496871c16610ece565b610e4d610e4288610e9e565b9160001a918b610ae5565b5303610ece565b610e5d84610e9e565b926001198411610e825750610e7d939291610b829160001a920187610ae5565b610dcb565b601190634e487b7160e01b6000525260246000fd5b5090915050565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111600116610a275760011b90565b60ff16600a811015610ef55760cf8111610a275760300160f81b6001600160f81b03191690565b60c88111610a275760370160f81b6001600160f81b03191690565b60409081519060208083017f95d89b41000000000000000000000000000000000000000000000000000000008152600484528484019367ffffffffffffffff94818110868211176105dd5786526000938492839251915afa3d156110c3573d90610f7982610a97565b91610f8687519384610a75565b82523d848484013e5b1580156110ba575b6110aa57805182810361107a575081818051810103126110765781015192845194808601918683109083111761106257528084528036818601378192825b82811061102357505050610fe882610ab3565b92815b838110610ff9575050505090565b806001600160f81b031961101061101e9385610ae5565b5116841a610b828288610ae5565b610feb565b81811a6001600160f81b03198160f81b16611048575b5061104390610a18565b610fd5565b8561105b91610b8261104394988a610ae5565b9490611039565b602484634e487b7160e01b81526041600452fd5b8280fd5b909294809450811161109957505050519061109482610a59565b815290565b610c84945082018101925001610c25565b5050919050519061109482610a59565b50805115610f97565b606090610f8f56fea164736f6c634300080f000a", + "linkReferences": { + "contracts/libraries/NFTDescriptor.sol": { + "NFTDescriptor": [ + { + "length": 20, + "start": 1577 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/libraries/NFTDescriptor.sol": { + "NFTDescriptor": [ + { + "length": 20, + "start": 1390 + } + ] + } + } +} diff --git a/src/artifacts-apeswap/dex/contracts/SwapRouter.json b/src/artifacts-apeswap/dex/contracts/SwapRouter.json new file mode 100644 index 0000000..94fdaa3 --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/SwapRouter.json @@ -0,0 +1,574 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SwapRouter", + "sourceName": "contracts/SwapRouter.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH9", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "WETH9", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMinimum", + "type": "uint256" + } + ], + "internalType": "struct ISwapRouter.ExactInputParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactInput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMinimum", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "internalType": "struct ISwapRouter.ExactInputSingleParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactInputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMaximum", + "type": "uint256" + } + ], + "internalType": "struct ISwapRouter.ExactOutputParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactOutput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMaximum", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "internalType": "struct ISwapRouter.ExactOutputSingleParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactOutputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "refundETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitAllowed", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitAllowedIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "sweepTokenWithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "amount0Delta", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1Delta", + "type": "int256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "uniswapV3SwapCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "unwrapWETH9WithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60c06040526000196000553480156200001757600080fd5b506040516200318a3803806200318a8339810160408190526200003a916200006f565b6001600160a01b039182166080521660a052620000a7565b80516001600160a01b03811681146200006a57600080fd5b919050565b600080604083850312156200008357600080fd5b6200008e8362000052565b91506200009e6020840162000052565b90509250929050565b60805160a051613077620001136000396000818161012f0152818161022801528181610670015281816107910152818161085c0152818161097d01528181611ce201528181611d420152611e0a0152600081816102ed015281816115450152611ec101526130776000f3fe6080604052600436106101125760003560e01c8063c04b8d59116100a5578063df2ab5bb11610074578063f28c049811610059578063f28c049814610348578063f3995c671461035b578063fa461e331461036e57600080fd5b8063df2ab5bb14610322578063e0e189a01461033557600080fd5b8063c04b8d59146102b5578063c2e3140a146102c8578063c45a0155146102db578063db3e21981461030f57600080fd5b80634aa4a4fc116100e15780634aa4a4fc146102165780639b2c0a371461026f578063a4a78f0c14610282578063ac9650d81461029557600080fd5b806312210e8a146101c2578063414bf389146101ca5780634659a494146101f057806349404b7c1461020357600080fd5b366101bd573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74205745544839000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b6101bb61038e565b6101dd6101d83660046125c7565b6103a0565b6040519081526020015b60405180910390f35b6101bb6101fe366004612610565b610584565b6101bb610211366004612672565b61063f565b34801561022257600080fd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e7565b6101bb61027d3660046126a2565b610811565b6101bb610290366004612610565b610a37565b6102a86102a33660046126ec565b610b01565b6040516101e791906127d7565b6101dd6102c336600461299a565b610c73565b6101bb6102d6366004612610565b610dfc565b3480156102e757600080fd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd61031d3660046125c7565b610ea6565b6101bb610330366004612a3e565b6110b1565b6101bb610343366004612a80565b6111c5565b6101dd610356366004612adf565b61132b565b6101bb610369366004612610565b611483565b34801561037a57600080fd5b506101bb610389366004612b1a565b611500565b471561039e5761039e3347611647565b565b6000608082013580421115610411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b61050e60a08401356104296080860160608701612b9a565b61043a610100870160e08801612b9a565b604080518082019091528061045260208a018a612b9a565b61046260608b0160408c01612bb7565b61047260408c0160208d01612b9a565b604051606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602083015260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166034820152921b166037820152604b0160405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff1681525061172b565b91508260c0013582101561057e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f546f6f206c6974746c652072656365697665640000000000000000000000000060448201526064016101b2565b50919050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b15801561061f57600080fd5b505af1158015610633573d6000803e3d6000fd5b50505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156106cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f09190612bdc565b90508281101561075c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e74205745544839000000000000000000000000000060448201526064016101b2565b801561080c576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156107ea57600080fd5b505af11580156107fe573d6000803e3d6000fd5b5050505061080c8282611647565b505050565b600082118015610822575060648211155b61082b57600080fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc9190612bdc565b905084811015610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e74205745544839000000000000000000000000000060448201526064016101b2565b8015610a30576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156109d657600080fd5b505af11580156109ea573d6000803e3d6000fd5b50505050600061271084836109ff9190612c24565b610a099190612c61565b90508015610a1b57610a1b8382611647565b610a2e85610a298385612c9c565b611647565b505b5050505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015610ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aed9190612bdc565b1015610a2e57610a2e868686868686610584565b60608167ffffffffffffffff811115610b1c57610b1c612857565b604051908082528060200260200182016040528015610b4f57816020015b6060815260200190600190039081610b3a5790505b50905060005b82811015610c6c5760008030868685818110610b7357610b73612cb3565b9050602002810190610b859190612ce2565b604051610b93929190612d4e565b600060405180830381855af49150503d8060008114610bce576040519150601f19603f3d011682016040523d82523d6000602084013e610bd3565b606091505b509150915081610c3957604481511015610bec57600080fd5b60048101905080806020019051810190610c069190612d5e565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b29190612dcc565b80848481518110610c4c57610c4c612cb3565b602002602001018190525050508080610c6490612ddf565b915050610b55565b5092915050565b6000816040015180610c824290565b1115610cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b335b6000610cfb85600001516118bb565b9050610d54856060015182610d14578660200151610d16565b305b60006040518060400160405280610d308b600001516118f5565b81526020018773ffffffffffffffffffffffffffffffffffffffff1681525061172b565b60608601528015610d74578451309250610d6d90611921565b8552610d81565b8460600151935050610d87565b50610cec565b8360800151831015610df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f546f6f206c6974746c652072656365697665640000000000000000000000000060448201526064016101b2565b5050919050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612bdc565b1015610a2e57610a2e868686868686611483565b6000608082013580421115610f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b61101760a0840135610f2f6080860160608701612b9a565b610f40610100870160e08801612b9a565b6040518060400160405280886020016020810190610f5e9190612b9a565b610f6e60608b0160408c01612bb7565b610f7b60208c018c612b9a565b604051606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602083015260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166034820152921b166037820152604b0160405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff1681525061194a565b91508260c00135821115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f546f6f206d75636820726571756573746564000000000000000000000000000060448201526064016101b2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa15801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190612bdc565b9050828110156111ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e000000000000000000000000000060448201526064016101b2565b80156111bf576111bf848383611b1c565b50505050565b6000821180156111d6575060648211155b6111df57600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190612bdc565b9050848110156112dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e000000000000000000000000000060448201526064016101b2565b8015610a2e5760006127106112f18584612c24565b6112fb9190612c61565b9050801561130e5761130e878483611b1c565b611322878661131d8486612c9c565b611b1c565b50505050505050565b600060408201358042111561139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b61140f60608401356113b46040860160208701612b9a565b60408051808201909152600090806113cc8980612ce2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360209091015261194a565b5060005491508260800135821115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f546f6f206d75636820726571756573746564000000000000000000000000000060448201526064016101b2565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610605565b600084138061150f5750600083135b61151857600080fd5b600061152682840184612e17565b9050600080600061153a8460000151611c85565b92509250925061156c7f0000000000000000000000000000000000000000000000000000000000000000848484611cc1565b5060008060008a136115ad578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610896115de565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b9150915081156115fd576115f88587602001513384611ce0565b610633565b8551611608906118bb565b1561162d57855161161890611921565b8652611627813360008961194a565b50610633565b806000819055508394506106338587602001513384611ce0565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161167e9190612eb1565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b505090508061080c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f535445000000000000000000000000000000000000000000000000000000000060448201526064016101b2565b600073ffffffffffffffffffffffffffffffffffffffff841661174c573093505b600080600061175e8560000151611c85565b9194509250905073ffffffffffffffffffffffffffffffffffffffff8083169084161060008061178f868686611eba565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856117b58f611ef8565b73ffffffffffffffffffffffffffffffffffffffff8e16156117d7578d611810565b87611800576117fb600173fffd8963efd1fc6a506488495d951d5263988d26612ecd565b611810565b6118106401000276a36001612f02565b8d6040516020016118219190612f3a565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611850959493929190612f82565b60408051808303816000875af115801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190612fd4565b91509150826118a157816118a3565b805b6118ac90612ff8565b9b9a5050505050505050505050565b60006118c960036014613030565b60146118d6600382613030565b6118e09190613030565b6118ea9190613030565b825110159050919050565b606061191b60006014611909600382613030565b6119139190613030565b849190611f2a565b92915050565b606061191b61193260036014613030565b61193e60036014613030565b84516119139190612c9c565b600073ffffffffffffffffffffffffffffffffffffffff841661196b573093505b600080600061197d8560000151611c85565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808416908316106000806119ae858786611eba565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856119d48f611ef8565b6119dd90612ff8565b73ffffffffffffffffffffffffffffffffffffffff8e16156119ff578d611a38565b87611a2857611a23600173fffd8963efd1fc6a506488495d951d5263988d26612ecd565b611a38565b611a386401000276a36001612f02565b8d604051602001611a499190612f3a565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611a78959493929190612f82565b60408051808303816000875af1158015611a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aba9190612fd4565b91509150600083611ad45781611acf84612ff8565b611ade565b82611ade83612ff8565b909850905073ffffffffffffffffffffffffffffffffffffffff8a16600003611b0d578b8114611b0d57600080fd5b50505050505050949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691611bb39190612eb1565b6000604051808303816000865af19150503d8060008114611bf0576040519150601f19603f3d011682016040523d82523d6000602084013e611bf5565b606091505b5091509150818015611c1f575080511580611c1f575080806020019051810190611c1f9190613048565b610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016101b2565b60008080611c9384826120a4565b9250611ca0846014612134565b9050611cb8611cb160036014613030565b85906120a4565b91509193909250565b6000611cd785611cd2868686612228565b6122ba565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611d3b5750804710155b15611e81577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611da857600080fd5b505af1158015611dbc573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b9190613048565b506111bf565b3073ffffffffffffffffffffffffffffffffffffffff841603611eae57611ea9848383611b1c565b6111bf565b6111bf848484846122ea565b6000611ef07f0000000000000000000000000000000000000000000000000000000000000000611eeb868686612228565b61245b565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210611f2657600080fd5b5090565b606081611f3881601f613030565b1015611fa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101b2565b611faa8284613030565b84511015612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101b2565b606082158015612033576040519150600082526020820160405261209b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561206c578051835260209283019201612054565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60006120b1826014613030565b8351101561211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e6473000000000000000000000060448201526064016101b2565b5001602001516c01000000000000000000000000900490565b600081612142816003613030565b10156121aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f7700000000000000000000000000000060448201526064016101b2565b6121b5826003613030565b8351101561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e647300000000000000000000000060448201526064016101b2565b50016003015190565b60408051606081018252600080825260208201819052918101919091528273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16111561227d579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b60006122c6838361245b565b90503373ffffffffffffffffffffffffffffffffffffffff82161461191b57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916123899190612eb1565b6000604051808303816000865af19150503d80600081146123c6576040519150601f19603f3d011682016040523d82523d6000602084013e6123cb565b606091505b50915091508180156123f55750805115806123f55750808060200190518101906123f59190613048565b610a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f535446000000000000000000000000000000000000000000000000000000000060448201526064016101b2565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061249d57600080fd5b8151602080840151604080860151815173ffffffffffffffffffffffffffffffffffffffff95861681860152949092168482015262ffffff90911660608085019190915281518085038201815260808501909252815191909201207fff0000000000000000000000000000000000000000000000000000000000000060a08401529085901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201527fa598dd2fba360510c5a8f02f44423a4468e902df5857dbce3ca162a43a3a31ff60d582015260f501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000610100828403121561057e57600080fd5b600061010082840312156125da57600080fd5b6125e483836125b4565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461260d57600080fd5b50565b60008060008060008060c0878903121561262957600080fd5b8635612634816125eb565b95506020870135945060408701359350606087013560ff8116811461265857600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561268557600080fd5b823591506020830135612697816125eb565b809150509250929050565b600080600080608085870312156126b857600080fd5b8435935060208501356126ca816125eb565b92506040850135915060608501356126e1816125eb565b939692955090935050565b600080602083850312156126ff57600080fd5b823567ffffffffffffffff8082111561271757600080fd5b818501915085601f83011261272b57600080fd5b81358181111561273a57600080fd5b8660208260051b850101111561274f57600080fd5b60209290920196919550909350505050565b60005b8381101561277c578181015183820152602001612764565b838111156111bf5750506000910152565b600081518084526127a5816020860160208601612761565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561284a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261283885835161278d565b945092850192908501906001016127fe565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156128a9576128a9612857565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128f6576128f6612857565b604052919050565b600067ffffffffffffffff82111561291857612918612857565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261295557600080fd5b8135612968612963826128fe565b6128af565b81815284602083860101111561297d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156129ac57600080fd5b813567ffffffffffffffff808211156129c457600080fd5b9083019060a082860312156129d857600080fd5b6129e0612886565b8235828111156129ef57600080fd5b6129fb87828601612944565b82525060208301359150612a0e826125eb565b81602082015260408301356040820152606083013560608201526080830135608082015280935050505092915050565b600080600060608486031215612a5357600080fd5b8335612a5e816125eb565b9250602084013591506040840135612a75816125eb565b809150509250925092565b600080600080600060a08688031215612a9857600080fd5b8535612aa3816125eb565b9450602086013593506040860135612aba816125eb565b9250606086013591506080860135612ad1816125eb565b809150509295509295909350565b600060208284031215612af157600080fd5b813567ffffffffffffffff811115612b0857600080fd5b820160a081850312156125e457600080fd5b60008060008060608587031215612b3057600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115612b5657600080fd5b818701915087601f830112612b6a57600080fd5b813581811115612b7957600080fd5b886020828501011115612b8b57600080fd5b95989497505060200194505050565b600060208284031215612bac57600080fd5b81356125e4816125eb565b600060208284031215612bc957600080fd5b813562ffffff811681146125e457600080fd5b600060208284031215612bee57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c5c57612c5c612bf5565b500290565b600082612c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082821015612cae57612cae612bf5565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612d1757600080fd5b83018035915067ffffffffffffffff821115612d3257600080fd5b602001915036819003821315612d4757600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215612d7057600080fd5b815167ffffffffffffffff811115612d8757600080fd5b8201601f81018413612d9857600080fd5b8051612da6612963826128fe565b818152856020838501011115612dbb57600080fd5b611cd7826020830160208601612761565b6020815260006125e4602083018461278d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e1057612e10612bf5565b5060010190565b600060208284031215612e2957600080fd5b813567ffffffffffffffff80821115612e4157600080fd5b9083019060408286031215612e5557600080fd5b604051604081018181108382111715612e7057612e70612857565b604052823582811115612e8257600080fd5b612e8e87828601612944565b82525060208301359250612ea1836125eb565b6020810192909252509392505050565b60008251612ec3818460208701612761565b9190910192915050565b600073ffffffffffffffffffffffffffffffffffffffff83811690831681811015612efa57612efa612bf5565b039392505050565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115612f3157612f31612bf5565b01949350505050565b602081526000825160406020840152612f56606084018261278d565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152612fc960a083018461278d565b979650505050505050565b60008060408385031215612fe757600080fd5b505080516020909101519092909150565b60007f8000000000000000000000000000000000000000000000000000000000000000820361302957613029612bf5565b5060000390565b6000821982111561304357613043612bf5565b500190565b60006020828403121561305a57600080fd5b815180151581146125e457600080fdfea164736f6c634300080f000a", + "deployedBytecode": "0x6080604052600436106101125760003560e01c8063c04b8d59116100a5578063df2ab5bb11610074578063f28c049811610059578063f28c049814610348578063f3995c671461035b578063fa461e331461036e57600080fd5b8063df2ab5bb14610322578063e0e189a01461033557600080fd5b8063c04b8d59146102b5578063c2e3140a146102c8578063c45a0155146102db578063db3e21981461030f57600080fd5b80634aa4a4fc116100e15780634aa4a4fc146102165780639b2c0a371461026f578063a4a78f0c14610282578063ac9650d81461029557600080fd5b806312210e8a146101c2578063414bf389146101ca5780634659a494146101f057806349404b7c1461020357600080fd5b366101bd573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74205745544839000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b6101bb61038e565b6101dd6101d83660046125c7565b6103a0565b6040519081526020015b60405180910390f35b6101bb6101fe366004612610565b610584565b6101bb610211366004612672565b61063f565b34801561022257600080fd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e7565b6101bb61027d3660046126a2565b610811565b6101bb610290366004612610565b610a37565b6102a86102a33660046126ec565b610b01565b6040516101e791906127d7565b6101dd6102c336600461299a565b610c73565b6101bb6102d6366004612610565b610dfc565b3480156102e757600080fd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd61031d3660046125c7565b610ea6565b6101bb610330366004612a3e565b6110b1565b6101bb610343366004612a80565b6111c5565b6101dd610356366004612adf565b61132b565b6101bb610369366004612610565b611483565b34801561037a57600080fd5b506101bb610389366004612b1a565b611500565b471561039e5761039e3347611647565b565b6000608082013580421115610411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b61050e60a08401356104296080860160608701612b9a565b61043a610100870160e08801612b9a565b604080518082019091528061045260208a018a612b9a565b61046260608b0160408c01612bb7565b61047260408c0160208d01612b9a565b604051606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602083015260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166034820152921b166037820152604b0160405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff1681525061172b565b91508260c0013582101561057e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f546f6f206c6974746c652072656365697665640000000000000000000000000060448201526064016101b2565b50919050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b15801561061f57600080fd5b505af1158015610633573d6000803e3d6000fd5b50505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156106cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f09190612bdc565b90508281101561075c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e74205745544839000000000000000000000000000060448201526064016101b2565b801561080c576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156107ea57600080fd5b505af11580156107fe573d6000803e3d6000fd5b5050505061080c8282611647565b505050565b600082118015610822575060648211155b61082b57600080fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc9190612bdc565b905084811015610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e74205745544839000000000000000000000000000060448201526064016101b2565b8015610a30576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156109d657600080fd5b505af11580156109ea573d6000803e3d6000fd5b50505050600061271084836109ff9190612c24565b610a099190612c61565b90508015610a1b57610a1b8382611647565b610a2e85610a298385612c9c565b611647565b505b5050505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015610ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aed9190612bdc565b1015610a2e57610a2e868686868686610584565b60608167ffffffffffffffff811115610b1c57610b1c612857565b604051908082528060200260200182016040528015610b4f57816020015b6060815260200190600190039081610b3a5790505b50905060005b82811015610c6c5760008030868685818110610b7357610b73612cb3565b9050602002810190610b859190612ce2565b604051610b93929190612d4e565b600060405180830381855af49150503d8060008114610bce576040519150601f19603f3d011682016040523d82523d6000602084013e610bd3565b606091505b509150915081610c3957604481511015610bec57600080fd5b60048101905080806020019051810190610c069190612d5e565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b29190612dcc565b80848481518110610c4c57610c4c612cb3565b602002602001018190525050508080610c6490612ddf565b915050610b55565b5092915050565b6000816040015180610c824290565b1115610cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b335b6000610cfb85600001516118bb565b9050610d54856060015182610d14578660200151610d16565b305b60006040518060400160405280610d308b600001516118f5565b81526020018773ffffffffffffffffffffffffffffffffffffffff1681525061172b565b60608601528015610d74578451309250610d6d90611921565b8552610d81565b8460600151935050610d87565b50610cec565b8360800151831015610df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f546f6f206c6974746c652072656365697665640000000000000000000000000060448201526064016101b2565b5050919050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612bdc565b1015610a2e57610a2e868686868686611483565b6000608082013580421115610f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b61101760a0840135610f2f6080860160608701612b9a565b610f40610100870160e08801612b9a565b6040518060400160405280886020016020810190610f5e9190612b9a565b610f6e60608b0160408c01612bb7565b610f7b60208c018c612b9a565b604051606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116602083015260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166034820152921b166037820152604b0160405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff1681525061194a565b91508260c00135821115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f546f6f206d75636820726571756573746564000000000000000000000000000060448201526064016101b2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa15801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190612bdc565b9050828110156111ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e000000000000000000000000000060448201526064016101b2565b80156111bf576111bf848383611b1c565b50505050565b6000821180156111d6575060648211155b6111df57600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190612bdc565b9050848110156112dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e000000000000000000000000000060448201526064016101b2565b8015610a2e5760006127106112f18584612c24565b6112fb9190612c61565b9050801561130e5761130e878483611b1c565b611322878661131d8486612c9c565b611b1c565b50505050505050565b600060408201358042111561139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c640000000000000000000000000060448201526064016101b2565b61140f60608401356113b46040860160208701612b9a565b60408051808201909152600090806113cc8980612ce2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360209091015261194a565b5060005491508260800135821115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f546f6f206d75636820726571756573746564000000000000000000000000000060448201526064016101b2565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610605565b600084138061150f5750600083135b61151857600080fd5b600061152682840184612e17565b9050600080600061153a8460000151611c85565b92509250925061156c7f0000000000000000000000000000000000000000000000000000000000000000848484611cc1565b5060008060008a136115ad578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610896115de565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b9150915081156115fd576115f88587602001513384611ce0565b610633565b8551611608906118bb565b1561162d57855161161890611921565b8652611627813360008961194a565b50610633565b806000819055508394506106338587602001513384611ce0565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161167e9190612eb1565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b505090508061080c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f535445000000000000000000000000000000000000000000000000000000000060448201526064016101b2565b600073ffffffffffffffffffffffffffffffffffffffff841661174c573093505b600080600061175e8560000151611c85565b9194509250905073ffffffffffffffffffffffffffffffffffffffff8083169084161060008061178f868686611eba565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856117b58f611ef8565b73ffffffffffffffffffffffffffffffffffffffff8e16156117d7578d611810565b87611800576117fb600173fffd8963efd1fc6a506488495d951d5263988d26612ecd565b611810565b6118106401000276a36001612f02565b8d6040516020016118219190612f3a565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611850959493929190612f82565b60408051808303816000875af115801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190612fd4565b91509150826118a157816118a3565b805b6118ac90612ff8565b9b9a5050505050505050505050565b60006118c960036014613030565b60146118d6600382613030565b6118e09190613030565b6118ea9190613030565b825110159050919050565b606061191b60006014611909600382613030565b6119139190613030565b849190611f2a565b92915050565b606061191b61193260036014613030565b61193e60036014613030565b84516119139190612c9c565b600073ffffffffffffffffffffffffffffffffffffffff841661196b573093505b600080600061197d8560000151611c85565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808416908316106000806119ae858786611eba565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856119d48f611ef8565b6119dd90612ff8565b73ffffffffffffffffffffffffffffffffffffffff8e16156119ff578d611a38565b87611a2857611a23600173fffd8963efd1fc6a506488495d951d5263988d26612ecd565b611a38565b611a386401000276a36001612f02565b8d604051602001611a499190612f3a565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611a78959493929190612f82565b60408051808303816000875af1158015611a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aba9190612fd4565b91509150600083611ad45781611acf84612ff8565b611ade565b82611ade83612ff8565b909850905073ffffffffffffffffffffffffffffffffffffffff8a16600003611b0d578b8114611b0d57600080fd5b50505050505050949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691611bb39190612eb1565b6000604051808303816000865af19150503d8060008114611bf0576040519150601f19603f3d011682016040523d82523d6000602084013e611bf5565b606091505b5091509150818015611c1f575080511580611c1f575080806020019051810190611c1f9190613048565b610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016101b2565b60008080611c9384826120a4565b9250611ca0846014612134565b9050611cb8611cb160036014613030565b85906120a4565b91509193909250565b6000611cd785611cd2868686612228565b6122ba565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611d3b5750804710155b15611e81577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611da857600080fd5b505af1158015611dbc573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b9190613048565b506111bf565b3073ffffffffffffffffffffffffffffffffffffffff841603611eae57611ea9848383611b1c565b6111bf565b6111bf848484846122ea565b6000611ef07f0000000000000000000000000000000000000000000000000000000000000000611eeb868686612228565b61245b565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210611f2657600080fd5b5090565b606081611f3881601f613030565b1015611fa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016101b2565b611faa8284613030565b84511015612014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016101b2565b606082158015612033576040519150600082526020820160405261209b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561206c578051835260209283019201612054565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60006120b1826014613030565b8351101561211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e6473000000000000000000000060448201526064016101b2565b5001602001516c01000000000000000000000000900490565b600081612142816003613030565b10156121aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f7700000000000000000000000000000060448201526064016101b2565b6121b5826003613030565b8351101561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e647300000000000000000000000060448201526064016101b2565b50016003015190565b60408051606081018252600080825260208201819052918101919091528273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16111561227d579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b60006122c6838361245b565b90503373ffffffffffffffffffffffffffffffffffffffff82161461191b57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916123899190612eb1565b6000604051808303816000865af19150503d80600081146123c6576040519150601f19603f3d011682016040523d82523d6000602084013e6123cb565b606091505b50915091508180156123f55750805115806123f55750808060200190518101906123f59190613048565b610a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f535446000000000000000000000000000000000000000000000000000000000060448201526064016101b2565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061249d57600080fd5b8151602080840151604080860151815173ffffffffffffffffffffffffffffffffffffffff95861681860152949092168482015262ffffff90911660608085019190915281518085038201815260808501909252815191909201207fff0000000000000000000000000000000000000000000000000000000000000060a08401529085901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201527fa598dd2fba360510c5a8f02f44423a4468e902df5857dbce3ca162a43a3a31ff60d582015260f501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000610100828403121561057e57600080fd5b600061010082840312156125da57600080fd5b6125e483836125b4565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461260d57600080fd5b50565b60008060008060008060c0878903121561262957600080fd5b8635612634816125eb565b95506020870135945060408701359350606087013560ff8116811461265857600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561268557600080fd5b823591506020830135612697816125eb565b809150509250929050565b600080600080608085870312156126b857600080fd5b8435935060208501356126ca816125eb565b92506040850135915060608501356126e1816125eb565b939692955090935050565b600080602083850312156126ff57600080fd5b823567ffffffffffffffff8082111561271757600080fd5b818501915085601f83011261272b57600080fd5b81358181111561273a57600080fd5b8660208260051b850101111561274f57600080fd5b60209290920196919550909350505050565b60005b8381101561277c578181015183820152602001612764565b838111156111bf5750506000910152565b600081518084526127a5816020860160208601612761565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561284a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261283885835161278d565b945092850192908501906001016127fe565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156128a9576128a9612857565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128f6576128f6612857565b604052919050565b600067ffffffffffffffff82111561291857612918612857565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261295557600080fd5b8135612968612963826128fe565b6128af565b81815284602083860101111561297d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156129ac57600080fd5b813567ffffffffffffffff808211156129c457600080fd5b9083019060a082860312156129d857600080fd5b6129e0612886565b8235828111156129ef57600080fd5b6129fb87828601612944565b82525060208301359150612a0e826125eb565b81602082015260408301356040820152606083013560608201526080830135608082015280935050505092915050565b600080600060608486031215612a5357600080fd5b8335612a5e816125eb565b9250602084013591506040840135612a75816125eb565b809150509250925092565b600080600080600060a08688031215612a9857600080fd5b8535612aa3816125eb565b9450602086013593506040860135612aba816125eb565b9250606086013591506080860135612ad1816125eb565b809150509295509295909350565b600060208284031215612af157600080fd5b813567ffffffffffffffff811115612b0857600080fd5b820160a081850312156125e457600080fd5b60008060008060608587031215612b3057600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115612b5657600080fd5b818701915087601f830112612b6a57600080fd5b813581811115612b7957600080fd5b886020828501011115612b8b57600080fd5b95989497505060200194505050565b600060208284031215612bac57600080fd5b81356125e4816125eb565b600060208284031215612bc957600080fd5b813562ffffff811681146125e457600080fd5b600060208284031215612bee57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c5c57612c5c612bf5565b500290565b600082612c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082821015612cae57612cae612bf5565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612d1757600080fd5b83018035915067ffffffffffffffff821115612d3257600080fd5b602001915036819003821315612d4757600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215612d7057600080fd5b815167ffffffffffffffff811115612d8757600080fd5b8201601f81018413612d9857600080fd5b8051612da6612963826128fe565b818152856020838501011115612dbb57600080fd5b611cd7826020830160208601612761565b6020815260006125e4602083018461278d565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e1057612e10612bf5565b5060010190565b600060208284031215612e2957600080fd5b813567ffffffffffffffff80821115612e4157600080fd5b9083019060408286031215612e5557600080fd5b604051604081018181108382111715612e7057612e70612857565b604052823582811115612e8257600080fd5b612e8e87828601612944565b82525060208301359250612ea1836125eb565b6020810192909252509392505050565b60008251612ec3818460208701612761565b9190910192915050565b600073ffffffffffffffffffffffffffffffffffffffff83811690831681811015612efa57612efa612bf5565b039392505050565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115612f3157612f31612bf5565b01949350505050565b602081526000825160406020840152612f56606084018261278d565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152612fc960a083018461278d565b979650505050505050565b60008060408385031215612fe757600080fd5b505080516020909101519092909150565b60007f8000000000000000000000000000000000000000000000000000000000000000820361302957613029612bf5565b5060000390565b6000821982111561304357613043612bf5565b500190565b60006020828403121561305a57600080fd5b815180151581146125e457600080fdfea164736f6c634300080f000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/artifacts-apeswap/dex/contracts/UniswapV3Factory.json b/src/artifacts-apeswap/dex/contracts/UniswapV3Factory.json new file mode 100644 index 0000000..f6b5f4d --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/UniswapV3Factory.json @@ -0,0 +1,245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "UniswapV3Factory", + "sourceName": "contracts/UniswapV3Factory.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickSpacing", + "type": "int24" + } + ], + "name": "FeeAmountEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tickSpacing", + "type": "int24" + }, + { + "indexed": false, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + } + ], + "name": "createPool", + "outputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "int24", + "name": "tickSpacing", + "type": "int24" + } + ], + "name": "enableFeeAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint24", + "name": "", + "type": "uint24" + } + ], + "name": "feeAmountTickSpacing", + "outputs": [ + { + "internalType": "int24", + "name": "", + "type": "int24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint24", + "name": "", + "type": "uint24" + } + ], + "name": "getPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "parameters", + "outputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "int24", + "name": "tickSpacing", + "type": "int24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b5030608052600380546001600160a01b031916339081179091556040516000907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908290a36101f4600081815260046020527ffb8cf1d12598d1a039dd1d106665851a96aadf67d0d9ed76fceea282119208b7805462ffffff1916600a90811790915560405190929160008051602061616d83398151915291a3610bb8600081815260046020527f72dffa9b822156d9cf4b0090fa0b656bcb9cc2b2c60eb6acfc20a34f54b31743805462ffffff1916603c90811790915560405190929160008051602061616d83398151915291a3612710600081815260046020527f8cc740d51daa94ff54f33bd779c2d20149f524c340519b49181be5a08615f829805462ffffff191660c890811790915560405190929160008051602061616d83398151915291a3608051615ffe61016f60003960006104ab0152615ffe6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063890357301161005b57806389035730146101245780638a7c195f146101a05780638da5cb5b146101b3578063a1671295146101c657600080fd5b806313af4035146100825780631698ee821461009757806322afcccb146100ee575b600080fd5b610095610090366004610670565b6101d9565b005b6100d16100a53660046106a5565b60056020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101116100fc3660046106e8565b60046020526000908152604090205460020b81565b60405160029190910b81526020016100e5565b6000546001546002805461015f936001600160a01b03908116938116929082169162ffffff600160a01b82041691600160b81b909104900b85565b604080516001600160a01b0396871681529486166020860152929094169183019190915262ffffff16606082015260029190910b608082015260a0016100e5565b6100956101ae366004610703565b61024c565b6003546100d1906001600160a01b031681565b6100d16101d43660046106a5565b610310565b6003546001600160a01b031633146101f057600080fd5b6003546040516001600160a01b038084169216907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b0316331461026357600080fd5b620f42408262ffffff161061027757600080fd5b60008160020b13801561028e57506140008160020b125b61029757600080fd5b62ffffff821660009081526004602052604090205460020b156102b957600080fd5b62ffffff828116600081815260046020526040808220805462ffffff1916948616949094179093559151600284900b927fc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc91a35050565b600061031a6104a0565b826001600160a01b0316846001600160a01b0316141561033957600080fd5b600080846001600160a01b0316866001600160a01b03161061035c57848661035f565b85855b90925090506001600160a01b03821661037757600080fd5b62ffffff841660009081526004602052604090205460020b8061039957600080fd5b6001600160a01b0383811660009081526005602090815260408083208685168452825280832062ffffff8a16845290915290205416156103d857600080fd5b6103e530848488856104d7565b6001600160a01b03848116600081815260056020818152604080842089871680865290835281852062ffffff8e168087529084528286208054988a166001600160a01b0319998a1681179091558287529484528286208787528452828620818752845294829020805490971684179096558051600289900b81529182019290925294985090937f783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118910160405180910390a45050509392505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d557600080fd5b565b6040805160a0810182526001600160a01b03878116808352878216602080850182905292881684860181905262ffffff888116606080880182905260028a810b6080998a0152600080546001600160a01b0319908116909817815560018054909816871790975580547fffffffffffffffffff0000000000000000000000000000000000000000000000168517600160a01b8402177fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b948c169490940293909317909255875195860193909352958401529382019390935201604051602081830303815290604052805190602001206040516105d890610647565b8190604051809103906000f59050801580156105f8573d6000803e3d6000fd5b50600080546001600160a01b0319908116909155600180549091169055600280547fffffffffffff00000000000000000000000000000000000000000000000000001690559695505050505050565b6158b18061074183390190565b80356001600160a01b038116811461066b57600080fd5b919050565b60006020828403121561068257600080fd5b61068b82610654565b9392505050565b803562ffffff8116811461066b57600080fd5b6000806000606084860312156106ba57600080fd5b6106c384610654565b92506106d160208501610654565b91506106df60408501610692565b90509250925092565b6000602082840312156106fa57600080fd5b61068b82610692565b6000806040838503121561071657600080fd5b61071f83610692565b915060208301358060020b811461073557600080fd5b80915050925092905056fe6101606040523480156200001257600080fd5b503060805260408051630890357360e41b81529051600091339163890357309160048082019260a0929091908290030181865afa15801562000058573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200007e919062000186565b62ffffff91909116610100526001600160a01b0391821660e05291811660c0529190911660a052600281900b610120529050620000c781620000db602090811b6200262e17901c565b6001600160801b0316610140525062000220565b60008082600281900b620d89e71981620000f957620000f96200020a565b05029050600083600281900b620d89e8816200011957620001196200020a565b0502905060008460020b83830360020b816200013957620001396200020a565b0560010190508062ffffff166001600160801b038016816200015f576200015f6200020a565b0495945050505050565b80516001600160a01b03811681146200018157600080fd5b919050565b600080600080600060a086880312156200019f57600080fd5b620001aa8662000169565b9450620001ba6020870162000169565b9350620001ca6040870162000169565b9250606086015162ffffff81168114620001e357600080fd5b8092505060808601518060020b8114620001fc57600080fd5b809150509295509295909350565b634e487b7160e01b600052601260045260246000fd5b60805160a05160c05160e0516101005161012051610140516155aa6200030760003960008181610485015281816142d6015261430d01526000818161056e015281816109ee0152818161434101526143730152600081816105cf01528181610aec01528181611717015261174e0152600081816105a801528181611104015281816117d101528181611bf801528181612092015261366a0152600081816101b8015281816111da015281816117a001528181611b920152818161200c015261355401526000818161054701528181611cf20152611ec5015260006126bb01526155aa6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f43146105ca578063f305839914610605578063f30dba931461060e578063f637731d146106e257600080fd5b8063c45a015514610542578063d0c93a7c14610569578063d21220a7146105a357600080fd5b8063883bdbfd116100c8578063883bdbfd146104cd578063a34123a7146104ee578063a38807f21461050157600080fd5b806370cf754a146104805780638206a4d1146104a757806385b66729146104ba57600080fd5b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146103b95780634f1eb3d8146103cc578063514ea4bf146103df5780635339c2961461046057600080fd5b80633850c7bd146102ea5780633c8a7d8d1461038f57806346141319146103a257600080fd5b80631ad8b03b1161018c5780631ad8b03b1461024a578063252c09d71461028857806332148f67146102d557600080fd5b80630dfe1681146101b3578063128acb08146101f75780631a6865021461021f575b600080fd5b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61020a610205366004614e24565b6106f5565b604080519283526020830191909152016101ee565b600454610232906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b600354610268906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016101ee565b61029b610296366004614ea9565b61133a565b6040805163ffffffff909516855260069390930b60208501526001600160a01b0390911691830191909152151560608201526080016101ee565b6102e86102e3366004614ec2565b611380565b005b60005461033e906001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b604080516001600160a01b03909816885260029690960b602088015261ffff94851695870195909552918316606086015291909116608084015260ff1660a0830152151560c082015260e0016101ee565b61020a61039d366004614f0f565b611479565b6103ab60025481565b6040519081526020016101ee565b6102e86103c7366004614f5d565b6116a6565b6102686103da366004614fc7565b611a5d565b61042a6103ed366004614ea9565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b604080516001600160801b039687168152602081019590955284019290925283166060830152909116608082015260a0016101ee565b6103ab61046e36600461502e565b60066020526000908152604090205481565b6102327f000000000000000000000000000000000000000000000000000000000000000081565b6102e86104b5366004615062565b611ca1565b6102686104c8366004615095565b611e71565b6104e06104db3660046150da565b612128565b6040516101ee92919061514f565b61020a6104fc3660046151d6565b6121af565b61051461050f366004615202565b612308565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff16908201526060016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105907f000000000000000000000000000000000000000000000000000000000000000081565b60405160029190910b81526020016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105f17f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff90911681526020016101ee565b6103ab60015481565b61068661061c36600461522c565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b604080516001600160801b039099168952600f9790970b602089015295870194909452606086019290925260060b60808501526001600160a01b031660a084015263ffffffff1660c0830152151560e0820152610100016101ee565b6102e86106f0366004615247565b6124e3565b6000806107006126b0565b8561071d57604051627ffe0360e31b815260040160405180910390fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526107b6576040516350dfbc4360e11b815260040160405180910390fd5b876108015780600001516001600160a01b0316866001600160a01b03161180156107fc575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610833565b80600001516001600160a01b0316866001600160a01b031610801561083357506401000276a36001600160a01b038716115b6108695760405162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015260640160405180910390fd5b6000805460ff60f01b191681556040805160c08101909152808a6108985760048460a0015160ff16901c6108a9565b60108460a001516108a9919061527a565b60ff1681526004546001600160801b031660208201526040014263ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c61093f57600254610943565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b8051158015906109925750886001600160a01b031681604001516001600160a01b031614155b15610ed0576040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260408201516001600160a01b031681526060820151610a13906006907f00000000000000000000000000000000000000000000000000000000000000008f6126e7565b1515604083015260020b60208201819052620d89e7191315610a3e57620d89e7196020820152610a72565b610a4b620d89e7196152b2565b60020b816020015160020b1315610a7257610a69620d89e7196152b2565b60020b60208201525b610a7f8160200151612829565b6001600160a01b031660608201526040820151610b10908d610ab9578b6001600160a01b031683606001516001600160a01b031611610ad3565b8b6001600160a01b031683606001516001600160a01b0316105b610ae1578260600151610ae3565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000000612b49565b60c085015260a084015260808301526001600160a01b031660408301528215610b7257610b468160c00151826080015101612d3b565b825103825260a0810151610b5990612d3b565b82602001818151610b6a91906152d5565b905250610bb5565b610b7f8160a00151612d3b565b825101825260c08101516080820151610ba091610b9b91615314565b612d3b565b82602001818151610bb1919061532c565b9052505b835160ff1615610c01576000846000015160ff168260c0015181610bdb57610bdb615264565b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610c4057610c348160c00151600160801b8460c001516001600160801b0316612d51565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610e9357806040015115610e6e578360a00151610cc657610ca8846040015160008760200151886040015188602001518a606001516008612e05909695949392919063ffffffff16565b6001600160a01b0316608086015260060b6060850152600160a08501525b6000610e1a82602001518e610cdd57600154610ce3565b84608001515b8f610cf2578560800151610cf6565b6002545b608089015160608a01516040808c0151600296870b6000908152600560205291909120600181018054909603909555948401805490930390925560038301805463ffffffff600160d81b66ffffffffffffff196001600160a01b03600160381b8086048216909703169095029485167fffffffffff00000000000000000000000000000000000000000000000000000084161766ffffffffffffff7fffffffffff0000000000000000000000000000000000000000ffffffffffffff8516871760060b909703969096169586178190048216909703169095027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000929092166001600160f81b031990951694909417919091171790915554600160801b9004600f0b90565b90508c15610e26576000035b600081600f0b12610e4657808360c00151610e41919061536c565b610e5e565b610e4f81615397565b8360c00151610e5e91906153b5565b6001600160801b031660c0840152505b8b610e7d578060200151610e86565b60018160200151035b60020b6060830152610eca565b80600001516001600160a01b031682604001516001600160a01b031614610eca57610ec18260400151612fb6565b60020b60608301525b5061096c565b836020015160020b816060015160020b14610fb757600080610f1e86604001518660400151886020015188602001518a606001518b6080015160086132c5909695949392919063ffffffff16565b604085015160608601516000805463ffffffff60b81b1916600160c81b61ffff9586160261ffff60b81b191617600160b81b95909416949094029290921776ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff9093169290920273ffffffffffffffffffffffffffffffffffffffff1916919091176001600160a01b0390911617905550610fe99050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b03161461102f5760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561107f57608081015160015560a08101516001600160801b03161561107a5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b6110c5565b608081015160025560a08101516001600160801b0316156110c55760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146110de57602081015181518b036110eb565b80600001518a0381602001515b90965094508a156111cc57600085121561112d5761112d7f00000000000000000000000000000000000000000000000000000000000000008d8760000361344e565b600061113761353a565b60405163fa461e3360e01b8152909150339063fa461e3390611163908a908a908e908e90600401615406565b600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b5050505061119d61353a565b6111a78883615314565b11156111c657604051635d05ca8f60e11b815260040160405180910390fd5b5061129e565b6000861215611203576112037f00000000000000000000000000000000000000000000000000000000000000008d8860000361344e565b600061120d613650565b60405163fa461e3360e01b8152909150339063fa461e3390611239908a908a908e908e90600401615406565b600060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b50505050611273613650565b61127d8783615314565b111561129c57604051635d05ca8f60e11b815260040160405180910390fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516958101959095526001600160801b039092169084015260020b60808301528d169033907fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679060a00160405180910390a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60088161ffff811061134b57600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff166113aa576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556113bf6126b0565b60008054600160d81b900461ffff16906113db6008838561369c565b6000805461ffff808416600160d81b81027fffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217909255919250831614611461576040805161ffff8085168252831660208201527fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a91015b60405180910390a15b50506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff166114a6576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556001600160801b0385166114c657600080fd5b60008061151460405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161150a8a6001600160801b031661372d565b600f0b9052613743565b925092505081935080925060008060008611156115365761153361353a565b91505b841561154757611544613650565b90505b60405163d348799760e01b8152339063d34879979061157090899089908d908d90600401615406565b600060405180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506000861180156115c157506115b561353a565b6115bf8784615314565b115b156115df5760405163748800af60e01b815260040160405180910390fd5b6000851180156115fe57506115f2613650565b6115fc8683615314565b115b1561161c57604051631072b39760e11b815260040160405180910390fd5b604080513381526001600160801b038b1660208201529081018790526060810186905260028b810b91908d900b906001600160a01b038f16907f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde9060800160405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b600054600160f01b900460ff166116d0576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556116e56126b0565b6004546001600160801b03168061170f57604051639f13f76d60e01b815260040160405180910390fd5b6000611744867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061177b867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061178761353a565b90506000611793613650565b905088156117c6576117c67f00000000000000000000000000000000000000000000000000000000000000008b8b61344e565b87156117f7576117f77f00000000000000000000000000000000000000000000000000000000000000008b8a61344e565b604051630e9cbafb60e41b8152339063e9cbafb09061182090879087908c908c90600401615406565b600060405180830381600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b50505050600061185c61353a565b90506000611868613650565b9050816118758786615314565b11156118945760405163f704e89960e01b815260040160405180910390fd5b8061189f8685615314565b11156118be5760405163e90c349360e01b815260040160405180910390fd5b8382038382038386146119545760008054600160e81b9004600f169081156118f8578160ff1684816118f2576118f2615264565b046118fb565b60005b90506001600160801b0381161561192e57600380546001600160801b038082168401166001600160801b03199091161790555b611948818503600160801b8d6001600160801b0316612d51565b60018054909101905550505b80156119e55760008054600160e81b900460041c600f1690811561198a578160ff16838161198457611984615264565b0461198d565b60005b90506001600160801b038116156119bf57600380546001600160801b03600160801b8083048216850182160291161790555b6119d9818403600160801b8d6001600160801b0316612d51565b60028054909101905550505b604080518e8152602081018e9052908101839052606081018290526001600160a01b038f169033907fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339060800160405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611a8a576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b19168155604080513360601b6bffffffffffffffffffffffff191660208083019190915260e88a811b603484015289901b60378301528251601a818403018152603a9092018352815191810191909120835260079052902060038101546001600160801b0390811690861611611b095784611b18565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611b405783611b56565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611bbb576003810180546001600160801b031981166001600160801b03918216869003821617909155611bbb907f0000000000000000000000000000000000000000000000000000000000000000908a90861661344e565b6001600160801b03821615611c21576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611c21907f0000000000000000000000000000000000000000000000000000000000000000908a90851661344e565b604080516001600160a01b038a1681526001600160801b0385811660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b600054600160f01b900460ff16611ccb576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190615430565b6001600160a01b0316336001600160a01b031614611d7e57600080fd5b60ff82161580611da1575060048260ff1610158015611da15750600a8260ff1611155b8015611dcb575060ff81161580611dcb575060048160ff1610158015611dcb5750600a8160ff1611155b611dd457600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c166020830152868316908201529084166060820152608001611458565b600080548190600160f01b900460ff16611e9e576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f349190615430565b6001600160a01b0316336001600160a01b031614611f5157600080fd5b6003546001600160801b0390811690851611611f6d5783611f7a565b6003546001600160801b03165b6003549092506001600160801b03600160801b909104811690841611611fa05782611fb4565b600354600160801b90046001600160801b03165b90506001600160801b03821615612035576003546001600160801b0383811691161415611fe357600019909101905b600380546001600160801b031981166001600160801b03918216859003821617909155612035907f0000000000000000000000000000000000000000000000000000000000000000908790851661344e565b6001600160801b038116156120bb576003546001600160801b03828116600160801b90920416141561206657600019015b600380546001600160801b03600160801b8083048216859003821602918116919091179091556120bb907f0000000000000000000000000000000000000000000000000000000000000000908790841661344e565b604080516001600160801b038085168252831660208201526001600160a01b0387169133917f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151910160405180910390a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806121336126b0565b6121a342858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b9004166139e5565b915091505b9250929050565b600080548190600160f01b900460ff166121dc576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061223590606081016122286001600160801b038a1661372d565b600003600f0b9052613743565b92509250925081600003945080600003935060008511806122565750600084115b15612291576003830180546001600160801b0380821688018116600160801b92839004821688019091169091026001600160801b0319161790555b604080516001600160801b038816815260208101879052908101859052600288810b91908a900b9033907f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c9060600160405180910390a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006123156126b0565b61231f8585613b30565b600285810b6000908152600560205260408082209287900b825281206003830154600681900b93600160381b82046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061237f57600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806123c057600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e900b13159050612462575093909403965090039350900390506124dc565b8a60020b816020015160020b12156124cd57602081015160408201516004546060840151429360009384936124ab9360089388938793919290916001600160801b031690612e05565b9a9003989098039b5050949096039290920396509091030392506124dc915050565b50949093039650039350900390505b9250925092565b6000546001600160a01b03161561250d5760405163139816ff60e31b815260040160405180910390fd5b600061251882612fb6565b604080516080808201835263ffffffff42168083526000602080850182905284860182905260016060958601819052600160f81b909317600855855160e0810187526001600160a01b038a16808252600289900b82840181905282890185905296820185905294810184905260a0810183905260c001839052815476ffffffffffffffffffffffffffffffffffffffffffffff19168417600160a01b62ffffff891602177fff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff166501000001000160c81b1790915584519283528201929092528251939450909283927f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95928290030190a150505050565b60008082600281900b620d89e7198161264957612649615264565b05029050600083600281900b620d89e88161266657612666615264565b0502905060008460020b83830360020b8161268357612683615264565b0560010190508062ffffff166001600160801b038016816126a6576126a6615264565b0495945050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146126e557600080fd5b565b60008060008460020b8660020b8161270157612701615264565b05905060008660020b12801561272e57508460020b8660020b8161272757612727615264565b0760020b15155b1561273857600019015b83156127ac57600281900b600881901d600181810b600090815260208b9052604090205461010090930760ff81169190911b8001600019019283168015159550919290918561278e57888360ff168603026127a1565b8861279882613bb6565b840360ff168603025b96505050505061281f565b600181810160020b600881901d80830b600090815260208b9052604090205461010090920760ff81169390931b60001901199182168015159550909291908561280257888360ff0360ff16866001010102612818565b888361280d83613c56565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612840578260020b612848565b8260020b6000035b9050620d89e881111561286e576040516315e4079d60e11b815260040160405180910390fd5b60006001821661288257600160801b612894565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156128c8576ffff97272373d413259a46990580e213a0260801c5b60048216156128e7576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612906576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612925576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612944576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612963576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612982576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156129a2576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156129c2576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156129e2576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612a02576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612a22576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612a42576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612a62576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612a82576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612aa3576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612ac3576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612ae2576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612aff576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612b20578060001981612b1c57612b1c615264565b0490505b640100000000810615612b34576001612b37565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590612bce576000612b828989620f42400362ffffff16620f4240612d51565b905082612b9b57612b968c8c8c6001613d40565b612ba8565b612ba88b8d8c6001613dbb565b9550858110612bb9578a9650612bc8565b612bc58c8b8386613e84565b96505b50612c18565b81612be557612be08b8b8b6000613dbb565b612bf2565b612bf28a8c8b6000613d40565b9350838860000310612c0657899550612c18565b612c158b8a8a60000385613ed0565b95505b6001600160a01b038a8116908716148215612c7b57808015612c375750815b612c4d57612c48878d8c6001613dbb565b612c4f565b855b9550808015612c5c575081155b612c7257612c6d878d8c6000613d40565b612c74565b845b9450612cc5565b808015612c855750815b612c9b57612c968c888c6001613d40565b612c9d565b855b9550808015612caa575081155b612cc057612cbb8c888c6000613dbb565b612cc2565b845b94505b81158015612cd557508860000385115b15612ce1578860000394505b818015612d0057508a6001600160a01b0316876001600160a01b031614155b15612d0f578589039350612d2c565b612d29868962ffffff168a620f42400362ffffff166139a5565b93505b50505095509550955095915050565b6000600160ff1b8210612d4d57600080fd5b5090565b600080806000198587098587029250828110838203039150508060001415612d8b5760008411612d8057600080fd5b508290049050612dfe565b808411612d9757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716612eac576000898661ffff1661ffff8110612e2c57612e2c61544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612e9857612e95818a8988613f1c565b90505b806020015181604001519250925050612faa565b868803600080612ec18c8c858c8c8c8c613fee565b91509150816000015163ffffffff168363ffffffff161415612ef3578160200151826040015194509450505050612faa565b805163ffffffff84811691161415612f1b578060200151816040015194509450505050612faa565b60008260000151826000015103905060008360000151850390508063ffffffff168263ffffffff1660060b856020015185602001510360060b81612f6157612f61615264565b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612f9957612f99615264565b048560400151019650965050505050505b97509795505050505050565b60006401000276a36001600160a01b03831610801590612ff2575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61300f576040516324c070df60e11b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106130b057607f810383901c91506130ba565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146132b657886001600160a01b031661329b82612829565b6001600160a01b031611156132b057816132b8565b806132b8565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106132e1576132e161544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561334b5788859250925050612faa565b8461ffff168461ffff1611801561336c57506001850361ffff168961ffff16145b156133795783915061337d565b8491505b8161ffff168960010161ffff168161339757613397615264565b0692506133a681898989613f1c565b8a8461ffff1661ffff81106133bd576133bd61544d565b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02959095166affffffffffffffffffffff66ffffffffffffff909216640100000000026affffffffffffffffffffff1990931663ffffffff909516949094179190911716919091179190911790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916134aa9190615463565b6000604051808303816000865af19150503d80600081146134e7576040519150601f19603f3d011682016040523d82523d6000602084013e6134ec565b606091505b5091509150818015613516575080511580613516575080806020019051810190613516919061549e565b61353357604051638b98626560e01b815260040160405180910390fd5b5050505050565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516135d89190615463565b600060405180830381855afa9150503d8060008114613613576040519150601f19603f3d011682016040523d82523d6000602084013e613618565b606091505b509150915081801561362c57506020815110155b61363557600080fd5b8080602001905181019061364991906154bb565b9250505090565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b90604401613582565b6000808361ffff16116136c257604051636b93000360e11b815260040160405180910390fd5b8261ffff168261ffff16116136d8575081612dfe565b825b8261ffff168161ffff161015613724576001858261ffff1661ffff81106137035761370361544d565b01805463ffffffff191663ffffffff929092169190911790556001016136da565b50909392505050565b80600f81900b811461373e57600080fd5b919050565b60008060006137506126b0565b61376284602001518560400151613b30565b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c0850152885190890151948901519289015193946138009491939092909190614209565b93508460600151600f0b60001461399d57846020015160020b816020015160020b12156138555761384e6138378660200151612829565b6138448760400151612829565b8760600151614439565b925061399d565b846040015160020b816020015160020b12156139735760045460408201516001600160801b03909116906138a0904260208501516060860151608087015160089493929187916132c5565b6000805463ffffffff60b81b1916600160c81b61ffff9384160261ffff60b81b191617600160b81b9390921692909202179055815160408701516138f291906138e890612829565b8860600151614439565b93506139106139048760200151612829565b83516060890151614478565b925060008660600151600f0b12613935576060860151613930908261536c565b61394d565b856060015161394390615397565b61394d90826153b5565b600480546001600160801b0319166001600160801b03929092169190911790555061399d565b61399a6139838660200151612829565b6139908760400151612829565b8760600151614478565b91505b509193909250565b60006139b2848484612d51565b9050600082806139c4576139c4615264565b8486091115612dfe5760001981106139db57600080fd5b6001019392505050565b60608060008361ffff1611613a0d57604051636b93000360e11b815260040160405180910390fd5b865167ffffffffffffffff811115613a2757613a276154d4565b604051908082528060200260200182016040528015613a50578160200160208202803683370190505b509150865167ffffffffffffffff811115613a6d57613a6d6154d4565b604051908082528060200260200182016040528015613a96578160200160208202803683370190505b50905060005b8751811015613b2357613acd8a8a8a8481518110613abc57613abc61544d565b60200260200101518a8a8a8a612e05565b848381518110613adf57613adf61544d565b60200260200101848481518110613af857613af861544d565b6001600160a01b039093166020938402919091019092019190915260069190910b9052600101613a9c565b5097509795505050505050565b8060020b8260020b12613b5657604051632fe0284f60e01b815260040160405180910390fd5b620d89e719600283900b1215613b7f5760405163135ac25d60e31b815260040160405180910390fd5b613b8c620d89e7196152b2565b60020b8160020b1315613bb25760405163d7b54ab160e01b815260040160405180910390fd5b5050565b6000808211613bc457600080fd5b600160801b8210613bd757608091821c91015b680100000000000000008210613bef57604091821c91015b6401000000008210613c0357602091821c91015b620100008210613c1557601091821c91015b6101008210613c2657600891821c91015b60108210613c3657600491821c91015b60048210613c4657600291821c91015b6002821061373e57600101919050565b6000808211613c6457600080fd5b5060ff6001600160801b03821615613c7f57607f1901613c87565b608082901c91505b67ffffffffffffffff821615613ca057603f1901613ca8565b604082901c91505b63ffffffff821615613cbd57601f1901613cc5565b602082901c91505b61ffff821615613cd857600f1901613ce0565b601082901c91505b60ff821615613cf25760071901613cfa565b600882901c91505b600f821615613d0c5760031901613d14565b600482901c91505b6003821615613d265760011901613d2e565b600282901c91505b600182161561373e5760001901919050565b6000836001600160a01b0316856001600160a01b03161115613d60579293925b81613d8d57613d88836001600160801b03168686036001600160a01b0316600160601b612d51565b613db0565b613db0836001600160801b03168686036001600160a01b0316600160601b6139a5565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115613ddb579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b038686038116908716613e1757600080fd5b83613e4d57866001600160a01b0316613e3a8383896001600160a01b0316612d51565b81613e4757613e47615264565b04613e79565b613e79613e648383896001600160a01b03166139a5565b886001600160a01b0316808204910615150190565b979650505050505050565b600080856001600160a01b031611613e9b57600080fd5b6000846001600160801b031611613eb157600080fd5b81613ec357613d8885858560016144a7565b613db0858585600161458d565b600080856001600160a01b031611613ee757600080fd5b6000846001600160801b031611613efd57600080fd5b81613f0f57613d88858585600061458d565b613db085858560006144a7565b604080516080810182526000808252602082018190529181018290526060810191909152600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b031611613f94576001613f96565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b1681613fc757613fc7615264565b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152888561ffff1661ffff811061404d5761404d61544d565b60408051608081018252919092015463ffffffff8116808352640100000000820460060b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff161515606082015292506140ac9089908961468d565b156140e4578663ffffffff16826000015163ffffffff1614156140ce57612faa565b816140db83898988613f1c565b91509150612faa565b888361ffff168660010161ffff16816140ff576140ff615264565b0661ffff1661ffff81106141155761411561544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506141c057604080516080810182528a5463ffffffff81168252640100000000810460060b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6141cf8883600001518961468d565b6141ec576040516327e8e87560e01b815260040160405180910390fd5b6141f98989898887614750565b9150915097509795505050505050565b604080516bffffffffffffffffffffffff19606088901b1660208083019190915260e887811b603484015286901b60378301528251808303601a018152603a90920183528151918101919091206000908152600790915290812060015460025491925090600080600f87900b1561439b576000805460045442929182916142c09160089186918591600160a01b820460020b9161ffff600160b81b82048116926001600160801b031691600160c81b900416612e05565b90925090506142fa60058d8b8d8b8b87898b60007f000000000000000000000000000000000000000000000000000000000000000061493a565b945061433160058c8b8d8b8b87898b60017f000000000000000000000000000000000000000000000000000000000000000061493a565b935084156143655761436560068d7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b83156143975761439760068c7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b5050505b6000806143ad60058c8c8b8a8a614b62565b90925090506143be878a8484614c09565b600089600f0b121561442a5783156143fa5760028b810b6000908152600560205260408120818155600181018290559182018190556003909101555b821561442a5760028a810b6000908152600560205260408120818155600181018290559182018190556003909101555b50505050505095945050505050565b60008082600f0b1261445a57614455610b9b8585856001613dbb565b613db3565b61446d610b9b8585856000036000613dbb565b600003949350505050565b60008082600f0b1261449457614455610b9b8585856001613d40565b61446d610b9b8585856000036000613d40565b600081156145195760006001600160a01b038411156144dd576144d884600160601b876001600160801b0316612d51565b6144f4565b6144f46001600160801b038616606086901b6154ea565b905061451161450c826001600160a01b038916615314565b614da6565b915050613db3565b60006001600160a01b038411156145475761454284600160601b876001600160801b03166139a5565b614564565b614564606085901b6001600160801b038716808204910615150190565b905080866001600160a01b03161161457b57600080fd5b6001600160a01b038616039050613db3565b60008261459b575083613db3565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614640576001600160a01b038616848102908582816145e1576145e1615264565b041415614612578181018281106146105761460683896001600160a01b0316836139a5565b9350505050613db3565b505b50614511818561462b6001600160a01b038a16836154ea565b6146359190615314565b808204910615150190565b6001600160a01b0386168481029085828161465d5761465d615264565b0414801561466a57508082115b61467357600080fd5b80820361460661450c846001600160a01b038b16846139a5565b60008363ffffffff168363ffffffff16111580156146b757508363ffffffff168263ffffffff1611155b156146d3578163ffffffff168363ffffffff1611159050612dfe565b60008463ffffffff168463ffffffff16116146fb578363ffffffff1664010000000001614703565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614734578363ffffffff166401000000000161473c565b8363ffffffff165b64ffffffffff169091111595945050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260008361ffff168560010161ffff16816147b4576147b4615264565b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816147e7576147e7615264565b0661ffff81106147f9576147f961544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061485e578060010192506147cc565b898661ffff16826001018161487557614875615264565b0661ffff81106148875761488761544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906148ec908b908b61468d565b905080801561490557506149058a8a876000015161468d565b15614910575061492d565b8061492057600182039250614927565b8160010193505b506147cc565b5050509550959350505050565b60028a900b600090815260208c90526040812080546001600160801b031682600f8c900b81136149735761496e8c8361536c565b614986565b61497c8c615397565b61498690836153b5565b9050846001600160801b0316816001600160801b031611156149bb576040516368d2be8f60e01b815260040160405180910390fd5b6001600160801b038281161590821615811415945015614a69578c60020b8e60020b13614a5157600183018b9055600283018a905560038301805466ffffffffffffff8a166001600160f81b0319909116600160381b6001600160a01b038d16027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000161717600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b03821617835585614aa3578254614a9e908d90600160801b9004600f0b6154fe565b614aba565b8254614aba908d90600160801b9004600f0b61554d565b83546001600160801b03918216600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b81614afa57614afa615264565b0760020b15614b0857600080fd5b600080614b368360020b8560020b81614b2357614b23615264565b0560020b600881901d9161010090910790565b600191820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b60008181526020899052604080822088850b83529082209193849391929184918291908a900b12614ba357505060018201546002830154614bb6565b8360010154880391508360020154870390505b6000808b60020b8b60020b1215614bd857505060018301546002840154614beb565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b614c8f5781516001600160801b0316614c8757604051632aabfc9960e11b815260040160405180910390fd5b508051614cc4565b600085600f0b12614cac578151614ca790869061536c565b614cc1565b614cb585615397565b8251614cc191906153b5565b90505b600080614ce98460200151870385600001516001600160801b0316600160801b612d51565b9150614d0d8460400151860385600001516001600160801b0316600160801b612d51565b905086600f0b600014614d345787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b038216151580614d6257506000816001600160801b0316115b15614d9c57600388018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b5050505050505050565b806001600160a01b038116811461373e57600080fd5b6001600160a01b0381168114614dd157600080fd5b50565b8015158114614dd157600080fd5b60008083601f840112614df457600080fd5b50813567ffffffffffffffff811115614e0c57600080fd5b6020830191508360208285010111156121a857600080fd5b60008060008060008060a08789031215614e3d57600080fd5b8635614e4881614dbc565b95506020870135614e5881614dd4565b9450604087013593506060870135614e6f81614dbc565b9250608087013567ffffffffffffffff811115614e8b57600080fd5b614e9789828a01614de2565b979a9699509497509295939492505050565b600060208284031215614ebb57600080fd5b5035919050565b600060208284031215614ed457600080fd5b813561ffff81168114612dfe57600080fd5b8035600281900b811461373e57600080fd5b80356001600160801b038116811461373e57600080fd5b60008060008060008060a08789031215614f2857600080fd5b8635614f3381614dbc565b9550614f4160208801614ee6565b9450614f4f60408801614ee6565b9350614e6f60608801614ef8565b600080600080600060808688031215614f7557600080fd5b8535614f8081614dbc565b94506020860135935060408601359250606086013567ffffffffffffffff811115614faa57600080fd5b614fb688828901614de2565b969995985093965092949392505050565b600080600080600060a08688031215614fdf57600080fd5b8535614fea81614dbc565b9450614ff860208701614ee6565b935061500660408701614ee6565b925061501460608701614ef8565b915061502260808701614ef8565b90509295509295909350565b60006020828403121561504057600080fd5b81358060010b8114612dfe57600080fd5b803560ff8116811461373e57600080fd5b6000806040838503121561507557600080fd5b61507e83615051565b915061508c60208401615051565b90509250929050565b6000806000606084860312156150aa57600080fd5b83356150b581614dbc565b92506150c360208501614ef8565b91506150d160408501614ef8565b90509250925092565b600080602083850312156150ed57600080fd5b823567ffffffffffffffff8082111561510557600080fd5b818501915085601f83011261511957600080fd5b81358181111561512857600080fd5b8660208260051b850101111561513d57600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b8281101561518b57815160060b8452928401929084019060010161516c565b5050508381038285015284518082528583019183019060005b818110156151c95783516001600160a01b0316835292840192918401916001016151a4565b5090979650505050505050565b6000806000606084860312156151eb57600080fd5b6151f484614ee6565b92506150c360208501614ee6565b6000806040838503121561521557600080fd5b61521e83614ee6565b915061508c60208401614ee6565b60006020828403121561523e57600080fd5b612dfe82614ee6565b60006020828403121561525957600080fd5b8135612dfe81614dbc565b634e487b7160e01b600052601260045260246000fd5b600060ff83168061528d5761528d615264565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b60008160020b627fffff198114156152cc576152cc61529c565b60000392915050565b60008083128015600160ff1b8501841216156152f3576152f361529c565b836001600160ff1b0301831381161561530e5761530e61529c565b50500390565b600082198211156153275761532761529c565b500190565b6000808212826001600160ff1b030384138115161561534d5761534d61529c565b600160ff1b83900384128116156153665761536661529c565b50500190565b60006001600160801b0380831681851680830382111561538e5761538e61529c565b01949350505050565b600081600f0b60016001607f1b03198114156152cc576152cc61529c565b60006001600160801b03838116908316818110156153d5576153d561529c565b039392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8481528360208201526060604082015260006154266060830184866153dd565b9695505050505050565b60006020828403121561544257600080fd5b8151612dfe81614dbc565b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015615484576020818601810151858301520161546a565b81811115615493576000828501525b509190910192915050565b6000602082840312156154b057600080fd5b8151612dfe81614dd4565b6000602082840312156154cd57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6000826154f9576154f9615264565b500490565b600081600f0b83600f0b600082128260016001607f1b03038213811516156155285761552861529c565b8260016001607f1b03190382128116156155445761554461529c565b50019392505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156155785761557861529c565b8160016001607f1b030183138116156155935761559361529c565b509003939250505056fea164736f6c634300080c000aa164736f6c634300080c000ac66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063890357301161005b57806389035730146101245780638a7c195f146101a05780638da5cb5b146101b3578063a1671295146101c657600080fd5b806313af4035146100825780631698ee821461009757806322afcccb146100ee575b600080fd5b610095610090366004610670565b6101d9565b005b6100d16100a53660046106a5565b60056020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101116100fc3660046106e8565b60046020526000908152604090205460020b81565b60405160029190910b81526020016100e5565b6000546001546002805461015f936001600160a01b03908116938116929082169162ffffff600160a01b82041691600160b81b909104900b85565b604080516001600160a01b0396871681529486166020860152929094169183019190915262ffffff16606082015260029190910b608082015260a0016100e5565b6100956101ae366004610703565b61024c565b6003546100d1906001600160a01b031681565b6100d16101d43660046106a5565b610310565b6003546001600160a01b031633146101f057600080fd5b6003546040516001600160a01b038084169216907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b0316331461026357600080fd5b620f42408262ffffff161061027757600080fd5b60008160020b13801561028e57506140008160020b125b61029757600080fd5b62ffffff821660009081526004602052604090205460020b156102b957600080fd5b62ffffff828116600081815260046020526040808220805462ffffff1916948616949094179093559151600284900b927fc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc91a35050565b600061031a6104a0565b826001600160a01b0316846001600160a01b0316141561033957600080fd5b600080846001600160a01b0316866001600160a01b03161061035c57848661035f565b85855b90925090506001600160a01b03821661037757600080fd5b62ffffff841660009081526004602052604090205460020b8061039957600080fd5b6001600160a01b0383811660009081526005602090815260408083208685168452825280832062ffffff8a16845290915290205416156103d857600080fd5b6103e530848488856104d7565b6001600160a01b03848116600081815260056020818152604080842089871680865290835281852062ffffff8e168087529084528286208054988a166001600160a01b0319998a1681179091558287529484528286208787528452828620818752845294829020805490971684179096558051600289900b81529182019290925294985090937f783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118910160405180910390a45050509392505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d557600080fd5b565b6040805160a0810182526001600160a01b03878116808352878216602080850182905292881684860181905262ffffff888116606080880182905260028a810b6080998a0152600080546001600160a01b0319908116909817815560018054909816871790975580547fffffffffffffffffff0000000000000000000000000000000000000000000000168517600160a01b8402177fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b948c169490940293909317909255875195860193909352958401529382019390935201604051602081830303815290604052805190602001206040516105d890610647565b8190604051809103906000f59050801580156105f8573d6000803e3d6000fd5b50600080546001600160a01b0319908116909155600180549091169055600280547fffffffffffff00000000000000000000000000000000000000000000000000001690559695505050505050565b6158b18061074183390190565b80356001600160a01b038116811461066b57600080fd5b919050565b60006020828403121561068257600080fd5b61068b82610654565b9392505050565b803562ffffff8116811461066b57600080fd5b6000806000606084860312156106ba57600080fd5b6106c384610654565b92506106d160208501610654565b91506106df60408501610692565b90509250925092565b6000602082840312156106fa57600080fd5b61068b82610692565b6000806040838503121561071657600080fd5b61071f83610692565b915060208301358060020b811461073557600080fd5b80915050925092905056fe6101606040523480156200001257600080fd5b503060805260408051630890357360e41b81529051600091339163890357309160048082019260a0929091908290030181865afa15801562000058573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200007e919062000186565b62ffffff91909116610100526001600160a01b0391821660e05291811660c0529190911660a052600281900b610120529050620000c781620000db602090811b6200262e17901c565b6001600160801b0316610140525062000220565b60008082600281900b620d89e71981620000f957620000f96200020a565b05029050600083600281900b620d89e8816200011957620001196200020a565b0502905060008460020b83830360020b816200013957620001396200020a565b0560010190508062ffffff166001600160801b038016816200015f576200015f6200020a565b0495945050505050565b80516001600160a01b03811681146200018157600080fd5b919050565b600080600080600060a086880312156200019f57600080fd5b620001aa8662000169565b9450620001ba6020870162000169565b9350620001ca6040870162000169565b9250606086015162ffffff81168114620001e357600080fd5b8092505060808601518060020b8114620001fc57600080fd5b809150509295509295909350565b634e487b7160e01b600052601260045260246000fd5b60805160a05160c05160e0516101005161012051610140516155aa6200030760003960008181610485015281816142d6015261430d01526000818161056e015281816109ee0152818161434101526143730152600081816105cf01528181610aec01528181611717015261174e0152600081816105a801528181611104015281816117d101528181611bf801528181612092015261366a0152600081816101b8015281816111da015281816117a001528181611b920152818161200c015261355401526000818161054701528181611cf20152611ec5015260006126bb01526155aa6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f43146105ca578063f305839914610605578063f30dba931461060e578063f637731d146106e257600080fd5b8063c45a015514610542578063d0c93a7c14610569578063d21220a7146105a357600080fd5b8063883bdbfd116100c8578063883bdbfd146104cd578063a34123a7146104ee578063a38807f21461050157600080fd5b806370cf754a146104805780638206a4d1146104a757806385b66729146104ba57600080fd5b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146103b95780634f1eb3d8146103cc578063514ea4bf146103df5780635339c2961461046057600080fd5b80633850c7bd146102ea5780633c8a7d8d1461038f57806346141319146103a257600080fd5b80631ad8b03b1161018c5780631ad8b03b1461024a578063252c09d71461028857806332148f67146102d557600080fd5b80630dfe1681146101b3578063128acb08146101f75780631a6865021461021f575b600080fd5b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61020a610205366004614e24565b6106f5565b604080519283526020830191909152016101ee565b600454610232906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b600354610268906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016101ee565b61029b610296366004614ea9565b61133a565b6040805163ffffffff909516855260069390930b60208501526001600160a01b0390911691830191909152151560608201526080016101ee565b6102e86102e3366004614ec2565b611380565b005b60005461033e906001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b604080516001600160a01b03909816885260029690960b602088015261ffff94851695870195909552918316606086015291909116608084015260ff1660a0830152151560c082015260e0016101ee565b61020a61039d366004614f0f565b611479565b6103ab60025481565b6040519081526020016101ee565b6102e86103c7366004614f5d565b6116a6565b6102686103da366004614fc7565b611a5d565b61042a6103ed366004614ea9565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b604080516001600160801b039687168152602081019590955284019290925283166060830152909116608082015260a0016101ee565b6103ab61046e36600461502e565b60066020526000908152604090205481565b6102327f000000000000000000000000000000000000000000000000000000000000000081565b6102e86104b5366004615062565b611ca1565b6102686104c8366004615095565b611e71565b6104e06104db3660046150da565b612128565b6040516101ee92919061514f565b61020a6104fc3660046151d6565b6121af565b61051461050f366004615202565b612308565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff16908201526060016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105907f000000000000000000000000000000000000000000000000000000000000000081565b60405160029190910b81526020016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105f17f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff90911681526020016101ee565b6103ab60015481565b61068661061c36600461522c565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b604080516001600160801b039099168952600f9790970b602089015295870194909452606086019290925260060b60808501526001600160a01b031660a084015263ffffffff1660c0830152151560e0820152610100016101ee565b6102e86106f0366004615247565b6124e3565b6000806107006126b0565b8561071d57604051627ffe0360e31b815260040160405180910390fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526107b6576040516350dfbc4360e11b815260040160405180910390fd5b876108015780600001516001600160a01b0316866001600160a01b03161180156107fc575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610833565b80600001516001600160a01b0316866001600160a01b031610801561083357506401000276a36001600160a01b038716115b6108695760405162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015260640160405180910390fd5b6000805460ff60f01b191681556040805160c08101909152808a6108985760048460a0015160ff16901c6108a9565b60108460a001516108a9919061527a565b60ff1681526004546001600160801b031660208201526040014263ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c61093f57600254610943565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b8051158015906109925750886001600160a01b031681604001516001600160a01b031614155b15610ed0576040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260408201516001600160a01b031681526060820151610a13906006907f00000000000000000000000000000000000000000000000000000000000000008f6126e7565b1515604083015260020b60208201819052620d89e7191315610a3e57620d89e7196020820152610a72565b610a4b620d89e7196152b2565b60020b816020015160020b1315610a7257610a69620d89e7196152b2565b60020b60208201525b610a7f8160200151612829565b6001600160a01b031660608201526040820151610b10908d610ab9578b6001600160a01b031683606001516001600160a01b031611610ad3565b8b6001600160a01b031683606001516001600160a01b0316105b610ae1578260600151610ae3565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000000612b49565b60c085015260a084015260808301526001600160a01b031660408301528215610b7257610b468160c00151826080015101612d3b565b825103825260a0810151610b5990612d3b565b82602001818151610b6a91906152d5565b905250610bb5565b610b7f8160a00151612d3b565b825101825260c08101516080820151610ba091610b9b91615314565b612d3b565b82602001818151610bb1919061532c565b9052505b835160ff1615610c01576000846000015160ff168260c0015181610bdb57610bdb615264565b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610c4057610c348160c00151600160801b8460c001516001600160801b0316612d51565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610e9357806040015115610e6e578360a00151610cc657610ca8846040015160008760200151886040015188602001518a606001516008612e05909695949392919063ffffffff16565b6001600160a01b0316608086015260060b6060850152600160a08501525b6000610e1a82602001518e610cdd57600154610ce3565b84608001515b8f610cf2578560800151610cf6565b6002545b608089015160608a01516040808c0151600296870b6000908152600560205291909120600181018054909603909555948401805490930390925560038301805463ffffffff600160d81b66ffffffffffffff196001600160a01b03600160381b8086048216909703169095029485167fffffffffff00000000000000000000000000000000000000000000000000000084161766ffffffffffffff7fffffffffff0000000000000000000000000000000000000000ffffffffffffff8516871760060b909703969096169586178190048216909703169095027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000929092166001600160f81b031990951694909417919091171790915554600160801b9004600f0b90565b90508c15610e26576000035b600081600f0b12610e4657808360c00151610e41919061536c565b610e5e565b610e4f81615397565b8360c00151610e5e91906153b5565b6001600160801b031660c0840152505b8b610e7d578060200151610e86565b60018160200151035b60020b6060830152610eca565b80600001516001600160a01b031682604001516001600160a01b031614610eca57610ec18260400151612fb6565b60020b60608301525b5061096c565b836020015160020b816060015160020b14610fb757600080610f1e86604001518660400151886020015188602001518a606001518b6080015160086132c5909695949392919063ffffffff16565b604085015160608601516000805463ffffffff60b81b1916600160c81b61ffff9586160261ffff60b81b191617600160b81b95909416949094029290921776ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff9093169290920273ffffffffffffffffffffffffffffffffffffffff1916919091176001600160a01b0390911617905550610fe99050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b03161461102f5760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561107f57608081015160015560a08101516001600160801b03161561107a5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b6110c5565b608081015160025560a08101516001600160801b0316156110c55760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146110de57602081015181518b036110eb565b80600001518a0381602001515b90965094508a156111cc57600085121561112d5761112d7f00000000000000000000000000000000000000000000000000000000000000008d8760000361344e565b600061113761353a565b60405163fa461e3360e01b8152909150339063fa461e3390611163908a908a908e908e90600401615406565b600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b5050505061119d61353a565b6111a78883615314565b11156111c657604051635d05ca8f60e11b815260040160405180910390fd5b5061129e565b6000861215611203576112037f00000000000000000000000000000000000000000000000000000000000000008d8860000361344e565b600061120d613650565b60405163fa461e3360e01b8152909150339063fa461e3390611239908a908a908e908e90600401615406565b600060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b50505050611273613650565b61127d8783615314565b111561129c57604051635d05ca8f60e11b815260040160405180910390fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516958101959095526001600160801b039092169084015260020b60808301528d169033907fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679060a00160405180910390a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60088161ffff811061134b57600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff166113aa576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556113bf6126b0565b60008054600160d81b900461ffff16906113db6008838561369c565b6000805461ffff808416600160d81b81027fffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217909255919250831614611461576040805161ffff8085168252831660208201527fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a91015b60405180910390a15b50506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff166114a6576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556001600160801b0385166114c657600080fd5b60008061151460405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161150a8a6001600160801b031661372d565b600f0b9052613743565b925092505081935080925060008060008611156115365761153361353a565b91505b841561154757611544613650565b90505b60405163d348799760e01b8152339063d34879979061157090899089908d908d90600401615406565b600060405180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506000861180156115c157506115b561353a565b6115bf8784615314565b115b156115df5760405163748800af60e01b815260040160405180910390fd5b6000851180156115fe57506115f2613650565b6115fc8683615314565b115b1561161c57604051631072b39760e11b815260040160405180910390fd5b604080513381526001600160801b038b1660208201529081018790526060810186905260028b810b91908d900b906001600160a01b038f16907f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde9060800160405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b600054600160f01b900460ff166116d0576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556116e56126b0565b6004546001600160801b03168061170f57604051639f13f76d60e01b815260040160405180910390fd5b6000611744867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061177b867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061178761353a565b90506000611793613650565b905088156117c6576117c67f00000000000000000000000000000000000000000000000000000000000000008b8b61344e565b87156117f7576117f77f00000000000000000000000000000000000000000000000000000000000000008b8a61344e565b604051630e9cbafb60e41b8152339063e9cbafb09061182090879087908c908c90600401615406565b600060405180830381600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b50505050600061185c61353a565b90506000611868613650565b9050816118758786615314565b11156118945760405163f704e89960e01b815260040160405180910390fd5b8061189f8685615314565b11156118be5760405163e90c349360e01b815260040160405180910390fd5b8382038382038386146119545760008054600160e81b9004600f169081156118f8578160ff1684816118f2576118f2615264565b046118fb565b60005b90506001600160801b0381161561192e57600380546001600160801b038082168401166001600160801b03199091161790555b611948818503600160801b8d6001600160801b0316612d51565b60018054909101905550505b80156119e55760008054600160e81b900460041c600f1690811561198a578160ff16838161198457611984615264565b0461198d565b60005b90506001600160801b038116156119bf57600380546001600160801b03600160801b8083048216850182160291161790555b6119d9818403600160801b8d6001600160801b0316612d51565b60028054909101905550505b604080518e8152602081018e9052908101839052606081018290526001600160a01b038f169033907fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339060800160405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611a8a576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b19168155604080513360601b6bffffffffffffffffffffffff191660208083019190915260e88a811b603484015289901b60378301528251601a818403018152603a9092018352815191810191909120835260079052902060038101546001600160801b0390811690861611611b095784611b18565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611b405783611b56565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611bbb576003810180546001600160801b031981166001600160801b03918216869003821617909155611bbb907f0000000000000000000000000000000000000000000000000000000000000000908a90861661344e565b6001600160801b03821615611c21576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611c21907f0000000000000000000000000000000000000000000000000000000000000000908a90851661344e565b604080516001600160a01b038a1681526001600160801b0385811660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b600054600160f01b900460ff16611ccb576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190615430565b6001600160a01b0316336001600160a01b031614611d7e57600080fd5b60ff82161580611da1575060048260ff1610158015611da15750600a8260ff1611155b8015611dcb575060ff81161580611dcb575060048160ff1610158015611dcb5750600a8160ff1611155b611dd457600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c166020830152868316908201529084166060820152608001611458565b600080548190600160f01b900460ff16611e9e576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f349190615430565b6001600160a01b0316336001600160a01b031614611f5157600080fd5b6003546001600160801b0390811690851611611f6d5783611f7a565b6003546001600160801b03165b6003549092506001600160801b03600160801b909104811690841611611fa05782611fb4565b600354600160801b90046001600160801b03165b90506001600160801b03821615612035576003546001600160801b0383811691161415611fe357600019909101905b600380546001600160801b031981166001600160801b03918216859003821617909155612035907f0000000000000000000000000000000000000000000000000000000000000000908790851661344e565b6001600160801b038116156120bb576003546001600160801b03828116600160801b90920416141561206657600019015b600380546001600160801b03600160801b8083048216859003821602918116919091179091556120bb907f0000000000000000000000000000000000000000000000000000000000000000908790841661344e565b604080516001600160801b038085168252831660208201526001600160a01b0387169133917f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151910160405180910390a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806121336126b0565b6121a342858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b9004166139e5565b915091505b9250929050565b600080548190600160f01b900460ff166121dc576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061223590606081016122286001600160801b038a1661372d565b600003600f0b9052613743565b92509250925081600003945080600003935060008511806122565750600084115b15612291576003830180546001600160801b0380821688018116600160801b92839004821688019091169091026001600160801b0319161790555b604080516001600160801b038816815260208101879052908101859052600288810b91908a900b9033907f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c9060600160405180910390a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006123156126b0565b61231f8585613b30565b600285810b6000908152600560205260408082209287900b825281206003830154600681900b93600160381b82046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061237f57600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806123c057600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e900b13159050612462575093909403965090039350900390506124dc565b8a60020b816020015160020b12156124cd57602081015160408201516004546060840151429360009384936124ab9360089388938793919290916001600160801b031690612e05565b9a9003989098039b5050949096039290920396509091030392506124dc915050565b50949093039650039350900390505b9250925092565b6000546001600160a01b03161561250d5760405163139816ff60e31b815260040160405180910390fd5b600061251882612fb6565b604080516080808201835263ffffffff42168083526000602080850182905284860182905260016060958601819052600160f81b909317600855855160e0810187526001600160a01b038a16808252600289900b82840181905282890185905296820185905294810184905260a0810183905260c001839052815476ffffffffffffffffffffffffffffffffffffffffffffff19168417600160a01b62ffffff891602177fff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff166501000001000160c81b1790915584519283528201929092528251939450909283927f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95928290030190a150505050565b60008082600281900b620d89e7198161264957612649615264565b05029050600083600281900b620d89e88161266657612666615264565b0502905060008460020b83830360020b8161268357612683615264565b0560010190508062ffffff166001600160801b038016816126a6576126a6615264565b0495945050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146126e557600080fd5b565b60008060008460020b8660020b8161270157612701615264565b05905060008660020b12801561272e57508460020b8660020b8161272757612727615264565b0760020b15155b1561273857600019015b83156127ac57600281900b600881901d600181810b600090815260208b9052604090205461010090930760ff81169190911b8001600019019283168015159550919290918561278e57888360ff168603026127a1565b8861279882613bb6565b840360ff168603025b96505050505061281f565b600181810160020b600881901d80830b600090815260208b9052604090205461010090920760ff81169390931b60001901199182168015159550909291908561280257888360ff0360ff16866001010102612818565b888361280d83613c56565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612840578260020b612848565b8260020b6000035b9050620d89e881111561286e576040516315e4079d60e11b815260040160405180910390fd5b60006001821661288257600160801b612894565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156128c8576ffff97272373d413259a46990580e213a0260801c5b60048216156128e7576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612906576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612925576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612944576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612963576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612982576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156129a2576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156129c2576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156129e2576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612a02576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612a22576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612a42576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612a62576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612a82576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612aa3576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612ac3576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612ae2576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612aff576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612b20578060001981612b1c57612b1c615264565b0490505b640100000000810615612b34576001612b37565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590612bce576000612b828989620f42400362ffffff16620f4240612d51565b905082612b9b57612b968c8c8c6001613d40565b612ba8565b612ba88b8d8c6001613dbb565b9550858110612bb9578a9650612bc8565b612bc58c8b8386613e84565b96505b50612c18565b81612be557612be08b8b8b6000613dbb565b612bf2565b612bf28a8c8b6000613d40565b9350838860000310612c0657899550612c18565b612c158b8a8a60000385613ed0565b95505b6001600160a01b038a8116908716148215612c7b57808015612c375750815b612c4d57612c48878d8c6001613dbb565b612c4f565b855b9550808015612c5c575081155b612c7257612c6d878d8c6000613d40565b612c74565b845b9450612cc5565b808015612c855750815b612c9b57612c968c888c6001613d40565b612c9d565b855b9550808015612caa575081155b612cc057612cbb8c888c6000613dbb565b612cc2565b845b94505b81158015612cd557508860000385115b15612ce1578860000394505b818015612d0057508a6001600160a01b0316876001600160a01b031614155b15612d0f578589039350612d2c565b612d29868962ffffff168a620f42400362ffffff166139a5565b93505b50505095509550955095915050565b6000600160ff1b8210612d4d57600080fd5b5090565b600080806000198587098587029250828110838203039150508060001415612d8b5760008411612d8057600080fd5b508290049050612dfe565b808411612d9757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716612eac576000898661ffff1661ffff8110612e2c57612e2c61544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612e9857612e95818a8988613f1c565b90505b806020015181604001519250925050612faa565b868803600080612ec18c8c858c8c8c8c613fee565b91509150816000015163ffffffff168363ffffffff161415612ef3578160200151826040015194509450505050612faa565b805163ffffffff84811691161415612f1b578060200151816040015194509450505050612faa565b60008260000151826000015103905060008360000151850390508063ffffffff168263ffffffff1660060b856020015185602001510360060b81612f6157612f61615264565b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612f9957612f99615264565b048560400151019650965050505050505b97509795505050505050565b60006401000276a36001600160a01b03831610801590612ff2575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61300f576040516324c070df60e11b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106130b057607f810383901c91506130ba565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146132b657886001600160a01b031661329b82612829565b6001600160a01b031611156132b057816132b8565b806132b8565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106132e1576132e161544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561334b5788859250925050612faa565b8461ffff168461ffff1611801561336c57506001850361ffff168961ffff16145b156133795783915061337d565b8491505b8161ffff168960010161ffff168161339757613397615264565b0692506133a681898989613f1c565b8a8461ffff1661ffff81106133bd576133bd61544d565b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02959095166affffffffffffffffffffff66ffffffffffffff909216640100000000026affffffffffffffffffffff1990931663ffffffff909516949094179190911716919091179190911790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916134aa9190615463565b6000604051808303816000865af19150503d80600081146134e7576040519150601f19603f3d011682016040523d82523d6000602084013e6134ec565b606091505b5091509150818015613516575080511580613516575080806020019051810190613516919061549e565b61353357604051638b98626560e01b815260040160405180910390fd5b5050505050565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516135d89190615463565b600060405180830381855afa9150503d8060008114613613576040519150601f19603f3d011682016040523d82523d6000602084013e613618565b606091505b509150915081801561362c57506020815110155b61363557600080fd5b8080602001905181019061364991906154bb565b9250505090565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b90604401613582565b6000808361ffff16116136c257604051636b93000360e11b815260040160405180910390fd5b8261ffff168261ffff16116136d8575081612dfe565b825b8261ffff168161ffff161015613724576001858261ffff1661ffff81106137035761370361544d565b01805463ffffffff191663ffffffff929092169190911790556001016136da565b50909392505050565b80600f81900b811461373e57600080fd5b919050565b60008060006137506126b0565b61376284602001518560400151613b30565b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c0850152885190890151948901519289015193946138009491939092909190614209565b93508460600151600f0b60001461399d57846020015160020b816020015160020b12156138555761384e6138378660200151612829565b6138448760400151612829565b8760600151614439565b925061399d565b846040015160020b816020015160020b12156139735760045460408201516001600160801b03909116906138a0904260208501516060860151608087015160089493929187916132c5565b6000805463ffffffff60b81b1916600160c81b61ffff9384160261ffff60b81b191617600160b81b9390921692909202179055815160408701516138f291906138e890612829565b8860600151614439565b93506139106139048760200151612829565b83516060890151614478565b925060008660600151600f0b12613935576060860151613930908261536c565b61394d565b856060015161394390615397565b61394d90826153b5565b600480546001600160801b0319166001600160801b03929092169190911790555061399d565b61399a6139838660200151612829565b6139908760400151612829565b8760600151614478565b91505b509193909250565b60006139b2848484612d51565b9050600082806139c4576139c4615264565b8486091115612dfe5760001981106139db57600080fd5b6001019392505050565b60608060008361ffff1611613a0d57604051636b93000360e11b815260040160405180910390fd5b865167ffffffffffffffff811115613a2757613a276154d4565b604051908082528060200260200182016040528015613a50578160200160208202803683370190505b509150865167ffffffffffffffff811115613a6d57613a6d6154d4565b604051908082528060200260200182016040528015613a96578160200160208202803683370190505b50905060005b8751811015613b2357613acd8a8a8a8481518110613abc57613abc61544d565b60200260200101518a8a8a8a612e05565b848381518110613adf57613adf61544d565b60200260200101848481518110613af857613af861544d565b6001600160a01b039093166020938402919091019092019190915260069190910b9052600101613a9c565b5097509795505050505050565b8060020b8260020b12613b5657604051632fe0284f60e01b815260040160405180910390fd5b620d89e719600283900b1215613b7f5760405163135ac25d60e31b815260040160405180910390fd5b613b8c620d89e7196152b2565b60020b8160020b1315613bb25760405163d7b54ab160e01b815260040160405180910390fd5b5050565b6000808211613bc457600080fd5b600160801b8210613bd757608091821c91015b680100000000000000008210613bef57604091821c91015b6401000000008210613c0357602091821c91015b620100008210613c1557601091821c91015b6101008210613c2657600891821c91015b60108210613c3657600491821c91015b60048210613c4657600291821c91015b6002821061373e57600101919050565b6000808211613c6457600080fd5b5060ff6001600160801b03821615613c7f57607f1901613c87565b608082901c91505b67ffffffffffffffff821615613ca057603f1901613ca8565b604082901c91505b63ffffffff821615613cbd57601f1901613cc5565b602082901c91505b61ffff821615613cd857600f1901613ce0565b601082901c91505b60ff821615613cf25760071901613cfa565b600882901c91505b600f821615613d0c5760031901613d14565b600482901c91505b6003821615613d265760011901613d2e565b600282901c91505b600182161561373e5760001901919050565b6000836001600160a01b0316856001600160a01b03161115613d60579293925b81613d8d57613d88836001600160801b03168686036001600160a01b0316600160601b612d51565b613db0565b613db0836001600160801b03168686036001600160a01b0316600160601b6139a5565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115613ddb579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b038686038116908716613e1757600080fd5b83613e4d57866001600160a01b0316613e3a8383896001600160a01b0316612d51565b81613e4757613e47615264565b04613e79565b613e79613e648383896001600160a01b03166139a5565b886001600160a01b0316808204910615150190565b979650505050505050565b600080856001600160a01b031611613e9b57600080fd5b6000846001600160801b031611613eb157600080fd5b81613ec357613d8885858560016144a7565b613db0858585600161458d565b600080856001600160a01b031611613ee757600080fd5b6000846001600160801b031611613efd57600080fd5b81613f0f57613d88858585600061458d565b613db085858560006144a7565b604080516080810182526000808252602082018190529181018290526060810191909152600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b031611613f94576001613f96565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b1681613fc757613fc7615264565b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152888561ffff1661ffff811061404d5761404d61544d565b60408051608081018252919092015463ffffffff8116808352640100000000820460060b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff161515606082015292506140ac9089908961468d565b156140e4578663ffffffff16826000015163ffffffff1614156140ce57612faa565b816140db83898988613f1c565b91509150612faa565b888361ffff168660010161ffff16816140ff576140ff615264565b0661ffff1661ffff81106141155761411561544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506141c057604080516080810182528a5463ffffffff81168252640100000000810460060b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6141cf8883600001518961468d565b6141ec576040516327e8e87560e01b815260040160405180910390fd5b6141f98989898887614750565b9150915097509795505050505050565b604080516bffffffffffffffffffffffff19606088901b1660208083019190915260e887811b603484015286901b60378301528251808303601a018152603a90920183528151918101919091206000908152600790915290812060015460025491925090600080600f87900b1561439b576000805460045442929182916142c09160089186918591600160a01b820460020b9161ffff600160b81b82048116926001600160801b031691600160c81b900416612e05565b90925090506142fa60058d8b8d8b8b87898b60007f000000000000000000000000000000000000000000000000000000000000000061493a565b945061433160058c8b8d8b8b87898b60017f000000000000000000000000000000000000000000000000000000000000000061493a565b935084156143655761436560068d7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b83156143975761439760068c7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b5050505b6000806143ad60058c8c8b8a8a614b62565b90925090506143be878a8484614c09565b600089600f0b121561442a5783156143fa5760028b810b6000908152600560205260408120818155600181018290559182018190556003909101555b821561442a5760028a810b6000908152600560205260408120818155600181018290559182018190556003909101555b50505050505095945050505050565b60008082600f0b1261445a57614455610b9b8585856001613dbb565b613db3565b61446d610b9b8585856000036000613dbb565b600003949350505050565b60008082600f0b1261449457614455610b9b8585856001613d40565b61446d610b9b8585856000036000613d40565b600081156145195760006001600160a01b038411156144dd576144d884600160601b876001600160801b0316612d51565b6144f4565b6144f46001600160801b038616606086901b6154ea565b905061451161450c826001600160a01b038916615314565b614da6565b915050613db3565b60006001600160a01b038411156145475761454284600160601b876001600160801b03166139a5565b614564565b614564606085901b6001600160801b038716808204910615150190565b905080866001600160a01b03161161457b57600080fd5b6001600160a01b038616039050613db3565b60008261459b575083613db3565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614640576001600160a01b038616848102908582816145e1576145e1615264565b041415614612578181018281106146105761460683896001600160a01b0316836139a5565b9350505050613db3565b505b50614511818561462b6001600160a01b038a16836154ea565b6146359190615314565b808204910615150190565b6001600160a01b0386168481029085828161465d5761465d615264565b0414801561466a57508082115b61467357600080fd5b80820361460661450c846001600160a01b038b16846139a5565b60008363ffffffff168363ffffffff16111580156146b757508363ffffffff168263ffffffff1611155b156146d3578163ffffffff168363ffffffff1611159050612dfe565b60008463ffffffff168463ffffffff16116146fb578363ffffffff1664010000000001614703565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614734578363ffffffff166401000000000161473c565b8363ffffffff165b64ffffffffff169091111595945050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260008361ffff168560010161ffff16816147b4576147b4615264565b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816147e7576147e7615264565b0661ffff81106147f9576147f961544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061485e578060010192506147cc565b898661ffff16826001018161487557614875615264565b0661ffff81106148875761488761544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906148ec908b908b61468d565b905080801561490557506149058a8a876000015161468d565b15614910575061492d565b8061492057600182039250614927565b8160010193505b506147cc565b5050509550959350505050565b60028a900b600090815260208c90526040812080546001600160801b031682600f8c900b81136149735761496e8c8361536c565b614986565b61497c8c615397565b61498690836153b5565b9050846001600160801b0316816001600160801b031611156149bb576040516368d2be8f60e01b815260040160405180910390fd5b6001600160801b038281161590821615811415945015614a69578c60020b8e60020b13614a5157600183018b9055600283018a905560038301805466ffffffffffffff8a166001600160f81b0319909116600160381b6001600160a01b038d16027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000161717600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b03821617835585614aa3578254614a9e908d90600160801b9004600f0b6154fe565b614aba565b8254614aba908d90600160801b9004600f0b61554d565b83546001600160801b03918216600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b81614afa57614afa615264565b0760020b15614b0857600080fd5b600080614b368360020b8560020b81614b2357614b23615264565b0560020b600881901d9161010090910790565b600191820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b60008181526020899052604080822088850b83529082209193849391929184918291908a900b12614ba357505060018201546002830154614bb6565b8360010154880391508360020154870390505b6000808b60020b8b60020b1215614bd857505060018301546002840154614beb565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b614c8f5781516001600160801b0316614c8757604051632aabfc9960e11b815260040160405180910390fd5b508051614cc4565b600085600f0b12614cac578151614ca790869061536c565b614cc1565b614cb585615397565b8251614cc191906153b5565b90505b600080614ce98460200151870385600001516001600160801b0316600160801b612d51565b9150614d0d8460400151860385600001516001600160801b0316600160801b612d51565b905086600f0b600014614d345787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b038216151580614d6257506000816001600160801b0316115b15614d9c57600388018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b5050505050505050565b806001600160a01b038116811461373e57600080fd5b6001600160a01b0381168114614dd157600080fd5b50565b8015158114614dd157600080fd5b60008083601f840112614df457600080fd5b50813567ffffffffffffffff811115614e0c57600080fd5b6020830191508360208285010111156121a857600080fd5b60008060008060008060a08789031215614e3d57600080fd5b8635614e4881614dbc565b95506020870135614e5881614dd4565b9450604087013593506060870135614e6f81614dbc565b9250608087013567ffffffffffffffff811115614e8b57600080fd5b614e9789828a01614de2565b979a9699509497509295939492505050565b600060208284031215614ebb57600080fd5b5035919050565b600060208284031215614ed457600080fd5b813561ffff81168114612dfe57600080fd5b8035600281900b811461373e57600080fd5b80356001600160801b038116811461373e57600080fd5b60008060008060008060a08789031215614f2857600080fd5b8635614f3381614dbc565b9550614f4160208801614ee6565b9450614f4f60408801614ee6565b9350614e6f60608801614ef8565b600080600080600060808688031215614f7557600080fd5b8535614f8081614dbc565b94506020860135935060408601359250606086013567ffffffffffffffff811115614faa57600080fd5b614fb688828901614de2565b969995985093965092949392505050565b600080600080600060a08688031215614fdf57600080fd5b8535614fea81614dbc565b9450614ff860208701614ee6565b935061500660408701614ee6565b925061501460608701614ef8565b915061502260808701614ef8565b90509295509295909350565b60006020828403121561504057600080fd5b81358060010b8114612dfe57600080fd5b803560ff8116811461373e57600080fd5b6000806040838503121561507557600080fd5b61507e83615051565b915061508c60208401615051565b90509250929050565b6000806000606084860312156150aa57600080fd5b83356150b581614dbc565b92506150c360208501614ef8565b91506150d160408501614ef8565b90509250925092565b600080602083850312156150ed57600080fd5b823567ffffffffffffffff8082111561510557600080fd5b818501915085601f83011261511957600080fd5b81358181111561512857600080fd5b8660208260051b850101111561513d57600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b8281101561518b57815160060b8452928401929084019060010161516c565b5050508381038285015284518082528583019183019060005b818110156151c95783516001600160a01b0316835292840192918401916001016151a4565b5090979650505050505050565b6000806000606084860312156151eb57600080fd5b6151f484614ee6565b92506150c360208501614ee6565b6000806040838503121561521557600080fd5b61521e83614ee6565b915061508c60208401614ee6565b60006020828403121561523e57600080fd5b612dfe82614ee6565b60006020828403121561525957600080fd5b8135612dfe81614dbc565b634e487b7160e01b600052601260045260246000fd5b600060ff83168061528d5761528d615264565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b60008160020b627fffff198114156152cc576152cc61529c565b60000392915050565b60008083128015600160ff1b8501841216156152f3576152f361529c565b836001600160ff1b0301831381161561530e5761530e61529c565b50500390565b600082198211156153275761532761529c565b500190565b6000808212826001600160ff1b030384138115161561534d5761534d61529c565b600160ff1b83900384128116156153665761536661529c565b50500190565b60006001600160801b0380831681851680830382111561538e5761538e61529c565b01949350505050565b600081600f0b60016001607f1b03198114156152cc576152cc61529c565b60006001600160801b03838116908316818110156153d5576153d561529c565b039392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8481528360208201526060604082015260006154266060830184866153dd565b9695505050505050565b60006020828403121561544257600080fd5b8151612dfe81614dbc565b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015615484576020818601810151858301520161546a565b81811115615493576000828501525b509190910192915050565b6000602082840312156154b057600080fd5b8151612dfe81614dd4565b6000602082840312156154cd57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6000826154f9576154f9615264565b500490565b600081600f0b83600f0b600082128260016001607f1b03038213811516156155285761552861529c565b8260016001607f1b03190382128116156155445761554461529c565b50019392505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156155785761557861529c565b8160016001607f1b030183138116156155935761559361529c565b509003939250505056fea164736f6c634300080c000aa164736f6c634300080c000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/artifacts-apeswap/dex/contracts/UniswapV3Pool.json b/src/artifacts-apeswap/dex/contracts/UniswapV3Pool.json new file mode 100644 index 0000000..9d28e47 --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/UniswapV3Pool.json @@ -0,0 +1,1092 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "UniswapV3Pool", + "sourceName": "contracts/UniswapV3Pool.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AI", + "type": "error" + }, + { + "inputs": [], + "name": "AS", + "type": "error" + }, + { + "inputs": [], + "name": "F0", + "type": "error" + }, + { + "inputs": [], + "name": "F1", + "type": "error" + }, + { + "inputs": [], + "name": "I", + "type": "error" + }, + { + "inputs": [], + "name": "IIA", + "type": "error" + }, + { + "inputs": [], + "name": "L", + "type": "error" + }, + { + "inputs": [], + "name": "LO", + "type": "error" + }, + { + "inputs": [], + "name": "LOK", + "type": "error" + }, + { + "inputs": [], + "name": "M0", + "type": "error" + }, + { + "inputs": [], + "name": "M1", + "type": "error" + }, + { + "inputs": [], + "name": "NP", + "type": "error" + }, + { + "inputs": [], + "name": "OLD", + "type": "error" + }, + { + "inputs": [], + "name": "R", + "type": "error" + }, + { + "inputs": [], + "name": "T", + "type": "error" + }, + { + "inputs": [], + "name": "TF", + "type": "error" + }, + { + "inputs": [], + "name": "TLM", + "type": "error" + }, + { + "inputs": [], + "name": "TLU", + "type": "error" + }, + { + "inputs": [], + "name": "TUM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "name": "Collect", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "name": "CollectProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "paid0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "paid1", + "type": "uint256" + } + ], + "name": "Flash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "observationCardinalityNextOld", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "observationCardinalityNextNew", + "type": "uint16" + } + ], + "name": "IncreaseObservationCardinalityNext", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "Initialize", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol0Old", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol1Old", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol0New", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol1New", + "type": "uint8" + } + ], + "name": "SetFeeProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "amount0", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "amount1", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "Swap", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount0Requested", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Requested", + "type": "uint128" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint128", + "name": "amount0Requested", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Requested", + "type": "uint128" + } + ], + "name": "collectProtocol", + "outputs": [ + { + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint24", + "name": "", + "type": "uint24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeGrowthGlobal0X128", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeGrowthGlobal1X128", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "flash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "observationCardinalityNext", + "type": "uint16" + } + ], + "name": "increaseObservationCardinalityNext", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidity", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxLiquidityPerTick", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "observations", + "outputs": [ + { + "internalType": "uint32", + "name": "blockTimestamp", + "type": "uint32" + }, + { + "internalType": "int56", + "name": "tickCumulative", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityCumulativeX128", + "type": "uint160" + }, + { + "internalType": "bool", + "name": "initialized", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32[]", + "name": "secondsAgos", + "type": "uint32[]" + } + ], + "name": "observe", + "outputs": [ + { + "internalType": "int56[]", + "name": "tickCumulatives", + "type": "int56[]" + }, + { + "internalType": "uint160[]", + "name": "secondsPerLiquidityCumulativeX128s", + "type": "uint160[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "positions", + "outputs": [ + { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside0LastX128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside1LastX128", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "tokensOwed0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "tokensOwed1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFees", + "outputs": [ + { + "internalType": "uint128", + "name": "token0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "token1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "feeProtocol0", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "feeProtocol1", + "type": "uint8" + } + ], + "name": "setFeeProtocol", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "slot0", + "outputs": [ + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "internalType": "int24", + "name": "tick", + "type": "int24" + }, + { + "internalType": "uint16", + "name": "observationIndex", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "observationCardinality", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "observationCardinalityNext", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "feeProtocol", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "unlocked", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + } + ], + "name": "snapshotCumulativesInside", + "outputs": [ + { + "internalType": "int56", + "name": "tickCumulativeInside", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityInsideX128", + "type": "uint160" + }, + { + "internalType": "uint32", + "name": "secondsInside", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "zeroForOne", + "type": "bool" + }, + { + "internalType": "int256", + "name": "amountSpecified", + "type": "int256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "int256", + "name": "amount0", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int16", + "name": "", + "type": "int16" + } + ], + "name": "tickBitmap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tickSpacing", + "outputs": [ + { + "internalType": "int24", + "name": "", + "type": "int24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "", + "type": "int24" + } + ], + "name": "ticks", + "outputs": [ + { + "internalType": "uint128", + "name": "liquidityGross", + "type": "uint128" + }, + { + "internalType": "int128", + "name": "liquidityNet", + "type": "int128" + }, + { + "internalType": "uint256", + "name": "feeGrowthOutside0X128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthOutside1X128", + "type": "uint256" + }, + { + "internalType": "int56", + "name": "tickCumulativeOutside", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityOutsideX128", + "type": "uint160" + }, + { + "internalType": "uint32", + "name": "secondsOutside", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "initialized", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token0", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token1", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b503060805260408051630890357360e41b81529051600091339163890357309160048082019260a0929091908290030181865afa15801562000058573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200007e919062000186565b62ffffff91909116610100526001600160a01b0391821660e05291811660c0529190911660a052600281900b610120529050620000c781620000db602090811b6200262e17901c565b6001600160801b0316610140525062000220565b60008082600281900b620d89e71981620000f957620000f96200020a565b05029050600083600281900b620d89e8816200011957620001196200020a565b0502905060008460020b83830360020b816200013957620001396200020a565b0560010190508062ffffff166001600160801b038016816200015f576200015f6200020a565b0495945050505050565b80516001600160a01b03811681146200018157600080fd5b919050565b600080600080600060a086880312156200019f57600080fd5b620001aa8662000169565b9450620001ba6020870162000169565b9350620001ca6040870162000169565b9250606086015162ffffff81168114620001e357600080fd5b8092505060808601518060020b8114620001fc57600080fd5b809150509295509295909350565b634e487b7160e01b600052601260045260246000fd5b60805160a05160c05160e0516101005161012051610140516155aa6200030760003960008181610485015281816142d6015261430d01526000818161056e015281816109ee0152818161434101526143730152600081816105cf01528181610aec01528181611717015261174e0152600081816105a801528181611104015281816117d101528181611bf801528181612092015261366a0152600081816101b8015281816111da015281816117a001528181611b920152818161200c015261355401526000818161054701528181611cf20152611ec5015260006126bb01526155aa6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f43146105ca578063f305839914610605578063f30dba931461060e578063f637731d146106e257600080fd5b8063c45a015514610542578063d0c93a7c14610569578063d21220a7146105a357600080fd5b8063883bdbfd116100c8578063883bdbfd146104cd578063a34123a7146104ee578063a38807f21461050157600080fd5b806370cf754a146104805780638206a4d1146104a757806385b66729146104ba57600080fd5b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146103b95780634f1eb3d8146103cc578063514ea4bf146103df5780635339c2961461046057600080fd5b80633850c7bd146102ea5780633c8a7d8d1461038f57806346141319146103a257600080fd5b80631ad8b03b1161018c5780631ad8b03b1461024a578063252c09d71461028857806332148f67146102d557600080fd5b80630dfe1681146101b3578063128acb08146101f75780631a6865021461021f575b600080fd5b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61020a610205366004614e24565b6106f5565b604080519283526020830191909152016101ee565b600454610232906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b600354610268906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016101ee565b61029b610296366004614ea9565b61133a565b6040805163ffffffff909516855260069390930b60208501526001600160a01b0390911691830191909152151560608201526080016101ee565b6102e86102e3366004614ec2565b611380565b005b60005461033e906001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b604080516001600160a01b03909816885260029690960b602088015261ffff94851695870195909552918316606086015291909116608084015260ff1660a0830152151560c082015260e0016101ee565b61020a61039d366004614f0f565b611479565b6103ab60025481565b6040519081526020016101ee565b6102e86103c7366004614f5d565b6116a6565b6102686103da366004614fc7565b611a5d565b61042a6103ed366004614ea9565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b604080516001600160801b039687168152602081019590955284019290925283166060830152909116608082015260a0016101ee565b6103ab61046e36600461502e565b60066020526000908152604090205481565b6102327f000000000000000000000000000000000000000000000000000000000000000081565b6102e86104b5366004615062565b611ca1565b6102686104c8366004615095565b611e71565b6104e06104db3660046150da565b612128565b6040516101ee92919061514f565b61020a6104fc3660046151d6565b6121af565b61051461050f366004615202565b612308565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff16908201526060016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105907f000000000000000000000000000000000000000000000000000000000000000081565b60405160029190910b81526020016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105f17f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff90911681526020016101ee565b6103ab60015481565b61068661061c36600461522c565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b604080516001600160801b039099168952600f9790970b602089015295870194909452606086019290925260060b60808501526001600160a01b031660a084015263ffffffff1660c0830152151560e0820152610100016101ee565b6102e86106f0366004615247565b6124e3565b6000806107006126b0565b8561071d57604051627ffe0360e31b815260040160405180910390fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526107b6576040516350dfbc4360e11b815260040160405180910390fd5b876108015780600001516001600160a01b0316866001600160a01b03161180156107fc575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610833565b80600001516001600160a01b0316866001600160a01b031610801561083357506401000276a36001600160a01b038716115b6108695760405162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015260640160405180910390fd5b6000805460ff60f01b191681556040805160c08101909152808a6108985760048460a0015160ff16901c6108a9565b60108460a001516108a9919061527a565b60ff1681526004546001600160801b031660208201526040014263ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c61093f57600254610943565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b8051158015906109925750886001600160a01b031681604001516001600160a01b031614155b15610ed0576040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260408201516001600160a01b031681526060820151610a13906006907f00000000000000000000000000000000000000000000000000000000000000008f6126e7565b1515604083015260020b60208201819052620d89e7191315610a3e57620d89e7196020820152610a72565b610a4b620d89e7196152b2565b60020b816020015160020b1315610a7257610a69620d89e7196152b2565b60020b60208201525b610a7f8160200151612829565b6001600160a01b031660608201526040820151610b10908d610ab9578b6001600160a01b031683606001516001600160a01b031611610ad3565b8b6001600160a01b031683606001516001600160a01b0316105b610ae1578260600151610ae3565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000000612b49565b60c085015260a084015260808301526001600160a01b031660408301528215610b7257610b468160c00151826080015101612d3b565b825103825260a0810151610b5990612d3b565b82602001818151610b6a91906152d5565b905250610bb5565b610b7f8160a00151612d3b565b825101825260c08101516080820151610ba091610b9b91615314565b612d3b565b82602001818151610bb1919061532c565b9052505b835160ff1615610c01576000846000015160ff168260c0015181610bdb57610bdb615264565b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610c4057610c348160c00151600160801b8460c001516001600160801b0316612d51565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610e9357806040015115610e6e578360a00151610cc657610ca8846040015160008760200151886040015188602001518a606001516008612e05909695949392919063ffffffff16565b6001600160a01b0316608086015260060b6060850152600160a08501525b6000610e1a82602001518e610cdd57600154610ce3565b84608001515b8f610cf2578560800151610cf6565b6002545b608089015160608a01516040808c0151600296870b6000908152600560205291909120600181018054909603909555948401805490930390925560038301805463ffffffff600160d81b66ffffffffffffff196001600160a01b03600160381b8086048216909703169095029485167fffffffffff00000000000000000000000000000000000000000000000000000084161766ffffffffffffff7fffffffffff0000000000000000000000000000000000000000ffffffffffffff8516871760060b909703969096169586178190048216909703169095027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000929092166001600160f81b031990951694909417919091171790915554600160801b9004600f0b90565b90508c15610e26576000035b600081600f0b12610e4657808360c00151610e41919061536c565b610e5e565b610e4f81615397565b8360c00151610e5e91906153b5565b6001600160801b031660c0840152505b8b610e7d578060200151610e86565b60018160200151035b60020b6060830152610eca565b80600001516001600160a01b031682604001516001600160a01b031614610eca57610ec18260400151612fb6565b60020b60608301525b5061096c565b836020015160020b816060015160020b14610fb757600080610f1e86604001518660400151886020015188602001518a606001518b6080015160086132c5909695949392919063ffffffff16565b604085015160608601516000805463ffffffff60b81b1916600160c81b61ffff9586160261ffff60b81b191617600160b81b95909416949094029290921776ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff9093169290920273ffffffffffffffffffffffffffffffffffffffff1916919091176001600160a01b0390911617905550610fe99050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b03161461102f5760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561107f57608081015160015560a08101516001600160801b03161561107a5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b6110c5565b608081015160025560a08101516001600160801b0316156110c55760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146110de57602081015181518b036110eb565b80600001518a0381602001515b90965094508a156111cc57600085121561112d5761112d7f00000000000000000000000000000000000000000000000000000000000000008d8760000361344e565b600061113761353a565b60405163fa461e3360e01b8152909150339063fa461e3390611163908a908a908e908e90600401615406565b600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b5050505061119d61353a565b6111a78883615314565b11156111c657604051635d05ca8f60e11b815260040160405180910390fd5b5061129e565b6000861215611203576112037f00000000000000000000000000000000000000000000000000000000000000008d8860000361344e565b600061120d613650565b60405163fa461e3360e01b8152909150339063fa461e3390611239908a908a908e908e90600401615406565b600060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b50505050611273613650565b61127d8783615314565b111561129c57604051635d05ca8f60e11b815260040160405180910390fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516958101959095526001600160801b039092169084015260020b60808301528d169033907fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679060a00160405180910390a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60088161ffff811061134b57600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff166113aa576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556113bf6126b0565b60008054600160d81b900461ffff16906113db6008838561369c565b6000805461ffff808416600160d81b81027fffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217909255919250831614611461576040805161ffff8085168252831660208201527fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a91015b60405180910390a15b50506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff166114a6576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556001600160801b0385166114c657600080fd5b60008061151460405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161150a8a6001600160801b031661372d565b600f0b9052613743565b925092505081935080925060008060008611156115365761153361353a565b91505b841561154757611544613650565b90505b60405163d348799760e01b8152339063d34879979061157090899089908d908d90600401615406565b600060405180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506000861180156115c157506115b561353a565b6115bf8784615314565b115b156115df5760405163748800af60e01b815260040160405180910390fd5b6000851180156115fe57506115f2613650565b6115fc8683615314565b115b1561161c57604051631072b39760e11b815260040160405180910390fd5b604080513381526001600160801b038b1660208201529081018790526060810186905260028b810b91908d900b906001600160a01b038f16907f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde9060800160405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b600054600160f01b900460ff166116d0576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556116e56126b0565b6004546001600160801b03168061170f57604051639f13f76d60e01b815260040160405180910390fd5b6000611744867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061177b867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061178761353a565b90506000611793613650565b905088156117c6576117c67f00000000000000000000000000000000000000000000000000000000000000008b8b61344e565b87156117f7576117f77f00000000000000000000000000000000000000000000000000000000000000008b8a61344e565b604051630e9cbafb60e41b8152339063e9cbafb09061182090879087908c908c90600401615406565b600060405180830381600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b50505050600061185c61353a565b90506000611868613650565b9050816118758786615314565b11156118945760405163f704e89960e01b815260040160405180910390fd5b8061189f8685615314565b11156118be5760405163e90c349360e01b815260040160405180910390fd5b8382038382038386146119545760008054600160e81b9004600f169081156118f8578160ff1684816118f2576118f2615264565b046118fb565b60005b90506001600160801b0381161561192e57600380546001600160801b038082168401166001600160801b03199091161790555b611948818503600160801b8d6001600160801b0316612d51565b60018054909101905550505b80156119e55760008054600160e81b900460041c600f1690811561198a578160ff16838161198457611984615264565b0461198d565b60005b90506001600160801b038116156119bf57600380546001600160801b03600160801b8083048216850182160291161790555b6119d9818403600160801b8d6001600160801b0316612d51565b60028054909101905550505b604080518e8152602081018e9052908101839052606081018290526001600160a01b038f169033907fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339060800160405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611a8a576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b19168155604080513360601b6bffffffffffffffffffffffff191660208083019190915260e88a811b603484015289901b60378301528251601a818403018152603a9092018352815191810191909120835260079052902060038101546001600160801b0390811690861611611b095784611b18565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611b405783611b56565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611bbb576003810180546001600160801b031981166001600160801b03918216869003821617909155611bbb907f0000000000000000000000000000000000000000000000000000000000000000908a90861661344e565b6001600160801b03821615611c21576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611c21907f0000000000000000000000000000000000000000000000000000000000000000908a90851661344e565b604080516001600160a01b038a1681526001600160801b0385811660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b600054600160f01b900460ff16611ccb576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190615430565b6001600160a01b0316336001600160a01b031614611d7e57600080fd5b60ff82161580611da1575060048260ff1610158015611da15750600a8260ff1611155b8015611dcb575060ff81161580611dcb575060048160ff1610158015611dcb5750600a8160ff1611155b611dd457600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c166020830152868316908201529084166060820152608001611458565b600080548190600160f01b900460ff16611e9e576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f349190615430565b6001600160a01b0316336001600160a01b031614611f5157600080fd5b6003546001600160801b0390811690851611611f6d5783611f7a565b6003546001600160801b03165b6003549092506001600160801b03600160801b909104811690841611611fa05782611fb4565b600354600160801b90046001600160801b03165b90506001600160801b03821615612035576003546001600160801b0383811691161415611fe357600019909101905b600380546001600160801b031981166001600160801b03918216859003821617909155612035907f0000000000000000000000000000000000000000000000000000000000000000908790851661344e565b6001600160801b038116156120bb576003546001600160801b03828116600160801b90920416141561206657600019015b600380546001600160801b03600160801b8083048216859003821602918116919091179091556120bb907f0000000000000000000000000000000000000000000000000000000000000000908790841661344e565b604080516001600160801b038085168252831660208201526001600160a01b0387169133917f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151910160405180910390a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806121336126b0565b6121a342858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b9004166139e5565b915091505b9250929050565b600080548190600160f01b900460ff166121dc576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061223590606081016122286001600160801b038a1661372d565b600003600f0b9052613743565b92509250925081600003945080600003935060008511806122565750600084115b15612291576003830180546001600160801b0380821688018116600160801b92839004821688019091169091026001600160801b0319161790555b604080516001600160801b038816815260208101879052908101859052600288810b91908a900b9033907f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c9060600160405180910390a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006123156126b0565b61231f8585613b30565b600285810b6000908152600560205260408082209287900b825281206003830154600681900b93600160381b82046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061237f57600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806123c057600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e900b13159050612462575093909403965090039350900390506124dc565b8a60020b816020015160020b12156124cd57602081015160408201516004546060840151429360009384936124ab9360089388938793919290916001600160801b031690612e05565b9a9003989098039b5050949096039290920396509091030392506124dc915050565b50949093039650039350900390505b9250925092565b6000546001600160a01b03161561250d5760405163139816ff60e31b815260040160405180910390fd5b600061251882612fb6565b604080516080808201835263ffffffff42168083526000602080850182905284860182905260016060958601819052600160f81b909317600855855160e0810187526001600160a01b038a16808252600289900b82840181905282890185905296820185905294810184905260a0810183905260c001839052815476ffffffffffffffffffffffffffffffffffffffffffffff19168417600160a01b62ffffff891602177fff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff166501000001000160c81b1790915584519283528201929092528251939450909283927f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95928290030190a150505050565b60008082600281900b620d89e7198161264957612649615264565b05029050600083600281900b620d89e88161266657612666615264565b0502905060008460020b83830360020b8161268357612683615264565b0560010190508062ffffff166001600160801b038016816126a6576126a6615264565b0495945050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146126e557600080fd5b565b60008060008460020b8660020b8161270157612701615264565b05905060008660020b12801561272e57508460020b8660020b8161272757612727615264565b0760020b15155b1561273857600019015b83156127ac57600281900b600881901d600181810b600090815260208b9052604090205461010090930760ff81169190911b8001600019019283168015159550919290918561278e57888360ff168603026127a1565b8861279882613bb6565b840360ff168603025b96505050505061281f565b600181810160020b600881901d80830b600090815260208b9052604090205461010090920760ff81169390931b60001901199182168015159550909291908561280257888360ff0360ff16866001010102612818565b888361280d83613c56565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612840578260020b612848565b8260020b6000035b9050620d89e881111561286e576040516315e4079d60e11b815260040160405180910390fd5b60006001821661288257600160801b612894565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156128c8576ffff97272373d413259a46990580e213a0260801c5b60048216156128e7576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612906576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612925576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612944576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612963576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612982576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156129a2576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156129c2576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156129e2576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612a02576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612a22576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612a42576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612a62576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612a82576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612aa3576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612ac3576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612ae2576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612aff576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612b20578060001981612b1c57612b1c615264565b0490505b640100000000810615612b34576001612b37565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590612bce576000612b828989620f42400362ffffff16620f4240612d51565b905082612b9b57612b968c8c8c6001613d40565b612ba8565b612ba88b8d8c6001613dbb565b9550858110612bb9578a9650612bc8565b612bc58c8b8386613e84565b96505b50612c18565b81612be557612be08b8b8b6000613dbb565b612bf2565b612bf28a8c8b6000613d40565b9350838860000310612c0657899550612c18565b612c158b8a8a60000385613ed0565b95505b6001600160a01b038a8116908716148215612c7b57808015612c375750815b612c4d57612c48878d8c6001613dbb565b612c4f565b855b9550808015612c5c575081155b612c7257612c6d878d8c6000613d40565b612c74565b845b9450612cc5565b808015612c855750815b612c9b57612c968c888c6001613d40565b612c9d565b855b9550808015612caa575081155b612cc057612cbb8c888c6000613dbb565b612cc2565b845b94505b81158015612cd557508860000385115b15612ce1578860000394505b818015612d0057508a6001600160a01b0316876001600160a01b031614155b15612d0f578589039350612d2c565b612d29868962ffffff168a620f42400362ffffff166139a5565b93505b50505095509550955095915050565b6000600160ff1b8210612d4d57600080fd5b5090565b600080806000198587098587029250828110838203039150508060001415612d8b5760008411612d8057600080fd5b508290049050612dfe565b808411612d9757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716612eac576000898661ffff1661ffff8110612e2c57612e2c61544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612e9857612e95818a8988613f1c565b90505b806020015181604001519250925050612faa565b868803600080612ec18c8c858c8c8c8c613fee565b91509150816000015163ffffffff168363ffffffff161415612ef3578160200151826040015194509450505050612faa565b805163ffffffff84811691161415612f1b578060200151816040015194509450505050612faa565b60008260000151826000015103905060008360000151850390508063ffffffff168263ffffffff1660060b856020015185602001510360060b81612f6157612f61615264565b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612f9957612f99615264565b048560400151019650965050505050505b97509795505050505050565b60006401000276a36001600160a01b03831610801590612ff2575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61300f576040516324c070df60e11b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106130b057607f810383901c91506130ba565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146132b657886001600160a01b031661329b82612829565b6001600160a01b031611156132b057816132b8565b806132b8565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106132e1576132e161544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561334b5788859250925050612faa565b8461ffff168461ffff1611801561336c57506001850361ffff168961ffff16145b156133795783915061337d565b8491505b8161ffff168960010161ffff168161339757613397615264565b0692506133a681898989613f1c565b8a8461ffff1661ffff81106133bd576133bd61544d565b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02959095166affffffffffffffffffffff66ffffffffffffff909216640100000000026affffffffffffffffffffff1990931663ffffffff909516949094179190911716919091179190911790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916134aa9190615463565b6000604051808303816000865af19150503d80600081146134e7576040519150601f19603f3d011682016040523d82523d6000602084013e6134ec565b606091505b5091509150818015613516575080511580613516575080806020019051810190613516919061549e565b61353357604051638b98626560e01b815260040160405180910390fd5b5050505050565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516135d89190615463565b600060405180830381855afa9150503d8060008114613613576040519150601f19603f3d011682016040523d82523d6000602084013e613618565b606091505b509150915081801561362c57506020815110155b61363557600080fd5b8080602001905181019061364991906154bb565b9250505090565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b90604401613582565b6000808361ffff16116136c257604051636b93000360e11b815260040160405180910390fd5b8261ffff168261ffff16116136d8575081612dfe565b825b8261ffff168161ffff161015613724576001858261ffff1661ffff81106137035761370361544d565b01805463ffffffff191663ffffffff929092169190911790556001016136da565b50909392505050565b80600f81900b811461373e57600080fd5b919050565b60008060006137506126b0565b61376284602001518560400151613b30565b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c0850152885190890151948901519289015193946138009491939092909190614209565b93508460600151600f0b60001461399d57846020015160020b816020015160020b12156138555761384e6138378660200151612829565b6138448760400151612829565b8760600151614439565b925061399d565b846040015160020b816020015160020b12156139735760045460408201516001600160801b03909116906138a0904260208501516060860151608087015160089493929187916132c5565b6000805463ffffffff60b81b1916600160c81b61ffff9384160261ffff60b81b191617600160b81b9390921692909202179055815160408701516138f291906138e890612829565b8860600151614439565b93506139106139048760200151612829565b83516060890151614478565b925060008660600151600f0b12613935576060860151613930908261536c565b61394d565b856060015161394390615397565b61394d90826153b5565b600480546001600160801b0319166001600160801b03929092169190911790555061399d565b61399a6139838660200151612829565b6139908760400151612829565b8760600151614478565b91505b509193909250565b60006139b2848484612d51565b9050600082806139c4576139c4615264565b8486091115612dfe5760001981106139db57600080fd5b6001019392505050565b60608060008361ffff1611613a0d57604051636b93000360e11b815260040160405180910390fd5b865167ffffffffffffffff811115613a2757613a276154d4565b604051908082528060200260200182016040528015613a50578160200160208202803683370190505b509150865167ffffffffffffffff811115613a6d57613a6d6154d4565b604051908082528060200260200182016040528015613a96578160200160208202803683370190505b50905060005b8751811015613b2357613acd8a8a8a8481518110613abc57613abc61544d565b60200260200101518a8a8a8a612e05565b848381518110613adf57613adf61544d565b60200260200101848481518110613af857613af861544d565b6001600160a01b039093166020938402919091019092019190915260069190910b9052600101613a9c565b5097509795505050505050565b8060020b8260020b12613b5657604051632fe0284f60e01b815260040160405180910390fd5b620d89e719600283900b1215613b7f5760405163135ac25d60e31b815260040160405180910390fd5b613b8c620d89e7196152b2565b60020b8160020b1315613bb25760405163d7b54ab160e01b815260040160405180910390fd5b5050565b6000808211613bc457600080fd5b600160801b8210613bd757608091821c91015b680100000000000000008210613bef57604091821c91015b6401000000008210613c0357602091821c91015b620100008210613c1557601091821c91015b6101008210613c2657600891821c91015b60108210613c3657600491821c91015b60048210613c4657600291821c91015b6002821061373e57600101919050565b6000808211613c6457600080fd5b5060ff6001600160801b03821615613c7f57607f1901613c87565b608082901c91505b67ffffffffffffffff821615613ca057603f1901613ca8565b604082901c91505b63ffffffff821615613cbd57601f1901613cc5565b602082901c91505b61ffff821615613cd857600f1901613ce0565b601082901c91505b60ff821615613cf25760071901613cfa565b600882901c91505b600f821615613d0c5760031901613d14565b600482901c91505b6003821615613d265760011901613d2e565b600282901c91505b600182161561373e5760001901919050565b6000836001600160a01b0316856001600160a01b03161115613d60579293925b81613d8d57613d88836001600160801b03168686036001600160a01b0316600160601b612d51565b613db0565b613db0836001600160801b03168686036001600160a01b0316600160601b6139a5565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115613ddb579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b038686038116908716613e1757600080fd5b83613e4d57866001600160a01b0316613e3a8383896001600160a01b0316612d51565b81613e4757613e47615264565b04613e79565b613e79613e648383896001600160a01b03166139a5565b886001600160a01b0316808204910615150190565b979650505050505050565b600080856001600160a01b031611613e9b57600080fd5b6000846001600160801b031611613eb157600080fd5b81613ec357613d8885858560016144a7565b613db0858585600161458d565b600080856001600160a01b031611613ee757600080fd5b6000846001600160801b031611613efd57600080fd5b81613f0f57613d88858585600061458d565b613db085858560006144a7565b604080516080810182526000808252602082018190529181018290526060810191909152600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b031611613f94576001613f96565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b1681613fc757613fc7615264565b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152888561ffff1661ffff811061404d5761404d61544d565b60408051608081018252919092015463ffffffff8116808352640100000000820460060b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff161515606082015292506140ac9089908961468d565b156140e4578663ffffffff16826000015163ffffffff1614156140ce57612faa565b816140db83898988613f1c565b91509150612faa565b888361ffff168660010161ffff16816140ff576140ff615264565b0661ffff1661ffff81106141155761411561544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506141c057604080516080810182528a5463ffffffff81168252640100000000810460060b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6141cf8883600001518961468d565b6141ec576040516327e8e87560e01b815260040160405180910390fd5b6141f98989898887614750565b9150915097509795505050505050565b604080516bffffffffffffffffffffffff19606088901b1660208083019190915260e887811b603484015286901b60378301528251808303601a018152603a90920183528151918101919091206000908152600790915290812060015460025491925090600080600f87900b1561439b576000805460045442929182916142c09160089186918591600160a01b820460020b9161ffff600160b81b82048116926001600160801b031691600160c81b900416612e05565b90925090506142fa60058d8b8d8b8b87898b60007f000000000000000000000000000000000000000000000000000000000000000061493a565b945061433160058c8b8d8b8b87898b60017f000000000000000000000000000000000000000000000000000000000000000061493a565b935084156143655761436560068d7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b83156143975761439760068c7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b5050505b6000806143ad60058c8c8b8a8a614b62565b90925090506143be878a8484614c09565b600089600f0b121561442a5783156143fa5760028b810b6000908152600560205260408120818155600181018290559182018190556003909101555b821561442a5760028a810b6000908152600560205260408120818155600181018290559182018190556003909101555b50505050505095945050505050565b60008082600f0b1261445a57614455610b9b8585856001613dbb565b613db3565b61446d610b9b8585856000036000613dbb565b600003949350505050565b60008082600f0b1261449457614455610b9b8585856001613d40565b61446d610b9b8585856000036000613d40565b600081156145195760006001600160a01b038411156144dd576144d884600160601b876001600160801b0316612d51565b6144f4565b6144f46001600160801b038616606086901b6154ea565b905061451161450c826001600160a01b038916615314565b614da6565b915050613db3565b60006001600160a01b038411156145475761454284600160601b876001600160801b03166139a5565b614564565b614564606085901b6001600160801b038716808204910615150190565b905080866001600160a01b03161161457b57600080fd5b6001600160a01b038616039050613db3565b60008261459b575083613db3565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614640576001600160a01b038616848102908582816145e1576145e1615264565b041415614612578181018281106146105761460683896001600160a01b0316836139a5565b9350505050613db3565b505b50614511818561462b6001600160a01b038a16836154ea565b6146359190615314565b808204910615150190565b6001600160a01b0386168481029085828161465d5761465d615264565b0414801561466a57508082115b61467357600080fd5b80820361460661450c846001600160a01b038b16846139a5565b60008363ffffffff168363ffffffff16111580156146b757508363ffffffff168263ffffffff1611155b156146d3578163ffffffff168363ffffffff1611159050612dfe565b60008463ffffffff168463ffffffff16116146fb578363ffffffff1664010000000001614703565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614734578363ffffffff166401000000000161473c565b8363ffffffff165b64ffffffffff169091111595945050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260008361ffff168560010161ffff16816147b4576147b4615264565b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816147e7576147e7615264565b0661ffff81106147f9576147f961544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061485e578060010192506147cc565b898661ffff16826001018161487557614875615264565b0661ffff81106148875761488761544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906148ec908b908b61468d565b905080801561490557506149058a8a876000015161468d565b15614910575061492d565b8061492057600182039250614927565b8160010193505b506147cc565b5050509550959350505050565b60028a900b600090815260208c90526040812080546001600160801b031682600f8c900b81136149735761496e8c8361536c565b614986565b61497c8c615397565b61498690836153b5565b9050846001600160801b0316816001600160801b031611156149bb576040516368d2be8f60e01b815260040160405180910390fd5b6001600160801b038281161590821615811415945015614a69578c60020b8e60020b13614a5157600183018b9055600283018a905560038301805466ffffffffffffff8a166001600160f81b0319909116600160381b6001600160a01b038d16027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000161717600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b03821617835585614aa3578254614a9e908d90600160801b9004600f0b6154fe565b614aba565b8254614aba908d90600160801b9004600f0b61554d565b83546001600160801b03918216600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b81614afa57614afa615264565b0760020b15614b0857600080fd5b600080614b368360020b8560020b81614b2357614b23615264565b0560020b600881901d9161010090910790565b600191820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b60008181526020899052604080822088850b83529082209193849391929184918291908a900b12614ba357505060018201546002830154614bb6565b8360010154880391508360020154870390505b6000808b60020b8b60020b1215614bd857505060018301546002840154614beb565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b614c8f5781516001600160801b0316614c8757604051632aabfc9960e11b815260040160405180910390fd5b508051614cc4565b600085600f0b12614cac578151614ca790869061536c565b614cc1565b614cb585615397565b8251614cc191906153b5565b90505b600080614ce98460200151870385600001516001600160801b0316600160801b612d51565b9150614d0d8460400151860385600001516001600160801b0316600160801b612d51565b905086600f0b600014614d345787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b038216151580614d6257506000816001600160801b0316115b15614d9c57600388018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b5050505050505050565b806001600160a01b038116811461373e57600080fd5b6001600160a01b0381168114614dd157600080fd5b50565b8015158114614dd157600080fd5b60008083601f840112614df457600080fd5b50813567ffffffffffffffff811115614e0c57600080fd5b6020830191508360208285010111156121a857600080fd5b60008060008060008060a08789031215614e3d57600080fd5b8635614e4881614dbc565b95506020870135614e5881614dd4565b9450604087013593506060870135614e6f81614dbc565b9250608087013567ffffffffffffffff811115614e8b57600080fd5b614e9789828a01614de2565b979a9699509497509295939492505050565b600060208284031215614ebb57600080fd5b5035919050565b600060208284031215614ed457600080fd5b813561ffff81168114612dfe57600080fd5b8035600281900b811461373e57600080fd5b80356001600160801b038116811461373e57600080fd5b60008060008060008060a08789031215614f2857600080fd5b8635614f3381614dbc565b9550614f4160208801614ee6565b9450614f4f60408801614ee6565b9350614e6f60608801614ef8565b600080600080600060808688031215614f7557600080fd5b8535614f8081614dbc565b94506020860135935060408601359250606086013567ffffffffffffffff811115614faa57600080fd5b614fb688828901614de2565b969995985093965092949392505050565b600080600080600060a08688031215614fdf57600080fd5b8535614fea81614dbc565b9450614ff860208701614ee6565b935061500660408701614ee6565b925061501460608701614ef8565b915061502260808701614ef8565b90509295509295909350565b60006020828403121561504057600080fd5b81358060010b8114612dfe57600080fd5b803560ff8116811461373e57600080fd5b6000806040838503121561507557600080fd5b61507e83615051565b915061508c60208401615051565b90509250929050565b6000806000606084860312156150aa57600080fd5b83356150b581614dbc565b92506150c360208501614ef8565b91506150d160408501614ef8565b90509250925092565b600080602083850312156150ed57600080fd5b823567ffffffffffffffff8082111561510557600080fd5b818501915085601f83011261511957600080fd5b81358181111561512857600080fd5b8660208260051b850101111561513d57600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b8281101561518b57815160060b8452928401929084019060010161516c565b5050508381038285015284518082528583019183019060005b818110156151c95783516001600160a01b0316835292840192918401916001016151a4565b5090979650505050505050565b6000806000606084860312156151eb57600080fd5b6151f484614ee6565b92506150c360208501614ee6565b6000806040838503121561521557600080fd5b61521e83614ee6565b915061508c60208401614ee6565b60006020828403121561523e57600080fd5b612dfe82614ee6565b60006020828403121561525957600080fd5b8135612dfe81614dbc565b634e487b7160e01b600052601260045260246000fd5b600060ff83168061528d5761528d615264565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b60008160020b627fffff198114156152cc576152cc61529c565b60000392915050565b60008083128015600160ff1b8501841216156152f3576152f361529c565b836001600160ff1b0301831381161561530e5761530e61529c565b50500390565b600082198211156153275761532761529c565b500190565b6000808212826001600160ff1b030384138115161561534d5761534d61529c565b600160ff1b83900384128116156153665761536661529c565b50500190565b60006001600160801b0380831681851680830382111561538e5761538e61529c565b01949350505050565b600081600f0b60016001607f1b03198114156152cc576152cc61529c565b60006001600160801b03838116908316818110156153d5576153d561529c565b039392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8481528360208201526060604082015260006154266060830184866153dd565b9695505050505050565b60006020828403121561544257600080fd5b8151612dfe81614dbc565b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015615484576020818601810151858301520161546a565b81811115615493576000828501525b509190910192915050565b6000602082840312156154b057600080fd5b8151612dfe81614dd4565b6000602082840312156154cd57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6000826154f9576154f9615264565b500490565b600081600f0b83600f0b600082128260016001607f1b03038213811516156155285761552861529c565b8260016001607f1b03190382128116156155445761554461529c565b50019392505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156155785761557861529c565b8160016001607f1b030183138116156155935761559361529c565b509003939250505056fea164736f6c634300080c000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f43146105ca578063f305839914610605578063f30dba931461060e578063f637731d146106e257600080fd5b8063c45a015514610542578063d0c93a7c14610569578063d21220a7146105a357600080fd5b8063883bdbfd116100c8578063883bdbfd146104cd578063a34123a7146104ee578063a38807f21461050157600080fd5b806370cf754a146104805780638206a4d1146104a757806385b66729146104ba57600080fd5b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146103b95780634f1eb3d8146103cc578063514ea4bf146103df5780635339c2961461046057600080fd5b80633850c7bd146102ea5780633c8a7d8d1461038f57806346141319146103a257600080fd5b80631ad8b03b1161018c5780631ad8b03b1461024a578063252c09d71461028857806332148f67146102d557600080fd5b80630dfe1681146101b3578063128acb08146101f75780631a6865021461021f575b600080fd5b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61020a610205366004614e24565b6106f5565b604080519283526020830191909152016101ee565b600454610232906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b600354610268906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016101ee565b61029b610296366004614ea9565b61133a565b6040805163ffffffff909516855260069390930b60208501526001600160a01b0390911691830191909152151560608201526080016101ee565b6102e86102e3366004614ec2565b611380565b005b60005461033e906001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b604080516001600160a01b03909816885260029690960b602088015261ffff94851695870195909552918316606086015291909116608084015260ff1660a0830152151560c082015260e0016101ee565b61020a61039d366004614f0f565b611479565b6103ab60025481565b6040519081526020016101ee565b6102e86103c7366004614f5d565b6116a6565b6102686103da366004614fc7565b611a5d565b61042a6103ed366004614ea9565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b604080516001600160801b039687168152602081019590955284019290925283166060830152909116608082015260a0016101ee565b6103ab61046e36600461502e565b60066020526000908152604090205481565b6102327f000000000000000000000000000000000000000000000000000000000000000081565b6102e86104b5366004615062565b611ca1565b6102686104c8366004615095565b611e71565b6104e06104db3660046150da565b612128565b6040516101ee92919061514f565b61020a6104fc3660046151d6565b6121af565b61051461050f366004615202565b612308565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff16908201526060016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105907f000000000000000000000000000000000000000000000000000000000000000081565b60405160029190910b81526020016101ee565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6105f17f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff90911681526020016101ee565b6103ab60015481565b61068661061c36600461522c565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b604080516001600160801b039099168952600f9790970b602089015295870194909452606086019290925260060b60808501526001600160a01b031660a084015263ffffffff1660c0830152151560e0820152610100016101ee565b6102e86106f0366004615247565b6124e3565b6000806107006126b0565b8561071d57604051627ffe0360e31b815260040160405180910390fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526107b6576040516350dfbc4360e11b815260040160405180910390fd5b876108015780600001516001600160a01b0316866001600160a01b03161180156107fc575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610833565b80600001516001600160a01b0316866001600160a01b031610801561083357506401000276a36001600160a01b038716115b6108695760405162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015260640160405180910390fd5b6000805460ff60f01b191681556040805160c08101909152808a6108985760048460a0015160ff16901c6108a9565b60108460a001516108a9919061527a565b60ff1681526004546001600160801b031660208201526040014263ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c61093f57600254610943565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b8051158015906109925750886001600160a01b031681604001516001600160a01b031614155b15610ed0576040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260408201516001600160a01b031681526060820151610a13906006907f00000000000000000000000000000000000000000000000000000000000000008f6126e7565b1515604083015260020b60208201819052620d89e7191315610a3e57620d89e7196020820152610a72565b610a4b620d89e7196152b2565b60020b816020015160020b1315610a7257610a69620d89e7196152b2565b60020b60208201525b610a7f8160200151612829565b6001600160a01b031660608201526040820151610b10908d610ab9578b6001600160a01b031683606001516001600160a01b031611610ad3565b8b6001600160a01b031683606001516001600160a01b0316105b610ae1578260600151610ae3565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000000612b49565b60c085015260a084015260808301526001600160a01b031660408301528215610b7257610b468160c00151826080015101612d3b565b825103825260a0810151610b5990612d3b565b82602001818151610b6a91906152d5565b905250610bb5565b610b7f8160a00151612d3b565b825101825260c08101516080820151610ba091610b9b91615314565b612d3b565b82602001818151610bb1919061532c565b9052505b835160ff1615610c01576000846000015160ff168260c0015181610bdb57610bdb615264565b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610c4057610c348160c00151600160801b8460c001516001600160801b0316612d51565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610e9357806040015115610e6e578360a00151610cc657610ca8846040015160008760200151886040015188602001518a606001516008612e05909695949392919063ffffffff16565b6001600160a01b0316608086015260060b6060850152600160a08501525b6000610e1a82602001518e610cdd57600154610ce3565b84608001515b8f610cf2578560800151610cf6565b6002545b608089015160608a01516040808c0151600296870b6000908152600560205291909120600181018054909603909555948401805490930390925560038301805463ffffffff600160d81b66ffffffffffffff196001600160a01b03600160381b8086048216909703169095029485167fffffffffff00000000000000000000000000000000000000000000000000000084161766ffffffffffffff7fffffffffff0000000000000000000000000000000000000000ffffffffffffff8516871760060b909703969096169586178190048216909703169095027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000929092166001600160f81b031990951694909417919091171790915554600160801b9004600f0b90565b90508c15610e26576000035b600081600f0b12610e4657808360c00151610e41919061536c565b610e5e565b610e4f81615397565b8360c00151610e5e91906153b5565b6001600160801b031660c0840152505b8b610e7d578060200151610e86565b60018160200151035b60020b6060830152610eca565b80600001516001600160a01b031682604001516001600160a01b031614610eca57610ec18260400151612fb6565b60020b60608301525b5061096c565b836020015160020b816060015160020b14610fb757600080610f1e86604001518660400151886020015188602001518a606001518b6080015160086132c5909695949392919063ffffffff16565b604085015160608601516000805463ffffffff60b81b1916600160c81b61ffff9586160261ffff60b81b191617600160b81b95909416949094029290921776ffffffffffffffffffffffffffffffffffffffffffffff1916600160a01b62ffffff9093169290920273ffffffffffffffffffffffffffffffffffffffff1916919091176001600160a01b0390911617905550610fe99050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b03161461102f5760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561107f57608081015160015560a08101516001600160801b03161561107a5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b6110c5565b608081015160025560a08101516001600160801b0316156110c55760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146110de57602081015181518b036110eb565b80600001518a0381602001515b90965094508a156111cc57600085121561112d5761112d7f00000000000000000000000000000000000000000000000000000000000000008d8760000361344e565b600061113761353a565b60405163fa461e3360e01b8152909150339063fa461e3390611163908a908a908e908e90600401615406565b600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b5050505061119d61353a565b6111a78883615314565b11156111c657604051635d05ca8f60e11b815260040160405180910390fd5b5061129e565b6000861215611203576112037f00000000000000000000000000000000000000000000000000000000000000008d8860000361344e565b600061120d613650565b60405163fa461e3360e01b8152909150339063fa461e3390611239908a908a908e908e90600401615406565b600060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b50505050611273613650565b61127d8783615314565b111561129c57604051635d05ca8f60e11b815260040160405180910390fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516958101959095526001600160801b039092169084015260020b60808301528d169033907fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679060a00160405180910390a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60088161ffff811061134b57600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff166113aa576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556113bf6126b0565b60008054600160d81b900461ffff16906113db6008838561369c565b6000805461ffff808416600160d81b81027fffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff90931692909217909255919250831614611461576040805161ffff8085168252831660208201527fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a91015b60405180910390a15b50506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff166114a6576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556001600160801b0385166114c657600080fd5b60008061151460405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161150a8a6001600160801b031661372d565b600f0b9052613743565b925092505081935080925060008060008611156115365761153361353a565b91505b841561154757611544613650565b90505b60405163d348799760e01b8152339063d34879979061157090899089908d908d90600401615406565b600060405180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506000861180156115c157506115b561353a565b6115bf8784615314565b115b156115df5760405163748800af60e01b815260040160405180910390fd5b6000851180156115fe57506115f2613650565b6115fc8683615314565b115b1561161c57604051631072b39760e11b815260040160405180910390fd5b604080513381526001600160801b038b1660208201529081018790526060810186905260028b810b91908d900b906001600160a01b038f16907f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde9060800160405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b600054600160f01b900460ff166116d0576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b191690556116e56126b0565b6004546001600160801b03168061170f57604051639f13f76d60e01b815260040160405180910390fd5b6000611744867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061177b867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406139a5565b9050600061178761353a565b90506000611793613650565b905088156117c6576117c67f00000000000000000000000000000000000000000000000000000000000000008b8b61344e565b87156117f7576117f77f00000000000000000000000000000000000000000000000000000000000000008b8a61344e565b604051630e9cbafb60e41b8152339063e9cbafb09061182090879087908c908c90600401615406565b600060405180830381600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b50505050600061185c61353a565b90506000611868613650565b9050816118758786615314565b11156118945760405163f704e89960e01b815260040160405180910390fd5b8061189f8685615314565b11156118be5760405163e90c349360e01b815260040160405180910390fd5b8382038382038386146119545760008054600160e81b9004600f169081156118f8578160ff1684816118f2576118f2615264565b046118fb565b60005b90506001600160801b0381161561192e57600380546001600160801b038082168401166001600160801b03199091161790555b611948818503600160801b8d6001600160801b0316612d51565b60018054909101905550505b80156119e55760008054600160e81b900460041c600f1690811561198a578160ff16838161198457611984615264565b0461198d565b60005b90506001600160801b038116156119bf57600380546001600160801b03600160801b8083048216850182160291161790555b6119d9818403600160801b8d6001600160801b0316612d51565b60028054909101905550505b604080518e8152602081018e9052908101839052606081018290526001600160a01b038f169033907fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6339060800160405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611a8a576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b19168155604080513360601b6bffffffffffffffffffffffff191660208083019190915260e88a811b603484015289901b60378301528251601a818403018152603a9092018352815191810191909120835260079052902060038101546001600160801b0390811690861611611b095784611b18565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611b405783611b56565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611bbb576003810180546001600160801b031981166001600160801b03918216869003821617909155611bbb907f0000000000000000000000000000000000000000000000000000000000000000908a90861661344e565b6001600160801b03821615611c21576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611c21907f0000000000000000000000000000000000000000000000000000000000000000908a90851661344e565b604080516001600160a01b038a1681526001600160801b0385811660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b600054600160f01b900460ff16611ccb576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190615430565b6001600160a01b0316336001600160a01b031614611d7e57600080fd5b60ff82161580611da1575060048260ff1610158015611da15750600a8260ff1611155b8015611dcb575060ff81161580611dcb575060048160ff1610158015611dcb5750600a8160ff1611155b611dd457600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c166020830152868316908201529084166060820152608001611458565b600080548190600160f01b900460ff16611e9e576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b9160048083019260209291908290030181865afa158015611f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f349190615430565b6001600160a01b0316336001600160a01b031614611f5157600080fd5b6003546001600160801b0390811690851611611f6d5783611f7a565b6003546001600160801b03165b6003549092506001600160801b03600160801b909104811690841611611fa05782611fb4565b600354600160801b90046001600160801b03165b90506001600160801b03821615612035576003546001600160801b0383811691161415611fe357600019909101905b600380546001600160801b031981166001600160801b03918216859003821617909155612035907f0000000000000000000000000000000000000000000000000000000000000000908790851661344e565b6001600160801b038116156120bb576003546001600160801b03828116600160801b90920416141561206657600019015b600380546001600160801b03600160801b8083048216859003821602918116919091179091556120bb907f0000000000000000000000000000000000000000000000000000000000000000908790841661344e565b604080516001600160801b038085168252831660208201526001600160a01b0387169133917f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151910160405180910390a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806121336126b0565b6121a342858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b9004166139e5565b915091505b9250929050565b600080548190600160f01b900460ff166121dc576040516350dfbc4360e11b815260040160405180910390fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061223590606081016122286001600160801b038a1661372d565b600003600f0b9052613743565b92509250925081600003945080600003935060008511806122565750600084115b15612291576003830180546001600160801b0380821688018116600160801b92839004821688019091169091026001600160801b0319161790555b604080516001600160801b038816815260208101879052908101859052600288810b91908a900b9033907f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c9060600160405180910390a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006123156126b0565b61231f8585613b30565b600285810b6000908152600560205260408082209287900b825281206003830154600681900b93600160381b82046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061237f57600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806123c057600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e900b13159050612462575093909403965090039350900390506124dc565b8a60020b816020015160020b12156124cd57602081015160408201516004546060840151429360009384936124ab9360089388938793919290916001600160801b031690612e05565b9a9003989098039b5050949096039290920396509091030392506124dc915050565b50949093039650039350900390505b9250925092565b6000546001600160a01b03161561250d5760405163139816ff60e31b815260040160405180910390fd5b600061251882612fb6565b604080516080808201835263ffffffff42168083526000602080850182905284860182905260016060958601819052600160f81b909317600855855160e0810187526001600160a01b038a16808252600289900b82840181905282890185905296820185905294810184905260a0810183905260c001839052815476ffffffffffffffffffffffffffffffffffffffffffffff19168417600160a01b62ffffff891602177fff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff166501000001000160c81b1790915584519283528201929092528251939450909283927f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95928290030190a150505050565b60008082600281900b620d89e7198161264957612649615264565b05029050600083600281900b620d89e88161266657612666615264565b0502905060008460020b83830360020b8161268357612683615264565b0560010190508062ffffff166001600160801b038016816126a6576126a6615264565b0495945050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146126e557600080fd5b565b60008060008460020b8660020b8161270157612701615264565b05905060008660020b12801561272e57508460020b8660020b8161272757612727615264565b0760020b15155b1561273857600019015b83156127ac57600281900b600881901d600181810b600090815260208b9052604090205461010090930760ff81169190911b8001600019019283168015159550919290918561278e57888360ff168603026127a1565b8861279882613bb6565b840360ff168603025b96505050505061281f565b600181810160020b600881901d80830b600090815260208b9052604090205461010090920760ff81169390931b60001901199182168015159550909291908561280257888360ff0360ff16866001010102612818565b888361280d83613c56565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612840578260020b612848565b8260020b6000035b9050620d89e881111561286e576040516315e4079d60e11b815260040160405180910390fd5b60006001821661288257600160801b612894565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156128c8576ffff97272373d413259a46990580e213a0260801c5b60048216156128e7576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612906576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612925576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612944576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612963576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612982576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156129a2576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156129c2576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156129e2576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612a02576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612a22576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612a42576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612a62576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612a82576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612aa3576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612ac3576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612ae2576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612aff576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612b20578060001981612b1c57612b1c615264565b0490505b640100000000810615612b34576001612b37565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590612bce576000612b828989620f42400362ffffff16620f4240612d51565b905082612b9b57612b968c8c8c6001613d40565b612ba8565b612ba88b8d8c6001613dbb565b9550858110612bb9578a9650612bc8565b612bc58c8b8386613e84565b96505b50612c18565b81612be557612be08b8b8b6000613dbb565b612bf2565b612bf28a8c8b6000613d40565b9350838860000310612c0657899550612c18565b612c158b8a8a60000385613ed0565b95505b6001600160a01b038a8116908716148215612c7b57808015612c375750815b612c4d57612c48878d8c6001613dbb565b612c4f565b855b9550808015612c5c575081155b612c7257612c6d878d8c6000613d40565b612c74565b845b9450612cc5565b808015612c855750815b612c9b57612c968c888c6001613d40565b612c9d565b855b9550808015612caa575081155b612cc057612cbb8c888c6000613dbb565b612cc2565b845b94505b81158015612cd557508860000385115b15612ce1578860000394505b818015612d0057508a6001600160a01b0316876001600160a01b031614155b15612d0f578589039350612d2c565b612d29868962ffffff168a620f42400362ffffff166139a5565b93505b50505095509550955095915050565b6000600160ff1b8210612d4d57600080fd5b5090565b600080806000198587098587029250828110838203039150508060001415612d8b5760008411612d8057600080fd5b508290049050612dfe565b808411612d9757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716612eac576000898661ffff1661ffff8110612e2c57612e2c61544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612e9857612e95818a8988613f1c565b90505b806020015181604001519250925050612faa565b868803600080612ec18c8c858c8c8c8c613fee565b91509150816000015163ffffffff168363ffffffff161415612ef3578160200151826040015194509450505050612faa565b805163ffffffff84811691161415612f1b578060200151816040015194509450505050612faa565b60008260000151826000015103905060008360000151850390508063ffffffff168263ffffffff1660060b856020015185602001510360060b81612f6157612f61615264565b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612f9957612f99615264565b048560400151019650965050505050505b97509795505050505050565b60006401000276a36001600160a01b03831610801590612ff2575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61300f576040516324c070df60e11b815260040160405180910390fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106130b057607f810383901c91506130ba565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146132b657886001600160a01b031661329b82612829565b6001600160a01b031611156132b057816132b8565b806132b8565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106132e1576132e161544d565b60408051608081018252919092015463ffffffff808216808452640100000000830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561334b5788859250925050612faa565b8461ffff168461ffff1611801561336c57506001850361ffff168961ffff16145b156133795783915061337d565b8491505b8161ffff168960010161ffff168161339757613397615264565b0692506133a681898989613f1c565b8a8461ffff1661ffff81106133bd576133bd61544d565b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02959095166affffffffffffffffffffff66ffffffffffffff909216640100000000026affffffffffffffffffffff1990931663ffffffff909516949094179190911716919091179190911790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916134aa9190615463565b6000604051808303816000865af19150503d80600081146134e7576040519150601f19603f3d011682016040523d82523d6000602084013e6134ec565b606091505b5091509150818015613516575080511580613516575080806020019051810190613516919061549e565b61353357604051638b98626560e01b815260040160405180910390fd5b5050505050565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b906044015b60408051601f198184030181529181526020820180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516135d89190615463565b600060405180830381855afa9150503d8060008114613613576040519150601f19603f3d011682016040523d82523d6000602084013e613618565b606091505b509150915081801561362c57506020815110155b61363557600080fd5b8080602001905181019061364991906154bb565b9250505090565b604051306024820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823160e01b90604401613582565b6000808361ffff16116136c257604051636b93000360e11b815260040160405180910390fd5b8261ffff168261ffff16116136d8575081612dfe565b825b8261ffff168161ffff161015613724576001858261ffff1661ffff81106137035761370361544d565b01805463ffffffff191663ffffffff929092169190911790556001016136da565b50909392505050565b80600f81900b811461373e57600080fd5b919050565b60008060006137506126b0565b61376284602001518560400151613b30565b6040805160e0810182526000546001600160a01b0381168252600160a01b810460020b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c0850152885190890151948901519289015193946138009491939092909190614209565b93508460600151600f0b60001461399d57846020015160020b816020015160020b12156138555761384e6138378660200151612829565b6138448760400151612829565b8760600151614439565b925061399d565b846040015160020b816020015160020b12156139735760045460408201516001600160801b03909116906138a0904260208501516060860151608087015160089493929187916132c5565b6000805463ffffffff60b81b1916600160c81b61ffff9384160261ffff60b81b191617600160b81b9390921692909202179055815160408701516138f291906138e890612829565b8860600151614439565b93506139106139048760200151612829565b83516060890151614478565b925060008660600151600f0b12613935576060860151613930908261536c565b61394d565b856060015161394390615397565b61394d90826153b5565b600480546001600160801b0319166001600160801b03929092169190911790555061399d565b61399a6139838660200151612829565b6139908760400151612829565b8760600151614478565b91505b509193909250565b60006139b2848484612d51565b9050600082806139c4576139c4615264565b8486091115612dfe5760001981106139db57600080fd5b6001019392505050565b60608060008361ffff1611613a0d57604051636b93000360e11b815260040160405180910390fd5b865167ffffffffffffffff811115613a2757613a276154d4565b604051908082528060200260200182016040528015613a50578160200160208202803683370190505b509150865167ffffffffffffffff811115613a6d57613a6d6154d4565b604051908082528060200260200182016040528015613a96578160200160208202803683370190505b50905060005b8751811015613b2357613acd8a8a8a8481518110613abc57613abc61544d565b60200260200101518a8a8a8a612e05565b848381518110613adf57613adf61544d565b60200260200101848481518110613af857613af861544d565b6001600160a01b039093166020938402919091019092019190915260069190910b9052600101613a9c565b5097509795505050505050565b8060020b8260020b12613b5657604051632fe0284f60e01b815260040160405180910390fd5b620d89e719600283900b1215613b7f5760405163135ac25d60e31b815260040160405180910390fd5b613b8c620d89e7196152b2565b60020b8160020b1315613bb25760405163d7b54ab160e01b815260040160405180910390fd5b5050565b6000808211613bc457600080fd5b600160801b8210613bd757608091821c91015b680100000000000000008210613bef57604091821c91015b6401000000008210613c0357602091821c91015b620100008210613c1557601091821c91015b6101008210613c2657600891821c91015b60108210613c3657600491821c91015b60048210613c4657600291821c91015b6002821061373e57600101919050565b6000808211613c6457600080fd5b5060ff6001600160801b03821615613c7f57607f1901613c87565b608082901c91505b67ffffffffffffffff821615613ca057603f1901613ca8565b604082901c91505b63ffffffff821615613cbd57601f1901613cc5565b602082901c91505b61ffff821615613cd857600f1901613ce0565b601082901c91505b60ff821615613cf25760071901613cfa565b600882901c91505b600f821615613d0c5760031901613d14565b600482901c91505b6003821615613d265760011901613d2e565b600282901c91505b600182161561373e5760001901919050565b6000836001600160a01b0316856001600160a01b03161115613d60579293925b81613d8d57613d88836001600160801b03168686036001600160a01b0316600160601b612d51565b613db0565b613db0836001600160801b03168686036001600160a01b0316600160601b6139a5565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115613ddb579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b038686038116908716613e1757600080fd5b83613e4d57866001600160a01b0316613e3a8383896001600160a01b0316612d51565b81613e4757613e47615264565b04613e79565b613e79613e648383896001600160a01b03166139a5565b886001600160a01b0316808204910615150190565b979650505050505050565b600080856001600160a01b031611613e9b57600080fd5b6000846001600160801b031611613eb157600080fd5b81613ec357613d8885858560016144a7565b613db0858585600161458d565b600080856001600160a01b031611613ee757600080fd5b6000846001600160801b031611613efd57600080fd5b81613f0f57613d88858585600061458d565b613db085858560006144a7565b604080516080810182526000808252602082018190529181018290526060810191909152600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b031611613f94576001613f96565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b1681613fc757613fc7615264565b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152888561ffff1661ffff811061404d5761404d61544d565b60408051608081018252919092015463ffffffff8116808352640100000000820460060b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff161515606082015292506140ac9089908961468d565b156140e4578663ffffffff16826000015163ffffffff1614156140ce57612faa565b816140db83898988613f1c565b91509150612faa565b888361ffff168660010161ffff16816140ff576140ff615264565b0661ffff1661ffff81106141155761411561544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506141c057604080516080810182528a5463ffffffff81168252640100000000810460060b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6141cf8883600001518961468d565b6141ec576040516327e8e87560e01b815260040160405180910390fd5b6141f98989898887614750565b9150915097509795505050505050565b604080516bffffffffffffffffffffffff19606088901b1660208083019190915260e887811b603484015286901b60378301528251808303601a018152603a90920183528151918101919091206000908152600790915290812060015460025491925090600080600f87900b1561439b576000805460045442929182916142c09160089186918591600160a01b820460020b9161ffff600160b81b82048116926001600160801b031691600160c81b900416612e05565b90925090506142fa60058d8b8d8b8b87898b60007f000000000000000000000000000000000000000000000000000000000000000061493a565b945061433160058c8b8d8b8b87898b60017f000000000000000000000000000000000000000000000000000000000000000061493a565b935084156143655761436560068d7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b83156143975761439760068c7f0000000000000000000000000000000000000000000000000000000000000000614ae5565b5050505b6000806143ad60058c8c8b8a8a614b62565b90925090506143be878a8484614c09565b600089600f0b121561442a5783156143fa5760028b810b6000908152600560205260408120818155600181018290559182018190556003909101555b821561442a5760028a810b6000908152600560205260408120818155600181018290559182018190556003909101555b50505050505095945050505050565b60008082600f0b1261445a57614455610b9b8585856001613dbb565b613db3565b61446d610b9b8585856000036000613dbb565b600003949350505050565b60008082600f0b1261449457614455610b9b8585856001613d40565b61446d610b9b8585856000036000613d40565b600081156145195760006001600160a01b038411156144dd576144d884600160601b876001600160801b0316612d51565b6144f4565b6144f46001600160801b038616606086901b6154ea565b905061451161450c826001600160a01b038916615314565b614da6565b915050613db3565b60006001600160a01b038411156145475761454284600160601b876001600160801b03166139a5565b614564565b614564606085901b6001600160801b038716808204910615150190565b905080866001600160a01b03161161457b57600080fd5b6001600160a01b038616039050613db3565b60008261459b575083613db3565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614640576001600160a01b038616848102908582816145e1576145e1615264565b041415614612578181018281106146105761460683896001600160a01b0316836139a5565b9350505050613db3565b505b50614511818561462b6001600160a01b038a16836154ea565b6146359190615314565b808204910615150190565b6001600160a01b0386168481029085828161465d5761465d615264565b0414801561466a57508082115b61467357600080fd5b80820361460661450c846001600160a01b038b16846139a5565b60008363ffffffff168363ffffffff16111580156146b757508363ffffffff168263ffffffff1611155b156146d3578163ffffffff168363ffffffff1611159050612dfe565b60008463ffffffff168463ffffffff16116146fb578363ffffffff1664010000000001614703565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614734578363ffffffff166401000000000161473c565b8363ffffffff165b64ffffffffff169091111595945050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260008361ffff168560010161ffff16816147b4576147b4615264565b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816147e7576147e7615264565b0661ffff81106147f9576147f961544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061485e578060010192506147cc565b898661ffff16826001018161487557614875615264565b0661ffff81106148875761488761544d565b60408051608081018252929091015463ffffffff81168352640100000000810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906148ec908b908b61468d565b905080801561490557506149058a8a876000015161468d565b15614910575061492d565b8061492057600182039250614927565b8160010193505b506147cc565b5050509550959350505050565b60028a900b600090815260208c90526040812080546001600160801b031682600f8c900b81136149735761496e8c8361536c565b614986565b61497c8c615397565b61498690836153b5565b9050846001600160801b0316816001600160801b031611156149bb576040516368d2be8f60e01b815260040160405180910390fd5b6001600160801b038281161590821615811415945015614a69578c60020b8e60020b13614a5157600183018b9055600283018a905560038301805466ffffffffffffff8a166001600160f81b0319909116600160381b6001600160a01b038d16027fff00000000ffffffffffffffffffffffffffffffffffffffff00000000000000161717600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b03821617835585614aa3578254614a9e908d90600160801b9004600f0b6154fe565b614aba565b8254614aba908d90600160801b9004600f0b61554d565b83546001600160801b03918216600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b81614afa57614afa615264565b0760020b15614b0857600080fd5b600080614b368360020b8560020b81614b2357614b23615264565b0560020b600881901d9161010090910790565b600191820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b60008181526020899052604080822088850b83529082209193849391929184918291908a900b12614ba357505060018201546002830154614bb6565b8360010154880391508360020154870390505b6000808b60020b8b60020b1215614bd857505060018301546002840154614beb565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b614c8f5781516001600160801b0316614c8757604051632aabfc9960e11b815260040160405180910390fd5b508051614cc4565b600085600f0b12614cac578151614ca790869061536c565b614cc1565b614cb585615397565b8251614cc191906153b5565b90505b600080614ce98460200151870385600001516001600160801b0316600160801b612d51565b9150614d0d8460400151860385600001516001600160801b0316600160801b612d51565b905086600f0b600014614d345787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b038216151580614d6257506000816001600160801b0316115b15614d9c57600388018054600160801b6001600160801b03808316860181166001600160801b031990931683178290048116850116021790555b5050505050505050565b806001600160a01b038116811461373e57600080fd5b6001600160a01b0381168114614dd157600080fd5b50565b8015158114614dd157600080fd5b60008083601f840112614df457600080fd5b50813567ffffffffffffffff811115614e0c57600080fd5b6020830191508360208285010111156121a857600080fd5b60008060008060008060a08789031215614e3d57600080fd5b8635614e4881614dbc565b95506020870135614e5881614dd4565b9450604087013593506060870135614e6f81614dbc565b9250608087013567ffffffffffffffff811115614e8b57600080fd5b614e9789828a01614de2565b979a9699509497509295939492505050565b600060208284031215614ebb57600080fd5b5035919050565b600060208284031215614ed457600080fd5b813561ffff81168114612dfe57600080fd5b8035600281900b811461373e57600080fd5b80356001600160801b038116811461373e57600080fd5b60008060008060008060a08789031215614f2857600080fd5b8635614f3381614dbc565b9550614f4160208801614ee6565b9450614f4f60408801614ee6565b9350614e6f60608801614ef8565b600080600080600060808688031215614f7557600080fd5b8535614f8081614dbc565b94506020860135935060408601359250606086013567ffffffffffffffff811115614faa57600080fd5b614fb688828901614de2565b969995985093965092949392505050565b600080600080600060a08688031215614fdf57600080fd5b8535614fea81614dbc565b9450614ff860208701614ee6565b935061500660408701614ee6565b925061501460608701614ef8565b915061502260808701614ef8565b90509295509295909350565b60006020828403121561504057600080fd5b81358060010b8114612dfe57600080fd5b803560ff8116811461373e57600080fd5b6000806040838503121561507557600080fd5b61507e83615051565b915061508c60208401615051565b90509250929050565b6000806000606084860312156150aa57600080fd5b83356150b581614dbc565b92506150c360208501614ef8565b91506150d160408501614ef8565b90509250925092565b600080602083850312156150ed57600080fd5b823567ffffffffffffffff8082111561510557600080fd5b818501915085601f83011261511957600080fd5b81358181111561512857600080fd5b8660208260051b850101111561513d57600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b8281101561518b57815160060b8452928401929084019060010161516c565b5050508381038285015284518082528583019183019060005b818110156151c95783516001600160a01b0316835292840192918401916001016151a4565b5090979650505050505050565b6000806000606084860312156151eb57600080fd5b6151f484614ee6565b92506150c360208501614ee6565b6000806040838503121561521557600080fd5b61521e83614ee6565b915061508c60208401614ee6565b60006020828403121561523e57600080fd5b612dfe82614ee6565b60006020828403121561525957600080fd5b8135612dfe81614dbc565b634e487b7160e01b600052601260045260246000fd5b600060ff83168061528d5761528d615264565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b60008160020b627fffff198114156152cc576152cc61529c565b60000392915050565b60008083128015600160ff1b8501841216156152f3576152f361529c565b836001600160ff1b0301831381161561530e5761530e61529c565b50500390565b600082198211156153275761532761529c565b500190565b6000808212826001600160ff1b030384138115161561534d5761534d61529c565b600160ff1b83900384128116156153665761536661529c565b50500190565b60006001600160801b0380831681851680830382111561538e5761538e61529c565b01949350505050565b600081600f0b60016001607f1b03198114156152cc576152cc61529c565b60006001600160801b03838116908316818110156153d5576153d561529c565b039392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8481528360208201526060604082015260006154266060830184866153dd565b9695505050505050565b60006020828403121561544257600080fd5b8151612dfe81614dbc565b634e487b7160e01b600052603260045260246000fd5b6000825160005b81811015615484576020818601810151858301520161546a565b81811115615493576000828501525b509190910192915050565b6000602082840312156154b057600080fd5b8151612dfe81614dd4565b6000602082840312156154cd57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6000826154f9576154f9615264565b500490565b600081600f0b83600f0b600082128260016001607f1b03038213811516156155285761552861529c565b8260016001607f1b03190382128116156155445761554461529c565b50019392505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156155785761557861529c565b8160016001607f1b030183138116156155935761559361529c565b509003939250505056fea164736f6c634300080c000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/dexV3.ts b/src/dexV3.ts new file mode 100644 index 0000000..dd9741d --- /dev/null +++ b/src/dexV3.ts @@ -0,0 +1,162 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { HardhatEthersHelpers } from 'hardhat/types' +import { ether } from './utils' +// Setup DEX Contracts +import UniswapV3Factory from './artifacts-apeswap/dex/contracts/UniswapV3Factory.json' +import UniswapV3Pool from './artifacts-apeswap/dex/contracts/UniswapV3Pool.json' +import NonfungiblePositionManagerBuild from './artifacts-apeswap/dex/contracts/NonfungiblePositionManager.json' +import NFTDescriptorBuild from './artifacts-apeswap/dex/contracts/NFTDescriptor.json' +import SwapRouterBuild from './artifacts-apeswap/dex/contracts/SwapRouter.json' +import NonfungibleTokenPositionDescriptorBuild from './artifacts-apeswap/dex/contracts/NonfungibleTokenPositionDescriptor.json' + +// Setup Token Contracts +import ERC20MockBuild from './artifacts-apeswap/token/contracts/ERC20Mock.json' +import WNativeBuild from './artifacts-apeswap/token/contracts/WNative.json' + +// Import Contract Types +import { + ApePair, + ApePair__factory, + ERC20Mock, + ERC20Mock__factory, + WNative__factory, + UniswapV3Factory__factory, + NFTDescriptor__factory, + SwapRouter__factory, + NonfungiblePositionManager__factory, + NonfungibleTokenPositionDescriptor__factory, +} from '../typechain-types' + +/** + * Deploy a mock dex. + * + * - LP fees are sent to `feeTo` + * - Initial LP tokens are minted to `alice` + */ +// NOTE: Currently does not create a BANANA/WBNB pair +export async function deployMockDex( + ethers: HardhatEthersHelpers, + [owner, feeTo, alice]: [ + SignerWithAddress, + SignerWithAddress, + SignerWithAddress + ], + numPairs = 2 +) { + const SwapRouter = (await ethers.getContractFactoryFromArtifact( + SwapRouterBuild + )) as SwapRouter__factory + const uniV3Factory = (await ethers.getContractFactoryFromArtifact( + UniswapV3Factory + )) as UniswapV3Factory__factory + const nonfungiblePositionManager = + (await ethers.getContractFactoryFromArtifact( + NonfungiblePositionManagerBuild + )) as NonfungiblePositionManager__factory + const NFTDescriptor = (await ethers.getContractFactoryFromArtifact( + NFTDescriptorBuild + )) as NFTDescriptor__factory + + const nftDescriptor = await NFTDescriptor.deploy() + const nonfungibleTokenPositionDescriptor = + (await ethers.getContractFactoryFromArtifact( + NonfungibleTokenPositionDescriptorBuild, + { libraries: { NFTDescriptor: nftDescriptor.address } } + )) as NonfungibleTokenPositionDescriptor__factory + + // Setup Token Contracts + const ERC20Mock = (await ethers.getContractFactory( + ERC20MockBuild.abi, + ERC20MockBuild.bytecode + )) as ERC20Mock__factory + const WNative = (await ethers.getContractFactory( + WNativeBuild.abi, + WNativeBuild.bytecode + )) as WNative__factory + + const TOKEN_BASE_BALANCE = ether('1000') + const WBNB_BASE_BALANCE = ether('1') + // Setup DEX factory + const dexFactory = await uniV3Factory.connect(owner).deploy() + + // Setup pairs + const mockWBNB = await WNative.connect(owner).deploy() + const positionDescriptor = await nonfungibleTokenPositionDescriptor + .connect(owner) + .deploy( + mockWBNB.address, + '0x4c4f43414c205445535400000000000000000000000000000000000000000000' + ) + const positionManager = await nonfungiblePositionManager + .connect(owner) + .deploy(dexFactory.address, mockWBNB.address, positionDescriptor.address) + + const dexRouter = await SwapRouter.deploy( + dexFactory.address, + mockWBNB.address + ) + + const mockTokens: ERC20Mock[] = [] + for (let index = 0; index < numPairs; index++) { + // Mint pair token + const mockToken = await ERC20Mock.connect(owner).deploy( + `Mock Token ${index}`, + `MOCK${index}` + ) + + await mockToken.connect(owner).mint(TOKEN_BASE_BALANCE) + await mockToken + .connect(owner) + .approve(positionManager.address, TOKEN_BASE_BALANCE) + + await mockWBNB.connect(owner).deposit({ + value: WBNB_BASE_BALANCE, // Adding ETH liquidity which gets exchanged for WETH + }) + await mockWBNB + .connect(owner) + .approve(positionManager.address, WBNB_BASE_BALANCE) + + let token0 = mockWBNB.address + let token1 = mockToken.address + if (mockWBNB.address > mockToken.address) { + token0 = mockToken.address + token1 = mockWBNB.address + } + + await positionManager.createAndInitializePoolIfNecessary( + token0, + token1, + 500, + '79229023000000000000000000000', + { gasLimit: '30000000' } + ) + + await positionManager.mint( + { + token0: token0, + token1: token1, + fee: 500, + tickLower: -887270, + tickUpper: 887270, + amount0Desired: TOKEN_BASE_BALANCE, + amount1Desired: WBNB_BASE_BALANCE, + amount0Min: 0, + amount1Min: 0, + recipient: owner.address, + deadline: '999999999999999', + }, + { gasLimit: '30000000' } + ) + + mockTokens.push(mockToken) + } + + return { + dexFactory, + dexRouter, + positionManager, + positionDescriptor, + mockWBNB, + mockTokens, + } +} diff --git a/src/index.ts b/src/index.ts index 2f3b87e..b8f1750 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ * the smart contracts developed in this repo. */ export * as dex from './dex'; +export * as dexV3 from './dexV3'; export * as farm from './farm'; export * as farmV2 from './farmV2'; export * as token from './token'; diff --git a/test/dexV3.test.ts b/test/dexV3.test.ts new file mode 100644 index 0000000..819ceeb --- /dev/null +++ b/test/dexV3.test.ts @@ -0,0 +1,104 @@ +import { time, loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { ether } from '../src/utils' +import { dexV3 } from '../src' + +/** + * hardhat-chai-matchers reference + * https://hardhat.org/hardhat-chai-matchers/docs/reference + * + * The @nomicfoundation/hardhat-chai-matchers plugin is meant to be a drop-in replacement + * for the @nomiclabs/hardhat-waffle plugin + * + * https://hardhat.org/hardhat-chai-matchers/docs/migrate-from-waffle + * + * VSCode + Hardhat: + * https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity + */ +import { anyValue } from '@nomicfoundation/hardhat-chai-matchers/withArgs' +import { expect } from 'chai' +// @ts-ignore +import { ethers } from 'hardhat' + +// Setup Token Contracts +import ERC20MockBuild from '../src/artifacts-apeswap/token/contracts/ERC20Mock.json' + +// Import Contract Types +import { ERC20Mock__factory } from '../typechain-types' + +describe('V3 DEX', function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployMockDexFixture() { + // Contracts are deployed using the first signer/account by default + const [owner, feeTo, alice] = await ethers.getSigners() + + const ERC20Mock = (await ethers.getContractFactory( + ERC20MockBuild.abi, + ERC20MockBuild.bytecode + )) as ERC20Mock__factory + + const { + dexFactory, + dexRouter, + positionDescriptor, + positionManager, + mockWBNB, + mockTokens, + } = await dexV3.deployMockDex(ethers, [owner, feeTo, alice], 2) // accounts passed will be used in the deployment + + return { + dexFactory, + dexRouter, + positionDescriptor, + positionManager, + mockWBNB, + mockTokens, + accounts: { + owner, + feeTo, + alice, + }, + } + } + + it('should have pair', async () => { + const mockDex = await loadFixture(deployMockDexFixture) + expect( + ( + await mockDex.dexFactory.getPool( + mockDex.mockTokens[0].address, + mockDex.mockWBNB.address, + 500 + ) + ).toString() + ).to.not.equal('0x0000000000000000000000000000000000000000') + }) + + it('should swap', async () => { + const mockDex = await loadFixture(deployMockDexFixture) + const token0 = mockDex.mockTokens[0] + const mockWBNB = mockDex.mockWBNB + const account = mockDex.accounts.owner.address + + const bnbBalanceBefore = await mockWBNB.balanceOf(account) + + await token0.approve(mockDex.dexRouter.address, ether('0.01')) + await mockDex.dexRouter.exactInputSingle({ + tokenIn: token0.address, + tokenOut: mockWBNB.address, + fee: 500, + recipient: account, + deadline: '99999999999999', + amountIn: ether('0.01'), + amountOutMinimum: 0, + sqrtPriceLimitX96: 0, + }) + + const bnbBalanceAfter = await mockWBNB.balanceOf(account) + expect(Number(bnbBalanceAfter)).to.be.gt( + Number(bnbBalanceBefore), + 'Did not receive any bnb on swap' + ) + }) +}) From d4ac81039e9f61e8f7f81a9cf5e9b3d8dded2953 Mon Sep 17 00:00:00 2001 From: defifofum Date: Mon, 27 Feb 2023 12:18:15 -0500 Subject: [PATCH 2/8] 0.6.0-alpha.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dcd5afc..884f1ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ape.swap/hardhat-test-helpers", - "version": "0.5.0", + "version": "0.6.0-alpha.0", "description": "Install this package to get access to deployable ApeSwap Mock Farm and DEX for testing with contracts developed with the Hardhat framework.", "main": "./dist/index.js", "files": [ From 3a196685704d83b050e8ad0428ae39e5497ebe59 Mon Sep 17 00:00:00 2001 From: defifofum Date: Mon, 27 Feb 2023 12:20:04 -0500 Subject: [PATCH 3/8] security: Upgrade hardhat --- yarn.lock | 743 +++++++++++++++++++++++++++++------------------------- 1 file changed, 404 insertions(+), 339 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3bf4a6a..786b05a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,30 +35,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2", "@ethereumjs/block@^3.6.3": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" - integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== - dependencies: - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - ethereumjs-util "^7.1.5" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/blockchain@^5.5.2", "@ethereumjs/blockchain@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" - integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - "@ethereumjs/common@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" @@ -67,7 +43,7 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.1" -"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": +"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": version "2.6.5" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== @@ -75,17 +51,6 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.5" -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - "@ethereumjs/tx@3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" @@ -94,7 +59,7 @@ "@ethereumjs/common" "^2.5.0" ethereumjs-util "^7.1.2" -"@ethereumjs/tx@^3.3.2", "@ethereumjs/tx@^3.5.1", "@ethereumjs/tx@^3.5.2": +"@ethereumjs/tx@^3.3.2": version "3.5.2" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== @@ -102,25 +67,7 @@ "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" -"@ethereumjs/vm@^5.9.0": - version "5.9.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.3.tgz#6d69202e4c132a4a1e1628ac246e92062e230823" - integrity sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg== - dependencies: - "@ethereumjs/block" "^3.6.3" - "@ethereumjs/blockchain" "^5.5.3" - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" - rustbn.js "~0.2.0" - -"@ethersproject/abi@5.6.4", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.7": +"@ethersproject/abi@5.6.4", "@ethersproject/abi@^5.4.7": version "5.6.4" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== @@ -135,7 +82,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" -"@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.6.3": +"@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -697,20 +644,15 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - -"@noble/hashes@~1.1.1": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" - integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" - integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -733,6 +675,138 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" + integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-blockchain@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" + integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-ethash" "^2.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" + integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== + dependencies: + "@nomicfoundation/ethereumjs-util" "^8.0.0" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" + integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" + integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" + integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== + +"@nomicfoundation/ethereumjs-statemanager@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" + integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + +"@nomicfoundation/ethereumjs-trie@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" + integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" + integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" + integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" + integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + "@nomicfoundation/hardhat-chai-matchers@^1.0.0": version "1.0.2" resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.2.tgz#38720afbef25df20f0d11faf33cb63cdefb43059" @@ -757,6 +831,72 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-1.0.2.tgz#342b79e19c456a56d8e76bc2e9cc8474cbcfc774" integrity sha512-8CEgWSKUK2aMit+76Sez8n7UB0Ze1lwT+LcWxj4EFP30lQWOwOws048t6MTPfThH0BlSWjC6hJRr0LncIkc1Sw== +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" + integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" + integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" + integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" + integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" + integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" + integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" + integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" + integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" + integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" + integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" + "@nomiclabs/hardhat-ethers@^2.0.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.0.tgz#9b7dc94d669ad9dc286b94f6f2f1513118c7027b" @@ -790,21 +930,21 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== -"@scure/bip32@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" - integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: - "@noble/hashes" "~1.1.1" - "@noble/secp256k1" "~1.6.0" + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" -"@scure/bip39@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" - integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: - "@noble/hashes" "~1.1.1" + "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" "@sentry/core@5.30.0": @@ -887,7 +1027,7 @@ dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.2", "@solidity-parser/parser@^0.14.3": +"@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.3": version "0.14.3" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== @@ -960,10 +1100,10 @@ dependencies: fs-extra "^9.1.0" -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== +"@types/async-eventemitter@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" + integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== "@types/bn.js@^4.11.3": version "4.11.6" @@ -1071,20 +1211,6 @@ dependencies: "@types/node" "*" -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" @@ -1109,9 +1235,9 @@ form-data "^3.0.0" "@types/node@*": - version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + version "18.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.2.tgz#c076ed1d7b6095078ad3cf21dfeea951842778b1" + integrity sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA== "@types/node@>=12.0.0": version "18.7.1" @@ -1164,11 +1290,6 @@ dependencies: "@types/node" "*" -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@vue/compiler-sfc@2.7.14": version "2.7.14" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz#3446fd2fbb670d709277fc3ffa88efc5e10284fd" @@ -1347,27 +1468,18 @@ abortcontroller-polyfill@^1.7.3: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" accepts@~1.3.8: version "1.3.8" @@ -1523,7 +1635,7 @@ antlr4ts@^0.5.0-alpha.4: resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== -anymatch@~3.1.1: +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1531,14 +1643,6 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1717,6 +1821,18 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bigint-crypto-utils@^3.0.23: + version "3.1.8" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz#e2e0f40cf45488f9d7f0e32ff84152aa73819d5d" + integrity sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw== + dependencies: + bigint-mod-arith "^3.1.0" + +bigint-mod-arith@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== + bignumber.js@^9.0.0: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" @@ -1800,6 +1916,16 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -1900,13 +2026,6 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== - dependencies: - safe-buffer "^5.1.1" - buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -1915,6 +2034,14 @@ buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" @@ -1922,6 +2049,13 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2005,6 +2139,11 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + cbor@^5.0.2: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" @@ -2142,6 +2281,17 @@ class-is@^1.1.0: resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== +classic-level@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -2345,11 +2495,6 @@ cookiejar@^2.1.1: resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== -core-js-pure@^3.0.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.24.1.tgz#8839dde5da545521bf282feb7dc6d0b425f39fd3" - integrity sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2603,14 +2748,6 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -2799,16 +2936,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2841,13 +2968,6 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3170,7 +3290,7 @@ ethereum-bloom-filters@^1.0.6: dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -3192,14 +3312,14 @@ ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-cryptography@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" - integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.6.3" - "@scure/bip32" "1.1.0" - "@scure/bip39" "1.1.0" + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" ethereumjs-abi@^0.6.8: version "0.6.8" @@ -3512,9 +3632,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== follow-redirects@^1.12.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" @@ -3665,7 +3785,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: +functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== @@ -3932,19 +4052,24 @@ hardhat-gas-reporter@^1.0.8: sha1 "^1.1.1" hardhat@^2.10.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.10.1.tgz#37fdc0c96d6a5d16b322269db2ad8f9f115c4046" - integrity sha512-0FN9TyCtn7Lt25SB2ei2G7nA2rZjP+RN6MvFOm+zYwherxLZNo6RbD8nDz88eCbhRapevmXqOiL2nM8INKsjmA== + version "2.12.7" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.7.tgz#d8de2dc32e9a2956d53cf26ef4cd5857e57a3138" + integrity sha512-voWoN6zn5d8BOEaczSyK/1PyfdeOeI3SbGCFb36yCHTJUt6OIqLb+ZDX30VhA1UsYKzLqG7UnWl3fKJUuANc6A== dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/tx" "^3.5.1" - "@ethereumjs/vm" "^5.9.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@nomicfoundation/ethereumjs-vm" "^6.0.0" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.2" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" @@ -3959,15 +4084,14 @@ hardhat@^2.10.1: env-paths "^2.2.0" ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.4" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.4" mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" @@ -3975,13 +4099,11 @@ hardhat@^2.10.1: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^5.4.0" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" @@ -4196,7 +4318,7 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4211,20 +4333,10 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - immutable@^4.0.0-rc.12: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" + integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== import-fresh@^2.0.0: version "2.0.0" @@ -4260,7 +4372,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4359,6 +4471,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -4648,7 +4765,7 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -keccak@^3.0.0: +keccak@^3.0.0, keccak@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== @@ -4676,76 +4793,26 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== -level-supports@~1.0.0: +level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - xtend "^4.0.2" + buffer "^6.0.3" + module-error "^1.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + browser-level "^1.0.1" + classic-level "^1.2.0" levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -4863,11 +4930,6 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== -ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -4897,17 +4959,14 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" memorystream@^0.3.1: version "0.3.1" @@ -4936,18 +4995,6 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5084,11 +5131,10 @@ mnemonist@^0.38.0: obliterator "^2.0.0" mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" @@ -5146,6 +5192,11 @@ mock-fs@^4.1.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5226,6 +5277,11 @@ nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5775,11 +5831,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -5841,7 +5892,7 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -5871,7 +5922,7 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1, raw-body@^2.4.1: +raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -5881,6 +5932,16 @@ raw-body@2.5.1, raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + readable-stream@^2.2.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -5894,10 +5955,10 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -6127,6 +6188,13 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -6218,11 +6286,6 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== - semver@^5.5.0, semver@^5.5.1, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -6535,6 +6598,11 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -6837,11 +6905,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== - ts-command-line-args@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" @@ -7025,10 +7088,12 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.4.0: - version "5.8.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.8.2.tgz#071fc8a6a5d24db0ad510ad442f607d9b09d5eec" - integrity sha512-3KLq3pXMS0Y4IELV045fTxqz04Nk9Ms7yfBBHum3yxsTR4XNn+ZCaUbf/mWitgYDAhsplQ0B1G4S5D345lMO3A== +undici@^5.14.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.20.0.tgz#6327462f5ce1d3646bcdac99da7317f455bcc263" + integrity sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g== + dependencies: + busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" @@ -7897,7 +7962,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: +xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== From 6b35b46e70a7eb9040212cb6ab3c2bd0db8caca2 Mon Sep 17 00:00:00 2001 From: defifofum Date: Mon, 27 Feb 2023 12:20:20 -0500 Subject: [PATCH 4/8] 0.6.1-alpha.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 884f1ef..33bcba5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ape.swap/hardhat-test-helpers", - "version": "0.6.0-alpha.0", + "version": "0.6.1-alpha.0", "description": "Install this package to get access to deployable ApeSwap Mock Farm and DEX for testing with contracts developed with the Hardhat framework.", "main": "./dist/index.js", "files": [ From 8018c95cd6f4c10546ac16682b9e825d4dd39e35 Mon Sep 17 00:00:00 2001 From: Doublo54 Date: Tue, 7 Mar 2023 14:51:28 +0100 Subject: [PATCH 5/8] optional WBNB overwrite for dex and dexV3 --- src/dex.ts | 18 ++++++++++++------ src/dexV3.ts | 11 +++++++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/dex.ts b/src/dex.ts index 0268e45..879ed06 100644 --- a/src/dex.ts +++ b/src/dex.ts @@ -18,6 +18,7 @@ import { ApePair__factory, ERC20Mock, ERC20Mock__factory, + WNative, WNative__factory, } from '../typechain-types' @@ -35,7 +36,8 @@ export async function deployMockDex( SignerWithAddress, SignerWithAddress ], - numPairs = 2 + numPairs = 2, + mockWBNBoverwrite: WNative | null = null ) { const ApeFactory = (await ethers.getContractFactory( ApeFactoryBuild.abi, @@ -65,7 +67,12 @@ export async function deployMockDex( const dexFactory = await ApeFactory.connect(owner).deploy(feeTo.address) // Setup pairs - const mockWBNB = await WNative.connect(owner).deploy() + let mockWBNB: WNative + if (mockWBNBoverwrite != null) { + mockWBNB = mockWBNBoverwrite + } else { + mockWBNB = await WNative.connect(owner).deploy() + } const dexRouter = await ApeRouter.connect(owner).deploy( dexFactory.address, mockWBNB.address @@ -96,10 +103,9 @@ export async function deployMockDex( } ) - const pairCreated = await ApePair.attach(await dexFactory.getPair( - mockToken.address, - mockWBNB.address - )); + const pairCreated = await ApePair.attach( + await dexFactory.getPair(mockToken.address, mockWBNB.address) + ) // NOTE: Alternative way to create pairs directly through ApeFactory // Create an initial pair diff --git a/src/dexV3.ts b/src/dexV3.ts index dd9741d..e975180 100644 --- a/src/dexV3.ts +++ b/src/dexV3.ts @@ -25,6 +25,7 @@ import { SwapRouter__factory, NonfungiblePositionManager__factory, NonfungibleTokenPositionDescriptor__factory, + WNative, } from '../typechain-types' /** @@ -41,7 +42,8 @@ export async function deployMockDex( SignerWithAddress, SignerWithAddress ], - numPairs = 2 + numPairs = 2, + mockWBNBoverwrite: WNative | null = null ) { const SwapRouter = (await ethers.getContractFactoryFromArtifact( SwapRouterBuild @@ -80,7 +82,12 @@ export async function deployMockDex( const dexFactory = await uniV3Factory.connect(owner).deploy() // Setup pairs - const mockWBNB = await WNative.connect(owner).deploy() + let mockWBNB: WNative + if (mockWBNBoverwrite != null) { + mockWBNB = mockWBNBoverwrite + } else { + mockWBNB = await WNative.connect(owner).deploy() + } const positionDescriptor = await nonfungibleTokenPositionDescriptor .connect(owner) .deploy( From 12333cb4d5a99adde7ee047ac86ea5ab835eaf80 Mon Sep 17 00:00:00 2001 From: Doublo54 Date: Tue, 7 Mar 2023 15:45:36 +0100 Subject: [PATCH 6/8] feat: combined V2 and V3 + SwapRouter02 --- .../dex/contracts/SwapRouter02.json | 1072 +++++++++++++++++ src/dex.ts | 48 + src/dexV2AndV3.ts | 71 ++ src/index.ts | 1 + 4 files changed, 1192 insertions(+) create mode 100644 src/artifacts-apeswap/dex/contracts/SwapRouter02.json create mode 100644 src/dexV2AndV3.ts diff --git a/src/artifacts-apeswap/dex/contracts/SwapRouter02.json b/src/artifacts-apeswap/dex/contracts/SwapRouter02.json new file mode 100644 index 0000000..02b1065 --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/SwapRouter02.json @@ -0,0 +1,1072 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SwapRouter02", + "sourceName": "contracts/SwapRouter02.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factoryV2", + "type": "address" + }, + { + "internalType": "address", + "name": "factoryV3", + "type": "address" + }, + { + "internalType": "address", + "name": "_positionManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH9", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "WETH9", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "approveMax", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "approveMaxMinusOne", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "approveZeroThenMax", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "approveZeroThenMaxMinusOne", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "callPositionManager", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "paths", + "type": "bytes[]" + }, + { + "internalType": "uint128[]", + "name": "amounts", + "type": "uint128[]" + }, + { + "internalType": "uint24", + "name": "maximumTickDivergence", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "secondsAgo", + "type": "uint32" + } + ], + "name": "checkOracleSlippage", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "uint24", + "name": "maximumTickDivergence", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "secondsAgo", + "type": "uint32" + } + ], + "name": "checkOracleSlippage", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMinimum", + "type": "uint256" + } + ], + "internalType": "struct IV3SwapRouter.ExactInputParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactInput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMinimum", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "internalType": "struct IV3SwapRouter.ExactInputSingleParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactInputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMaximum", + "type": "uint256" + } + ], + "internalType": "struct IV3SwapRouter.ExactOutputParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactOutput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMaximum", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "internalType": "struct IV3SwapRouter.ExactOutputSingleParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactOutputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "factoryV2", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "getApprovalType", + "outputs": [ + { + "internalType": "enum IApproveAndCall.ApprovalType", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + } + ], + "internalType": "struct IApproveAndCall.IncreaseLiquidityParams", + "name": "params", + "type": "tuple" + } + ], + "name": "increaseLiquidity", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint256", + "name": "amount0Min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1Min", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IApproveAndCall.MintParams", + "name": "params", + "type": "tuple" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "previousBlockhash", + "type": "bytes32" + }, + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "positionManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "pull", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "refundETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitAllowed", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitAllowedIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "selfPermitIfNecessary", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + } + ], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "sweepTokenWithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "sweepTokenWithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "amount0Delta", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1Delta", + "type": "int256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "uniswapV3SwapCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + } + ], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "unwrapWETH9WithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "unwrapWETH9WithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "wrapETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6101006040526000196000553480156200001857600080fd5b5060405162006135380380620061358339810160408190526200003b9162000087565b6001600160601b0319606094851b811660805291841b821660a05291831b811660c052911b1660e052620000e3565b80516001600160a01b03811681146200008257600080fd5b919050565b600080600080608085870312156200009d578384fd5b620000a8856200006a565b9350620000b8602086016200006a565b9250620000c8604086016200006a565b9150620000d8606086016200006a565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c615fb162000184600039806102c15280610b3c52806112ad52806113d7528061147e52806116af52806117d95280612d8f5280612def5280612e70525080611e4c52806124df5280613cdb52508061166f5280611b1a5280611e9c52806132a6525080610c625280610d365280610fe2528061164b5280612fc252806131855250615fb16000f3fe6080604052600436106102a45760003560e01c80639b2c0a371161016e578063dee00f35116100cb578063f100b2051161007f578063f2d5d56b11610064578063f2d5d56b1461066e578063f3995c6714610681578063fa461e33146106945761034f565b8063f100b2051461063b578063f25801a71461064e5761034f565b8063e0e189a0116100b0578063e0e189a0146105f5578063e90a182f14610608578063efdeed8e1461061b5761034f565b8063dee00f35146105b5578063df2ab5bb146105e25761034f565b8063b858183f11610122578063c45a015511610107578063c45a01551461057a578063cab372ce1461058f578063d4ef38de146105a25761034f565b8063b858183f14610554578063c2e3140a146105675761034f565b8063ab3fdd5011610153578063ab3fdd501461051b578063ac9650d81461052e578063b3a2af13146105415761034f565b80639b2c0a37146104f5578063a4a78f0c146105085761034f565b8063472b43f31161021c578063571ac8b0116101d0578063639d71a9116101b5578063639d71a9146104b857806368e0d4e1146104cb578063791b98bc146104e05761034f565b8063571ac8b0146104925780635ae401dc146104a55761034f565b80634961699711610201578063496169971461044a5780634aa4a4fc1461045d5780635023b4df1461047f5761034f565b8063472b43f31461042457806349404b7c146104375761034f565b80631c58db4f116102735780633068c554116102585780633068c554146103eb57806342712a67146103fe5780634659a494146104115761034f565b80631c58db4f146103b85780631f0464d1146103cb5761034f565b806304e45aaf1461035457806309b813461461037d57806311ed56c91461039057806312210e8a146103b05761034f565b3661034f573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461034d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b610367610362366004615543565b6106b4565b6040516103749190615dfd565b60405180910390f35b61036761038b3660046155de565b61083c565b6103a361039e366004615638565b61091c565b6040516103749190615b7a565b61034d610b28565b61034d6103c63660046157bb565b610b3a565b6103de6103d93660046152a7565b610bbe565b6040516103749190615afc565b61034d6103f93660046150d8565b610c48565b61036761040c366004615885565b610c5b565b61034d61041f366004615121565b610e35565b610367610432366004615885565b610ef5565b61034d6104453660046157eb565b6112a9565b61034d6104583660046157bb565b61146f565b34801561046957600080fd5b5061047261147c565b6040516103749190615a3c565b61036761048d366004615616565b6114a0565b61034d6104a0366004614feb565b611589565b6103de6104b33660046152a7565b6115bc565b61034d6104c6366004614feb565b611635565b3480156104d757600080fd5b50610472611649565b3480156104ec57600080fd5b5061047261166d565b61034d61050336600461581a565b611691565b61034d610516366004615121565b6118a7565b61034d610529366004614feb565b61197c565b6103de61053c36600461517c565b6119ba565b6103a361054f3660046152f1565b611b14565b61036761056236600461549d565b611bd2565b61034d610575366004615121565b611d95565b34801561058657600080fd5b50610472611e4a565b61034d61059d366004614feb565b611990565b61034d6105b0366004615858565b611e6e565b3480156105c157600080fd5b506105d56105d036600461500e565b611e7a565b6040516103749190615b8d565b61034d6105f0366004615039565b612027565b61034d61060336600461507a565b61213e565b61034d61061636600461500e565b6122a4565b34801561062757600080fd5b5061034d6106363660046151bc565b6122b3565b6103a3610649366004615627565b612305565b34801561065a57600080fd5b5061034d610669366004615324565b6123a5565b61034d61067c36600461500e565b6123f6565b61034d61068f366004615121565b612402565b3480156106a057600080fd5b5061034d6106af3660046153b8565b61249a565b600080600083608001511415610771575081516040517f70a0823100000000000000000000000000000000000000000000000000000000815260019173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071b903090600401615a3c565b60206040518083038186803b15801561073357600080fd5b505afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b91906157d3565b60808401525b6107ed836080015184606001518560c001516040518060400160405280886000015189604001518a602001516040516020016107af939291906159aa565b6040516020818303038152906040528152602001866107ce57336107d0565b305b73ffffffffffffffffffffffffffffffffffffffff1690526125de565b91508260a00151821015610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c7d565b60405180910390fd5b50919050565b60006108b0604083018035906108559060208601614feb565b604080518082019091526000908061086d8880615e41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360209091015261278f565b505060005460608201358111156108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c0f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b604080516101608101909152606090610b20907f8831645600000000000000000000000000000000000000000000000000000000908061095f6020870187614feb565b73ffffffffffffffffffffffffffffffffffffffff16815260200185602001602081019061098d9190614feb565b73ffffffffffffffffffffffffffffffffffffffff1681526020016109b860608701604088016157a1565b62ffffff1681526020016109d26080870160608801615379565b60020b81526020016109ea60a0870160808801615379565b60020b8152602090810190610a0a90610a0590880188614feb565b612976565b8152602001610a25866020016020810190610a059190614feb565b815260a0860135602082015260c08601356040820152606001610a4f610100870160e08801614feb565b73ffffffffffffffffffffffffffffffffffffffff1681526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610a9e9190615cf8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611b14565b90505b919050565b4715610b3857610b383347612a1b565b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ba257600080fd5b505af1158015610bb6573d6000803e3d6000fd5b505050505050565b60608380600143034014610c3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f426c6f636b686173680000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610c3d84846119ba565b91505b509392505050565b610c55848433858561213e565b50505050565b6000610cbb7f000000000000000000000000000000000000000000000000000000000000000087868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b6992505050565b600081518110610cc757fe5b6020026020010151905084811115610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c0f565b610da484846000818110610d1b57fe5b9050602002016020810190610d309190614feb565b33610d9e7f000000000000000000000000000000000000000000000000000000000000000088886000818110610d6257fe5b9050602002016020810190610d779190614feb565b89896001818110610d8457fe5b9050602002016020810190610d999190614feb565b612ca2565b84612d8d565b73ffffffffffffffffffffffffffffffffffffffff821660011415610dcb57339150610dee565b73ffffffffffffffffffffffffffffffffffffffff821660021415610dee573091505b610e2c848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612f6b915050565b95945050505050565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b50505050505050505050565b60008086610fab575060018484600081610f0b57fe5b9050602002016020810190610f209190614feb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f589190615a3c565b60206040518083038186803b158015610f7057600080fd5b505afa158015610f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa891906157d3565b96505b61103685856000818110610fbb57fe5b9050602002016020810190610fd09190614feb565b82610fdb5733610fdd565b305b6110307f00000000000000000000000000000000000000000000000000000000000000008989600081811061100e57fe5b90506020020160208101906110239190614feb565b8a8a6001818110610d8457fe5b8a612d8d565b73ffffffffffffffffffffffffffffffffffffffff83166001141561105d57339250611080565b73ffffffffffffffffffffffffffffffffffffffff831660021415611080573092505b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106110b057fe5b90506020020160208101906110c59190614feb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016110fd9190615a3c565b60206040518083038186803b15801561111557600080fd5b505afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d91906157d3565b905061118d868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612f6b915050565b6112628187877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106111bf57fe5b90506020020160208101906111d49190614feb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b815260040161120c9190615a3c565b60206040518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c91906157d3565b90613270565b92508683101561129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c7d565b505095945050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d602081101561135c57600080fd5b50519050828110156113cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b801561146a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b5050505061146a8282612a1b565b505050565b61147981336112a9565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611549608083018035906114b99060608601614feb565b6114c960e0860160c08701614feb565b60405180604001604052808760200160208101906114e79190614feb565b6114f760608a0160408b016157a1565b61150460208b018b614feb565b604051602001611516939291906159aa565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff1681525061278f565b90508160a001358111156108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c0f565b6115b3817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613280565b61147957600080fd5b606083806115c86133cc565b1115610c3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b611640816000613280565b61158957600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000821180156116a2575060648211155b6116ab57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561173457600080fd5b505afa158015611748573d6000803e3d6000fd5b505050506040513d602081101561175e57600080fd5b50519050848110156117d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b80156118a0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50505050600061271061187a85846133d090919063ffffffff16565b8161188157fe5b0490508015611894576118948382612a1b565b610bb685828403612a1b565b5050505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b50511015610bb657610bb6868686868686610e35565b611987816000613280565b61199057600080fd5b6115b3817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe613280565b60608167ffffffffffffffff811180156119d357600080fd5b50604051908082528060200260200182016040528015611a0757816020015b60608152602001906001900390816119f25790505b50905060005b82811015611b0d5760008030868685818110611a2557fe5b9050602002810190611a379190615e41565b604051611a45929190615a10565b600060405180830381855af49150503d8060008114611a80576040519150601f19603f3d011682016040523d82523d6000602084013e611a85565b606091505b509150915081611aeb57604481511015611a9e57600080fd5b60048101905080806020019051810190611ab89190615433565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d9190615b7a565b80848481518110611af857fe5b60209081029190910101525050600101611a0d565b5092915050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1683604051611b5d9190615a20565b6000604051808303816000865af19150503d8060008114611b9a576040519150601f19603f3d011682016040523d82523d6000602084013e611b9f565b606091505b50925090508061083657604482511015611bb857600080fd5b60048201915081806020019051810190611ab89190615433565b600080600083604001511415611ca357600190506000611bf584600001516133f4565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190611c4c903090600401615a3c565b60206040518083038186803b158015611c6457600080fd5b505afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906157d3565b6040850152505b600081611cb05733611cb2565b305b90505b6000611cc48560000151613425565b9050611d1d856040015182611cdd578660200151611cdf565b305b60006040518060400160405280611cf98b6000015161342d565b81526020018773ffffffffffffffffffffffffffffffffffffffff168152506125de565b60408601528015611d3d578451309250611d369061343c565b8552611d4a565b8460400151935050611d50565b50611cb5565b8360600151831015611d8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c7d565b5050919050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015611e0a57600080fd5b505afa158015611e1e573d6000803e3d6000fd5b505050506040513d6020811015611e3457600080fd5b50511015610bb657610bb6868686868686612402565b7f000000000000000000000000000000000000000000000000000000000000000081565b61146a83338484611691565b6000818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e307f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611ed8929190615a5d565b60206040518083038186803b158015611ef057600080fd5b505afa158015611f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2891906157d3565b10611f3557506000612021565b611f5f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613280565b15611f6c57506001612021565b611f96837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe613280565b15611fa357506002612021565b611fae836000613280565b611fb757600080fd5b611fe1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613280565b15611fee57506003612021565b612018837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe613280565b1561034f575060045b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d60208110156120ba57600080fd5b505190508281101561212d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b8015610c5557610c55848383613471565b60008211801561214f575060648211155b61215857600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d60208110156121eb57600080fd5b505190508481101561225e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b8015610bb657600061271061227383866133d0565b8161227a57fe5b049050801561228e5761228e878483613471565b61229b8786838503613471565b50505050505050565b6122af828233612027565b5050565b6000806122c1868685613646565b915091508362ffffff1681830312610bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c46565b6060610b2063219f5d1760e01b6040518060c001604052808560400135815260200161233d866000016020810190610a059190614feb565b8152602001612358866020016020810190610a059190614feb565b815260200185606001358152602001856080013581526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610a9e9190615cb4565b6000806123b28584613859565b915091508362ffffff16818303126118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c46565b6122af82333084613ae1565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b158015610ed557600080fd5b60008413806124a95750600083135b6124b257600080fd5b60006124c08284018461564a565b905060008060006124d484600001516133f4565b9250925092506125067f0000000000000000000000000000000000000000000000000000000000000000848484613cbe565b5060008060008a13612547578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161089612578565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b915091508115612597576125928587602001513384612d8d565b610ee9565b85516125a290613425565b156125c75785516125b29061343c565b86526125c1813360008961278f565b50610ee9565b80600081905550610ee98487602001513384612d8d565b600073ffffffffffffffffffffffffffffffffffffffff8416600114156126075733935061262a565b73ffffffffffffffffffffffffffffffffffffffff84166002141561262a573093505b600080600061263c85600001516133f4565b9194509250905073ffffffffffffffffffffffffffffffffffffffff8083169084161060008061266d868686613cd4565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856126938f613d12565b73ffffffffffffffffffffffffffffffffffffffff8e16156126b5578d6126db565b876126d45773fffd8963efd1fc6a506488495d951d5263988d256126db565b6401000276a45b8d6040516020016126ec9190615da6565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161271b959493929190615a84565b6040805180830381600087803b15801561273457600080fd5b505af1158015612748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276c9190615395565b915091508261277b578161277d565b805b6000039b9a5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8416600114156127b8573393506127db565b73ffffffffffffffffffffffffffffffffffffffff8416600214156127db573093505b60008060006127ed85600001516133f4565b9194509250905073ffffffffffffffffffffffffffffffffffffffff8084169083161060008061281e858786613cd4565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856128448f613d12565b60000373ffffffffffffffffffffffffffffffffffffffff8e1615612869578d61288f565b876128885773fffd8963efd1fc6a506488495d951d5263988d2561288f565b6401000276a45b8d6040516020016128a09190615da6565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016128cf959493929190615a84565b6040805180830381600087803b1580156128e857600080fd5b505af11580156128fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129209190615395565b9150915060008361293557818360000361293b565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16612967578b811461296757600080fd5b50505050505050949350505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906129cb903090600401615a3c565b60206040518083038186803b1580156129e357600080fd5b505afa1580156129f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2091906157d3565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310612a9257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612a55565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612af4576040519150601f19603f3d011682016040523d82523d6000602084013e612af9565b606091505b505090508061146a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6060600282511015612b7a57600080fd5b815167ffffffffffffffff81118015612b9257600080fd5b50604051908082528060200260200182016040528015612bbc578160200160208202803683370190505b5090508281600183510381518110612bd057fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015610c4057600080612c3d87866001860381518110612c1c57fe5b6020026020010151878681518110612c3057fe5b6020026020010151613d44565b91509150612c5f848481518110612c5057fe5b60200260200101518383613e2c565b846001850381518110612c6e57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612c00565b6000806000612cb18585613f02565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f511f0f358fe530cda0859ec20becf391718fdf5a329be02f4c95361f3d6a42d8609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612de85750804710155b15612f31577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e5557600080fd5b505af1158015612e69573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612eff57600080fd5b505af1158015612f13573d6000803e3d6000fd5b505050506040513d6020811015612f2957600080fd5b50610c559050565b73ffffffffffffffffffffffffffffffffffffffff8316301415612f5f57612f5a848383613471565b610c55565b610c5584848484613ae1565b60005b600183510381101561146a57600080848381518110612f8957fe5b6020026020010151858460010181518110612fa057fe5b6020026020010151915091506000612fb88383613f02565b5090506000612fe87f00000000000000000000000000000000000000000000000000000000000000008585612ca2565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561303657600080fd5b505afa15801561304a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306e91906156da565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146130d05782846130d3565b83835b91509150613114828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b815260040161120c9190615a3c565b9550613121868383613fa7565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461316557826000613169565b6000835b91509150600060028c51038a10613180578a6131c1565b6131c17f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106131b457fe5b6020026020010151612ca2565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906132299086908690869060248101615e06565b600060405180830381600087803b15801561324357600080fd5b505af1158015613257573d6000803e3d6000fd5b50506001909b019a50612f6e9950505050505050505050565b8082038281111561202157600080fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b7f0000000000000000000000000000000000000000000000000000000000000000866040516024016132d7929190615ad6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516133609190615a20565b6000604051808303816000865af19150503d806000811461339d576040519150601f19603f3d011682016040523d82523d6000602084013e6133a2565b606091505b5091509150818015610e2c575080511580610e2c575080806020019051810190610e2c919061528d565b4290565b60008215806133eb575050818102818382816133e857fe5b04145b61202157600080fd5b60008080613402848261407d565b925061340f84601461417d565b905061341c84601761407d565b91509193909250565b516042111590565b6060610b20826000602b61426d565b8051606090610b209083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90161426d565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061354657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613509565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146135a8576040519150601f19603f3d011682016040523d82523d6000602084013e6135ad565b606091505b50915091508180156135db5750805115806135db57508080602001905160208110156135d857600080fd5b50515b6118a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600080835185511461365757600080fd5b6000855167ffffffffffffffff8111801561367157600080fd5b506040519080825280602002602001820160405280156136ab57816020015b613698614e34565b8152602001906001900390816136905790505b5090506000865167ffffffffffffffff811180156136c857600080fd5b5060405190808252806020026020018201604052801561370257816020015b6136ef614e34565b8152602001906001900390816136e75790505b50905060005b8751811015613832576000806137318a848151811061372357fe5b602002602001015189613859565b9150915061373e82614454565b85848151811061374a57fe5b60200260200101516000019060020b908160020b8152505061376b81614454565b84848151811061377757fe5b60200260200101516000019060020b908160020b8152505088838151811061379b57fe5b60200260200101518584815181106137af57fe5b6020026020010151602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508883815181106137f157fe5b602002602001015184848151811061380557fe5b6020908102919091018101516fffffffffffffffffffffffffffffffff9092169101525050600101613708565b5061383c82614465565b60020b935061384a81614465565b60020b92505050935093915050565b6000806000806138688661454d565b90506000805b82811015613a865760008060006138848b6133f4565b9250925092506000613897848484613cd4565b905060008063ffffffff8d166138c0576138b083614578565b600291820b9350900b9050613962565b6138ca838e614810565b8160020b915050809250508273ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561391b57600080fd5b505afa15801561392f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139539190615715565b50505060029290920b93505050505b600189038714156139a3578473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161099506139b2565b6139ac8e61343c565b9d508597505b6000871580613a5357508673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1610613a23578673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610613a53565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16105b90508015613a68579b82019b9a81019a613a73565b828d039c50818c039b505b50506001909501945061386e9350505050565b5082613ad7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850294507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840293505b5050509250929050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b60208310613bbe57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b81565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c20576040519150601f19603f3d011682016040523d82523d6000602084013e613c25565b606091505b5091509150818015613c53575080511580613c535750808060200190516020811015613c5057600080fd5b50515b610bb657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610e2c85613ccf868686614c41565b614cbe565b6000613d0a7f0000000000000000000000000000000000000000000000000000000000000000613d05868686614c41565b614cee565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210613d4057600080fd5b5090565b6000806000613d538585613f02565b509050600080613d64888888612ca2565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613da957600080fd5b505afa158015613dbd573d6000803e3d6000fd5b505050506040513d6060811015613dd357600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614613e1a578082613e1d565b81815b90999098509650505050505050565b6000808411613e9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e54000000000000604482015290519081900360640190fd5b600083118015613eac5750600082115b613eb557600080fd5b6000613ecd6103e8613ec786886133d0565b906133d0565b90506000613ee16103e5613ec78689613270565b9050613ef86001828481613ef157fe5b0490614e24565b9695505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613f3e57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610613f78578284613f7b565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216613fa057600080fd5b9250929050565b600080841161401757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f494e53554646494349454e545f494e5055545f414d4f554e5400000000000000604482015290519081900360640190fd5b6000831180156140275750600082115b61403057600080fd5b600061403e856103e56133d0565b9050600061404c82856133d0565b9050600061406683614060886103e86133d0565b90614e24565b905080828161407157fe5b04979650505050505050565b6000818260140110156140f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b816014018351101561416457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b6000818260030110156141f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b816003018351101561426457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f0110156142e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b82828401101561435257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b818301845110156143c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b6060821580156143e3576040519150600082526020820160405261444b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561441c578051835260209283019201614404565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b80600281900b8114610b2357600080fd5b6000806000805b84518110156144fa5784818151811061448157fe5b6020026020010151602001516fffffffffffffffffffffffffffffffff168582815181106144ab57fe5b60200260200101516000015160020b02830192508481815181106144cb57fe5b6020026020010151602001516fffffffffffffffffffffffffffffffff1682019150808060010191505061446c565b5080828161450457fe5b05925060008212801561451f575080828161451b57fe5b0715155b15611d8e5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919050565b5160177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec9091010490565b6000806000808473ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156145c457600080fd5b505afa1580156145d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fc9190615715565b50939750919550935050600161ffff84161191506146489050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615bd8565b6000808673ffffffffffffffffffffffffffffffffffffffff1663252c09d7856040518263ffffffff1660e01b81526004016146849190615dee565b60806040518083038186803b15801561469c57600080fd5b505afa1580156146b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146d491906158e0565b5050915091506146e26133cc565b63ffffffff168263ffffffff16146146fc57849550614807565b60008361ffff1660018561ffff168761ffff1601038161471857fe5b06905060008060008a73ffffffffffffffffffffffffffffffffffffffff1663252c09d7856040518263ffffffff1660e01b81526004016147599190615dfd565b60806040518083038186803b15801561477157600080fd5b505afa158015614785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147a991906158e0565b93505092509250806147e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615ba1565b82860363ffffffff811683870360060b816147fe57fe5b059a5050505050505b50505050915091565b60008063ffffffff831661488557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f4250000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051600280825260608201835260009260208301908036833701905050905083816000815181106148b457fe5b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106148dd57fe5b63ffffffff9092166020928302919091018201526040517f883bdbfd00000000000000000000000000000000000000000000000000000000815260048101828152835160248301528351600093849373ffffffffffffffffffffffffffffffffffffffff8b169363883bdbfd9388939192839260449091019185820191028083838b5b83811015614978578181015183820152602001614960565b505050509050019250505060006040518083038186803b15801561499b57600080fd5b505afa1580156149af573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160409081528110156149f657600080fd5b8101908080516040519392919084640100000000821115614a1657600080fd5b908301906020820185811115614a2b57600080fd5b8251866020820283011164010000000082111715614a4857600080fd5b82525081516020918201928201910280838360005b83811015614a75578181015183820152602001614a5d565b5050505090500160405260200180516040519392919084640100000000821115614a9e57600080fd5b908301906020820185811115614ab357600080fd5b8251866020820283011164010000000082111715614ad057600080fd5b82525081516020918201928201910280838360005b83811015614afd578181015183820152602001614ae5565b5050505090500160405250505091509150600082600081518110614b1d57fe5b602002602001015183600181518110614b3257fe5b6020026020010151039050600082600081518110614b4c57fe5b602002602001015183600181518110614b6157fe5b60200260200101510390508763ffffffff168260060b81614b7e57fe5b05965060008260060b128015614ba857508763ffffffff168260060b81614ba157fe5b0760060b15155b15614bd3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909601955b63ffffffff881673ffffffffffffffffffffffffffffffffffffffff0277ffffffffffffffffffffffffffffffffffffffff00000000602083901b1677ffffffffffffffffffffffffffffffffffffffffffffffff821681614c3157fe5b0496505050505050509250929050565b614c49614e4b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115614c81579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000614cca8383614cee565b90503373ffffffffffffffffffffffffffffffffffffffff82161461202157600080fd5b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1610614d3057600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b8082018281101561202157600080fd5b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b8035610b2381615f52565b60008083601f840112614e87578182fd5b50813567ffffffffffffffff811115614e9e578182fd5b6020830191508360208083028501011115613fa057600080fd5b600082601f830112614ec8578081fd5b81356020614edd614ed883615ec8565b615ea4565b8281528181019085830183850287018401881015614ef9578586fd5b855b85811015614f345781356fffffffffffffffffffffffffffffffff81168114614f22578788fd5b84529284019290840190600101614efb565b5090979650505050505050565b80518015158114610b2357600080fd5b600082601f830112614f61578081fd5b8135614f6f614ed882615ee6565b818152846020838601011115614f83578283fd5b816020850160208301379081016020019190915292915050565b80516dffffffffffffffffffffffffffff81168114610b2357600080fd5b805161ffff81168114610b2357600080fd5b803562ffffff81168114610b2357600080fd5b8035610b2381615f83565b600060208284031215614ffc578081fd5b813561500781615f52565b9392505050565b60008060408385031215615020578081fd5b823561502b81615f52565b946020939093013593505050565b60008060006060848603121561504d578081fd5b833561505881615f52565b925060208401359150604084013561506f81615f52565b809150509250925092565b600080600080600060a08688031215615091578283fd5b853561509c81615f52565b94506020860135935060408601356150b381615f52565b92506060860135915060808601356150ca81615f52565b809150509295509295909350565b600080600080608085870312156150ed578182fd5b84356150f881615f52565b93506020850135925060408501359150606085013561511681615f52565b939692955090935050565b60008060008060008060c08789031215615139578384fd5b863561514481615f52565b95506020870135945060408701359350606087013561516281615f95565b9598949750929560808101359460a0909101359350915050565b6000806020838503121561518e578182fd5b823567ffffffffffffffff8111156151a4578283fd5b6151b085828601614e76565b90969095509350505050565b600080600080608085870312156151d1578182fd5b843567ffffffffffffffff808211156151e8578384fd5b818701915087601f8301126151fb578384fd5b8135602061520b614ed883615ec8565b82815281810190858301885b858110156152405761522e8e8684358b0101614f51565b84529284019290840190600101615217565b50909950505088013592505080821115615258578384fd5b5061526587828801614eb8565b93505061527460408601614fcd565b915061528260608601614fe0565b905092959194509250565b60006020828403121561529e578081fd5b61500782614f41565b6000806000604084860312156152bb578081fd5b83359250602084013567ffffffffffffffff8111156152d8578182fd5b6152e486828701614e76565b9497909650939450505050565b600060208284031215615302578081fd5b813567ffffffffffffffff811115615318578182fd5b613d0a84828501614f51565b600080600060608486031215615338578081fd5b833567ffffffffffffffff81111561534e578182fd5b61535a86828701614f51565b93505061536960208501614fcd565b9150604084013561506f81615f83565b60006020828403121561538a578081fd5b813561500781615f74565b600080604083850312156153a7578182fd5b505080516020909101519092909150565b600080600080606085870312156153cd578182fd5b8435935060208501359250604085013567ffffffffffffffff808211156153f2578384fd5b818701915087601f830112615405578384fd5b813581811115615413578485fd5b886020828501011115615424578485fd5b95989497505060200194505050565b600060208284031215615444578081fd5b815167ffffffffffffffff81111561545a578182fd5b8201601f8101841361546a578182fd5b8051615478614ed882615ee6565b81815285602083850101111561548c578384fd5b610e2c826020830160208601615f26565b6000602082840312156154ae578081fd5b813567ffffffffffffffff808211156154c5578283fd5b90830190608082860312156154d8578283fd5b6040516080810181811083821117156154ed57fe5b6040528235828111156154fe578485fd5b61550a87828601614f51565b8252506020830135915061551d82615f52565b816020820152604083013560408201526060830135606082015280935050505092915050565b600060e08284031215615554578081fd5b60405160e0810181811067ffffffffffffffff8211171561557157fe5b60405261557d83614e6b565b815261558b60208401614e6b565b602082015261559c60408401614fcd565b60408201526155ad60608401614e6b565b60608201526080830135608082015260a083013560a08201526155d260c08401614e6b565b60c08201529392505050565b6000602082840312156155ef578081fd5b813567ffffffffffffffff811115615605578182fd5b820160808185031215615007578182fd5b600060e08284031215610836578081fd5b600060a08284031215610836578081fd5b60006101008284031215610836578081fd5b60006020828403121561565b578081fd5b813567ffffffffffffffff80821115615672578283fd5b9083019060408286031215615685578283fd5b60405160408101818110838211171561569a57fe5b6040528235828111156156ab578485fd5b6156b787828601614f51565b825250602083013592506156ca83615f52565b6020810192909252509392505050565b6000806000606084860312156156ee578081fd5b6156f784614f9d565b925061570560208501614f9d565b9150604084015161506f81615f83565b600080600080600080600060e0888a03121561572f578485fd5b875161573a81615f52565b602089015190975061574b81615f74565b955061575960408901614fbb565b945061576760608901614fbb565b935061577560808901614fbb565b925060a088015161578581615f95565b915061579360c08901614f41565b905092959891949750929550565b6000602082840312156157b2578081fd5b61500782614fcd565b6000602082840312156157cc578081fd5b5035919050565b6000602082840312156157e4578081fd5b5051919050565b600080604083850312156157fd578182fd5b82359150602083013561580f81615f52565b809150509250929050565b6000806000806080858703121561582f578182fd5b84359350602085013561584181615f52565b925060408501359150606085013561511681615f52565b60008060006060848603121561586c578081fd5b8335925060208401359150604084013561506f81615f52565b60008060008060006080868803121561589c578283fd5b8535945060208601359350604086013567ffffffffffffffff8111156158c0578384fd5b6158cc88828901614e76565b90945092505060608601356150ca81615f52565b600080600080608085870312156158f5578182fd5b845161590081615f83565b8094505060208501518060060b8114615917578283fd5b604086015190935061592881615f52565b915061528260608601614f41565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452615968816020860160208601615f26565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60020b9052565b62ffffff169052565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b6000828483379101908152919050565b60008251615a32818460208701615f26565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152615acb60a0830184615950565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015615b6d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452615b5b858351615950565b94509285019290850190600101615b21565b5092979650505050505050565b6000602082526150076020830184615950565b6020810160058310615b9b57fe5b91905290565b60208082526003908201527f4f4e490000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526003908201527f4e454f0000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b60208082526002908201527f5444000000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b600061016082019050615d0c828451615936565b6020830151615d1e6020840182615936565b506040830151615d3160408401826159a1565b506060830151615d44606084018261599a565b506080830151615d57608084018261599a565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615d9582850182615936565b505061014092830151919092015290565b600060208252825160406020840152615dc26060840182615950565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b61ffff91909116815260200190565b90815260200190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613ef86080830184615950565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615e75578283fd5b83018035915067ffffffffffffffff821115615e8f578283fd5b602001915036819003821315613fa057600080fd5b60405181810167ffffffffffffffff81118282101715615ec057fe5b604052919050565b600067ffffffffffffffff821115615edc57fe5b5060209081020190565b600067ffffffffffffffff821115615efa57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015615f41578181015183820152602001615f29565b83811115610c555750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461147957600080fd5b8060020b811461147957600080fd5b63ffffffff8116811461147957600080fd5b60ff8116811461147957600080fdfea164736f6c6343000706000a", + "deployedBytecode": "0x6080604052600436106102a45760003560e01c80639b2c0a371161016e578063dee00f35116100cb578063f100b2051161007f578063f2d5d56b11610064578063f2d5d56b1461066e578063f3995c6714610681578063fa461e33146106945761034f565b8063f100b2051461063b578063f25801a71461064e5761034f565b8063e0e189a0116100b0578063e0e189a0146105f5578063e90a182f14610608578063efdeed8e1461061b5761034f565b8063dee00f35146105b5578063df2ab5bb146105e25761034f565b8063b858183f11610122578063c45a015511610107578063c45a01551461057a578063cab372ce1461058f578063d4ef38de146105a25761034f565b8063b858183f14610554578063c2e3140a146105675761034f565b8063ab3fdd5011610153578063ab3fdd501461051b578063ac9650d81461052e578063b3a2af13146105415761034f565b80639b2c0a37146104f5578063a4a78f0c146105085761034f565b8063472b43f31161021c578063571ac8b0116101d0578063639d71a9116101b5578063639d71a9146104b857806368e0d4e1146104cb578063791b98bc146104e05761034f565b8063571ac8b0146104925780635ae401dc146104a55761034f565b80634961699711610201578063496169971461044a5780634aa4a4fc1461045d5780635023b4df1461047f5761034f565b8063472b43f31461042457806349404b7c146104375761034f565b80631c58db4f116102735780633068c554116102585780633068c554146103eb57806342712a67146103fe5780634659a494146104115761034f565b80631c58db4f146103b85780631f0464d1146103cb5761034f565b806304e45aaf1461035457806309b813461461037d57806311ed56c91461039057806312210e8a146103b05761034f565b3661034f573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461034d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b610367610362366004615543565b6106b4565b6040516103749190615dfd565b60405180910390f35b61036761038b3660046155de565b61083c565b6103a361039e366004615638565b61091c565b6040516103749190615b7a565b61034d610b28565b61034d6103c63660046157bb565b610b3a565b6103de6103d93660046152a7565b610bbe565b6040516103749190615afc565b61034d6103f93660046150d8565b610c48565b61036761040c366004615885565b610c5b565b61034d61041f366004615121565b610e35565b610367610432366004615885565b610ef5565b61034d6104453660046157eb565b6112a9565b61034d6104583660046157bb565b61146f565b34801561046957600080fd5b5061047261147c565b6040516103749190615a3c565b61036761048d366004615616565b6114a0565b61034d6104a0366004614feb565b611589565b6103de6104b33660046152a7565b6115bc565b61034d6104c6366004614feb565b611635565b3480156104d757600080fd5b50610472611649565b3480156104ec57600080fd5b5061047261166d565b61034d61050336600461581a565b611691565b61034d610516366004615121565b6118a7565b61034d610529366004614feb565b61197c565b6103de61053c36600461517c565b6119ba565b6103a361054f3660046152f1565b611b14565b61036761056236600461549d565b611bd2565b61034d610575366004615121565b611d95565b34801561058657600080fd5b50610472611e4a565b61034d61059d366004614feb565b611990565b61034d6105b0366004615858565b611e6e565b3480156105c157600080fd5b506105d56105d036600461500e565b611e7a565b6040516103749190615b8d565b61034d6105f0366004615039565b612027565b61034d61060336600461507a565b61213e565b61034d61061636600461500e565b6122a4565b34801561062757600080fd5b5061034d6106363660046151bc565b6122b3565b6103a3610649366004615627565b612305565b34801561065a57600080fd5b5061034d610669366004615324565b6123a5565b61034d61067c36600461500e565b6123f6565b61034d61068f366004615121565b612402565b3480156106a057600080fd5b5061034d6106af3660046153b8565b61249a565b600080600083608001511415610771575081516040517f70a0823100000000000000000000000000000000000000000000000000000000815260019173ffffffffffffffffffffffffffffffffffffffff16906370a082319061071b903090600401615a3c565b60206040518083038186803b15801561073357600080fd5b505afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b91906157d3565b60808401525b6107ed836080015184606001518560c001516040518060400160405280886000015189604001518a602001516040516020016107af939291906159aa565b6040516020818303038152906040528152602001866107ce57336107d0565b305b73ffffffffffffffffffffffffffffffffffffffff1690526125de565b91508260a00151821015610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c7d565b60405180910390fd5b50919050565b60006108b0604083018035906108559060208601614feb565b604080518082019091526000908061086d8880615e41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360209091015261278f565b505060005460608201358111156108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c0f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b604080516101608101909152606090610b20907f8831645600000000000000000000000000000000000000000000000000000000908061095f6020870187614feb565b73ffffffffffffffffffffffffffffffffffffffff16815260200185602001602081019061098d9190614feb565b73ffffffffffffffffffffffffffffffffffffffff1681526020016109b860608701604088016157a1565b62ffffff1681526020016109d26080870160608801615379565b60020b81526020016109ea60a0870160808801615379565b60020b8152602090810190610a0a90610a0590880188614feb565b612976565b8152602001610a25866020016020810190610a059190614feb565b815260a0860135602082015260c08601356040820152606001610a4f610100870160e08801614feb565b73ffffffffffffffffffffffffffffffffffffffff1681526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610a9e9190615cf8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611b14565b90505b919050565b4715610b3857610b383347612a1b565b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ba257600080fd5b505af1158015610bb6573d6000803e3d6000fd5b505050505050565b60608380600143034014610c3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f426c6f636b686173680000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610c3d84846119ba565b91505b509392505050565b610c55848433858561213e565b50505050565b6000610cbb7f000000000000000000000000000000000000000000000000000000000000000087868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b6992505050565b600081518110610cc757fe5b6020026020010151905084811115610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c0f565b610da484846000818110610d1b57fe5b9050602002016020810190610d309190614feb565b33610d9e7f000000000000000000000000000000000000000000000000000000000000000088886000818110610d6257fe5b9050602002016020810190610d779190614feb565b89896001818110610d8457fe5b9050602002016020810190610d999190614feb565b612ca2565b84612d8d565b73ffffffffffffffffffffffffffffffffffffffff821660011415610dcb57339150610dee565b73ffffffffffffffffffffffffffffffffffffffff821660021415610dee573091505b610e2c848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612f6b915050565b95945050505050565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b50505050505050505050565b60008086610fab575060018484600081610f0b57fe5b9050602002016020810190610f209190614feb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f589190615a3c565b60206040518083038186803b158015610f7057600080fd5b505afa158015610f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa891906157d3565b96505b61103685856000818110610fbb57fe5b9050602002016020810190610fd09190614feb565b82610fdb5733610fdd565b305b6110307f00000000000000000000000000000000000000000000000000000000000000008989600081811061100e57fe5b90506020020160208101906110239190614feb565b8a8a6001818110610d8457fe5b8a612d8d565b73ffffffffffffffffffffffffffffffffffffffff83166001141561105d57339250611080565b73ffffffffffffffffffffffffffffffffffffffff831660021415611080573092505b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106110b057fe5b90506020020160208101906110c59190614feb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016110fd9190615a3c565b60206040518083038186803b15801561111557600080fd5b505afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d91906157d3565b905061118d868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612f6b915050565b6112628187877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106111bf57fe5b90506020020160208101906111d49190614feb565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b815260040161120c9190615a3c565b60206040518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c91906157d3565b90613270565b92508683101561129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c7d565b505095945050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d602081101561135c57600080fd5b50519050828110156113cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b801561146a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b5050505061146a8282612a1b565b505050565b61147981336112a9565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611549608083018035906114b99060608601614feb565b6114c960e0860160c08701614feb565b60405180604001604052808760200160208101906114e79190614feb565b6114f760608a0160408b016157a1565b61150460208b018b614feb565b604051602001611516939291906159aa565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff1681525061278f565b90508160a001358111156108f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c0f565b6115b3817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613280565b61147957600080fd5b606083806115c86133cc565b1115610c3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b611640816000613280565b61158957600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000821180156116a2575060648211155b6116ab57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561173457600080fd5b505afa158015611748573d6000803e3d6000fd5b505050506040513d602081101561175e57600080fd5b50519050848110156117d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b80156118a0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50505050600061271061187a85846133d090919063ffffffff16565b8161188157fe5b0490508015611894576118948382612a1b565b610bb685828403612a1b565b5050505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b50511015610bb657610bb6868686868686610e35565b611987816000613280565b61199057600080fd5b6115b3817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe613280565b60608167ffffffffffffffff811180156119d357600080fd5b50604051908082528060200260200182016040528015611a0757816020015b60608152602001906001900390816119f25790505b50905060005b82811015611b0d5760008030868685818110611a2557fe5b9050602002810190611a379190615e41565b604051611a45929190615a10565b600060405180830381855af49150503d8060008114611a80576040519150601f19603f3d011682016040523d82523d6000602084013e611a85565b606091505b509150915081611aeb57604481511015611a9e57600080fd5b60048101905080806020019051810190611ab89190615433565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d9190615b7a565b80848481518110611af857fe5b60209081029190910101525050600101611a0d565b5092915050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1683604051611b5d9190615a20565b6000604051808303816000865af19150503d8060008114611b9a576040519150601f19603f3d011682016040523d82523d6000602084013e611b9f565b606091505b50925090508061083657604482511015611bb857600080fd5b60048201915081806020019051810190611ab89190615433565b600080600083604001511415611ca357600190506000611bf584600001516133f4565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190611c4c903090600401615a3c565b60206040518083038186803b158015611c6457600080fd5b505afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906157d3565b6040850152505b600081611cb05733611cb2565b305b90505b6000611cc48560000151613425565b9050611d1d856040015182611cdd578660200151611cdf565b305b60006040518060400160405280611cf98b6000015161342d565b81526020018773ffffffffffffffffffffffffffffffffffffffff168152506125de565b60408601528015611d3d578451309250611d369061343c565b8552611d4a565b8460400151935050611d50565b50611cb5565b8360600151831015611d8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c7d565b5050919050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015611e0a57600080fd5b505afa158015611e1e573d6000803e3d6000fd5b505050506040513d6020811015611e3457600080fd5b50511015610bb657610bb6868686868686612402565b7f000000000000000000000000000000000000000000000000000000000000000081565b61146a83338484611691565b6000818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e307f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611ed8929190615a5d565b60206040518083038186803b158015611ef057600080fd5b505afa158015611f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2891906157d3565b10611f3557506000612021565b611f5f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613280565b15611f6c57506001612021565b611f96837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe613280565b15611fa357506002612021565b611fae836000613280565b611fb757600080fd5b611fe1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613280565b15611fee57506003612021565b612018837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe613280565b1561034f575060045b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561209057600080fd5b505afa1580156120a4573d6000803e3d6000fd5b505050506040513d60208110156120ba57600080fd5b505190508281101561212d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b8015610c5557610c55848383613471565b60008211801561214f575060648211155b61215857600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d60208110156121eb57600080fd5b505190508481101561225e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b8015610bb657600061271061227383866133d0565b8161227a57fe5b049050801561228e5761228e878483613471565b61229b8786838503613471565b50505050505050565b6122af828233612027565b5050565b6000806122c1868685613646565b915091508362ffffff1681830312610bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c46565b6060610b2063219f5d1760e01b6040518060c001604052808560400135815260200161233d866000016020810190610a059190614feb565b8152602001612358866020016020810190610a059190614feb565b815260200185606001358152602001856080013581526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610a9e9190615cb4565b6000806123b28584613859565b915091508362ffffff16818303126118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615c46565b6122af82333084613ae1565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b158015610ed557600080fd5b60008413806124a95750600083135b6124b257600080fd5b60006124c08284018461564a565b905060008060006124d484600001516133f4565b9250925092506125067f0000000000000000000000000000000000000000000000000000000000000000848484613cbe565b5060008060008a13612547578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161089612578565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b915091508115612597576125928587602001513384612d8d565b610ee9565b85516125a290613425565b156125c75785516125b29061343c565b86526125c1813360008961278f565b50610ee9565b80600081905550610ee98487602001513384612d8d565b600073ffffffffffffffffffffffffffffffffffffffff8416600114156126075733935061262a565b73ffffffffffffffffffffffffffffffffffffffff84166002141561262a573093505b600080600061263c85600001516133f4565b9194509250905073ffffffffffffffffffffffffffffffffffffffff8083169084161060008061266d868686613cd4565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856126938f613d12565b73ffffffffffffffffffffffffffffffffffffffff8e16156126b5578d6126db565b876126d45773fffd8963efd1fc6a506488495d951d5263988d256126db565b6401000276a45b8d6040516020016126ec9190615da6565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161271b959493929190615a84565b6040805180830381600087803b15801561273457600080fd5b505af1158015612748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276c9190615395565b915091508261277b578161277d565b805b6000039b9a5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8416600114156127b8573393506127db565b73ffffffffffffffffffffffffffffffffffffffff8416600214156127db573093505b60008060006127ed85600001516133f4565b9194509250905073ffffffffffffffffffffffffffffffffffffffff8084169083161060008061281e858786613cd4565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856128448f613d12565b60000373ffffffffffffffffffffffffffffffffffffffff8e1615612869578d61288f565b876128885773fffd8963efd1fc6a506488495d951d5263988d2561288f565b6401000276a45b8d6040516020016128a09190615da6565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016128cf959493929190615a84565b6040805180830381600087803b1580156128e857600080fd5b505af11580156128fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129209190615395565b9150915060008361293557818360000361293b565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16612967578b811461296757600080fd5b50505050505050949350505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906129cb903090600401615a3c565b60206040518083038186803b1580156129e357600080fd5b505afa1580156129f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2091906157d3565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310612a9257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612a55565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612af4576040519150601f19603f3d011682016040523d82523d6000602084013e612af9565b606091505b505090508061146a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6060600282511015612b7a57600080fd5b815167ffffffffffffffff81118015612b9257600080fd5b50604051908082528060200260200182016040528015612bbc578160200160208202803683370190505b5090508281600183510381518110612bd057fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015610c4057600080612c3d87866001860381518110612c1c57fe5b6020026020010151878681518110612c3057fe5b6020026020010151613d44565b91509150612c5f848481518110612c5057fe5b60200260200101518383613e2c565b846001850381518110612c6e57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612c00565b6000806000612cb18585613f02565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f511f0f358fe530cda0859ec20becf391718fdf5a329be02f4c95361f3d6a42d8609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612de85750804710155b15612f31577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e5557600080fd5b505af1158015612e69573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612eff57600080fd5b505af1158015612f13573d6000803e3d6000fd5b505050506040513d6020811015612f2957600080fd5b50610c559050565b73ffffffffffffffffffffffffffffffffffffffff8316301415612f5f57612f5a848383613471565b610c55565b610c5584848484613ae1565b60005b600183510381101561146a57600080848381518110612f8957fe5b6020026020010151858460010181518110612fa057fe5b6020026020010151915091506000612fb88383613f02565b5090506000612fe87f00000000000000000000000000000000000000000000000000000000000000008585612ca2565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561303657600080fd5b505afa15801561304a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306e91906156da565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146130d05782846130d3565b83835b91509150613114828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b815260040161120c9190615a3c565b9550613121868383613fa7565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461316557826000613169565b6000835b91509150600060028c51038a10613180578a6131c1565b6131c17f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106131b457fe5b6020026020010151612ca2565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906132299086908690869060248101615e06565b600060405180830381600087803b15801561324357600080fd5b505af1158015613257573d6000803e3d6000fd5b50506001909b019a50612f6e9950505050505050505050565b8082038281111561202157600080fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b7f0000000000000000000000000000000000000000000000000000000000000000866040516024016132d7929190615ad6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516133609190615a20565b6000604051808303816000865af19150503d806000811461339d576040519150601f19603f3d011682016040523d82523d6000602084013e6133a2565b606091505b5091509150818015610e2c575080511580610e2c575080806020019051810190610e2c919061528d565b4290565b60008215806133eb575050818102818382816133e857fe5b04145b61202157600080fd5b60008080613402848261407d565b925061340f84601461417d565b905061341c84601761407d565b91509193909250565b516042111590565b6060610b20826000602b61426d565b8051606090610b209083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90161426d565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061354657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613509565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146135a8576040519150601f19603f3d011682016040523d82523d6000602084013e6135ad565b606091505b50915091508180156135db5750805115806135db57508080602001905160208110156135d857600080fd5b50515b6118a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600080835185511461365757600080fd5b6000855167ffffffffffffffff8111801561367157600080fd5b506040519080825280602002602001820160405280156136ab57816020015b613698614e34565b8152602001906001900390816136905790505b5090506000865167ffffffffffffffff811180156136c857600080fd5b5060405190808252806020026020018201604052801561370257816020015b6136ef614e34565b8152602001906001900390816136e75790505b50905060005b8751811015613832576000806137318a848151811061372357fe5b602002602001015189613859565b9150915061373e82614454565b85848151811061374a57fe5b60200260200101516000019060020b908160020b8152505061376b81614454565b84848151811061377757fe5b60200260200101516000019060020b908160020b8152505088838151811061379b57fe5b60200260200101518584815181106137af57fe5b6020026020010151602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508883815181106137f157fe5b602002602001015184848151811061380557fe5b6020908102919091018101516fffffffffffffffffffffffffffffffff9092169101525050600101613708565b5061383c82614465565b60020b935061384a81614465565b60020b92505050935093915050565b6000806000806138688661454d565b90506000805b82811015613a865760008060006138848b6133f4565b9250925092506000613897848484613cd4565b905060008063ffffffff8d166138c0576138b083614578565b600291820b9350900b9050613962565b6138ca838e614810565b8160020b915050809250508273ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561391b57600080fd5b505afa15801561392f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139539190615715565b50505060029290920b93505050505b600189038714156139a3578473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161099506139b2565b6139ac8e61343c565b9d508597505b6000871580613a5357508673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1610613a23578673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610613a53565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16105b90508015613a68579b82019b9a81019a613a73565b828d039c50818c039b505b50506001909501945061386e9350505050565b5082613ad7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850294507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840293505b5050509250929050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b60208310613bbe57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b81565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c20576040519150601f19603f3d011682016040523d82523d6000602084013e613c25565b606091505b5091509150818015613c53575080511580613c535750808060200190516020811015613c5057600080fd5b50515b610bb657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610e2c85613ccf868686614c41565b614cbe565b6000613d0a7f0000000000000000000000000000000000000000000000000000000000000000613d05868686614c41565b614cee565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210613d4057600080fd5b5090565b6000806000613d538585613f02565b509050600080613d64888888612ca2565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613da957600080fd5b505afa158015613dbd573d6000803e3d6000fd5b505050506040513d6060811015613dd357600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614613e1a578082613e1d565b81815b90999098509650505050505050565b6000808411613e9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e54000000000000604482015290519081900360640190fd5b600083118015613eac5750600082115b613eb557600080fd5b6000613ecd6103e8613ec786886133d0565b906133d0565b90506000613ee16103e5613ec78689613270565b9050613ef86001828481613ef157fe5b0490614e24565b9695505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613f3e57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610613f78578284613f7b565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216613fa057600080fd5b9250929050565b600080841161401757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f494e53554646494349454e545f494e5055545f414d4f554e5400000000000000604482015290519081900360640190fd5b6000831180156140275750600082115b61403057600080fd5b600061403e856103e56133d0565b9050600061404c82856133d0565b9050600061406683614060886103e86133d0565b90614e24565b905080828161407157fe5b04979650505050505050565b6000818260140110156140f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b816014018351101561416457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b6000818260030110156141f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b816003018351101561426457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f0110156142e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b82828401101561435257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b818301845110156143c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b6060821580156143e3576040519150600082526020820160405261444b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561441c578051835260209283019201614404565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b80600281900b8114610b2357600080fd5b6000806000805b84518110156144fa5784818151811061448157fe5b6020026020010151602001516fffffffffffffffffffffffffffffffff168582815181106144ab57fe5b60200260200101516000015160020b02830192508481815181106144cb57fe5b6020026020010151602001516fffffffffffffffffffffffffffffffff1682019150808060010191505061446c565b5080828161450457fe5b05925060008212801561451f575080828161451b57fe5b0715155b15611d8e5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01919050565b5160177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec9091010490565b6000806000808473ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156145c457600080fd5b505afa1580156145d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fc9190615715565b50939750919550935050600161ffff84161191506146489050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615bd8565b6000808673ffffffffffffffffffffffffffffffffffffffff1663252c09d7856040518263ffffffff1660e01b81526004016146849190615dee565b60806040518083038186803b15801561469c57600080fd5b505afa1580156146b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146d491906158e0565b5050915091506146e26133cc565b63ffffffff168263ffffffff16146146fc57849550614807565b60008361ffff1660018561ffff168761ffff1601038161471857fe5b06905060008060008a73ffffffffffffffffffffffffffffffffffffffff1663252c09d7856040518263ffffffff1660e01b81526004016147599190615dfd565b60806040518083038186803b15801561477157600080fd5b505afa158015614785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147a991906158e0565b93505092509250806147e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90615ba1565b82860363ffffffff811683870360060b816147fe57fe5b059a5050505050505b50505050915091565b60008063ffffffff831661488557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f4250000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051600280825260608201835260009260208301908036833701905050905083816000815181106148b457fe5b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106148dd57fe5b63ffffffff9092166020928302919091018201526040517f883bdbfd00000000000000000000000000000000000000000000000000000000815260048101828152835160248301528351600093849373ffffffffffffffffffffffffffffffffffffffff8b169363883bdbfd9388939192839260449091019185820191028083838b5b83811015614978578181015183820152602001614960565b505050509050019250505060006040518083038186803b15801561499b57600080fd5b505afa1580156149af573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160409081528110156149f657600080fd5b8101908080516040519392919084640100000000821115614a1657600080fd5b908301906020820185811115614a2b57600080fd5b8251866020820283011164010000000082111715614a4857600080fd5b82525081516020918201928201910280838360005b83811015614a75578181015183820152602001614a5d565b5050505090500160405260200180516040519392919084640100000000821115614a9e57600080fd5b908301906020820185811115614ab357600080fd5b8251866020820283011164010000000082111715614ad057600080fd5b82525081516020918201928201910280838360005b83811015614afd578181015183820152602001614ae5565b5050505090500160405250505091509150600082600081518110614b1d57fe5b602002602001015183600181518110614b3257fe5b6020026020010151039050600082600081518110614b4c57fe5b602002602001015183600181518110614b6157fe5b60200260200101510390508763ffffffff168260060b81614b7e57fe5b05965060008260060b128015614ba857508763ffffffff168260060b81614ba157fe5b0760060b15155b15614bd3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909601955b63ffffffff881673ffffffffffffffffffffffffffffffffffffffff0277ffffffffffffffffffffffffffffffffffffffff00000000602083901b1677ffffffffffffffffffffffffffffffffffffffffffffffff821681614c3157fe5b0496505050505050509250929050565b614c49614e4b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115614c81579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000614cca8383614cee565b90503373ffffffffffffffffffffffffffffffffffffffff82161461202157600080fd5b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1610614d3057600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b8082018281101561202157600080fd5b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b8035610b2381615f52565b60008083601f840112614e87578182fd5b50813567ffffffffffffffff811115614e9e578182fd5b6020830191508360208083028501011115613fa057600080fd5b600082601f830112614ec8578081fd5b81356020614edd614ed883615ec8565b615ea4565b8281528181019085830183850287018401881015614ef9578586fd5b855b85811015614f345781356fffffffffffffffffffffffffffffffff81168114614f22578788fd5b84529284019290840190600101614efb565b5090979650505050505050565b80518015158114610b2357600080fd5b600082601f830112614f61578081fd5b8135614f6f614ed882615ee6565b818152846020838601011115614f83578283fd5b816020850160208301379081016020019190915292915050565b80516dffffffffffffffffffffffffffff81168114610b2357600080fd5b805161ffff81168114610b2357600080fd5b803562ffffff81168114610b2357600080fd5b8035610b2381615f83565b600060208284031215614ffc578081fd5b813561500781615f52565b9392505050565b60008060408385031215615020578081fd5b823561502b81615f52565b946020939093013593505050565b60008060006060848603121561504d578081fd5b833561505881615f52565b925060208401359150604084013561506f81615f52565b809150509250925092565b600080600080600060a08688031215615091578283fd5b853561509c81615f52565b94506020860135935060408601356150b381615f52565b92506060860135915060808601356150ca81615f52565b809150509295509295909350565b600080600080608085870312156150ed578182fd5b84356150f881615f52565b93506020850135925060408501359150606085013561511681615f52565b939692955090935050565b60008060008060008060c08789031215615139578384fd5b863561514481615f52565b95506020870135945060408701359350606087013561516281615f95565b9598949750929560808101359460a0909101359350915050565b6000806020838503121561518e578182fd5b823567ffffffffffffffff8111156151a4578283fd5b6151b085828601614e76565b90969095509350505050565b600080600080608085870312156151d1578182fd5b843567ffffffffffffffff808211156151e8578384fd5b818701915087601f8301126151fb578384fd5b8135602061520b614ed883615ec8565b82815281810190858301885b858110156152405761522e8e8684358b0101614f51565b84529284019290840190600101615217565b50909950505088013592505080821115615258578384fd5b5061526587828801614eb8565b93505061527460408601614fcd565b915061528260608601614fe0565b905092959194509250565b60006020828403121561529e578081fd5b61500782614f41565b6000806000604084860312156152bb578081fd5b83359250602084013567ffffffffffffffff8111156152d8578182fd5b6152e486828701614e76565b9497909650939450505050565b600060208284031215615302578081fd5b813567ffffffffffffffff811115615318578182fd5b613d0a84828501614f51565b600080600060608486031215615338578081fd5b833567ffffffffffffffff81111561534e578182fd5b61535a86828701614f51565b93505061536960208501614fcd565b9150604084013561506f81615f83565b60006020828403121561538a578081fd5b813561500781615f74565b600080604083850312156153a7578182fd5b505080516020909101519092909150565b600080600080606085870312156153cd578182fd5b8435935060208501359250604085013567ffffffffffffffff808211156153f2578384fd5b818701915087601f830112615405578384fd5b813581811115615413578485fd5b886020828501011115615424578485fd5b95989497505060200194505050565b600060208284031215615444578081fd5b815167ffffffffffffffff81111561545a578182fd5b8201601f8101841361546a578182fd5b8051615478614ed882615ee6565b81815285602083850101111561548c578384fd5b610e2c826020830160208601615f26565b6000602082840312156154ae578081fd5b813567ffffffffffffffff808211156154c5578283fd5b90830190608082860312156154d8578283fd5b6040516080810181811083821117156154ed57fe5b6040528235828111156154fe578485fd5b61550a87828601614f51565b8252506020830135915061551d82615f52565b816020820152604083013560408201526060830135606082015280935050505092915050565b600060e08284031215615554578081fd5b60405160e0810181811067ffffffffffffffff8211171561557157fe5b60405261557d83614e6b565b815261558b60208401614e6b565b602082015261559c60408401614fcd565b60408201526155ad60608401614e6b565b60608201526080830135608082015260a083013560a08201526155d260c08401614e6b565b60c08201529392505050565b6000602082840312156155ef578081fd5b813567ffffffffffffffff811115615605578182fd5b820160808185031215615007578182fd5b600060e08284031215610836578081fd5b600060a08284031215610836578081fd5b60006101008284031215610836578081fd5b60006020828403121561565b578081fd5b813567ffffffffffffffff80821115615672578283fd5b9083019060408286031215615685578283fd5b60405160408101818110838211171561569a57fe5b6040528235828111156156ab578485fd5b6156b787828601614f51565b825250602083013592506156ca83615f52565b6020810192909252509392505050565b6000806000606084860312156156ee578081fd5b6156f784614f9d565b925061570560208501614f9d565b9150604084015161506f81615f83565b600080600080600080600060e0888a03121561572f578485fd5b875161573a81615f52565b602089015190975061574b81615f74565b955061575960408901614fbb565b945061576760608901614fbb565b935061577560808901614fbb565b925060a088015161578581615f95565b915061579360c08901614f41565b905092959891949750929550565b6000602082840312156157b2578081fd5b61500782614fcd565b6000602082840312156157cc578081fd5b5035919050565b6000602082840312156157e4578081fd5b5051919050565b600080604083850312156157fd578182fd5b82359150602083013561580f81615f52565b809150509250929050565b6000806000806080858703121561582f578182fd5b84359350602085013561584181615f52565b925060408501359150606085013561511681615f52565b60008060006060848603121561586c578081fd5b8335925060208401359150604084013561506f81615f52565b60008060008060006080868803121561589c578283fd5b8535945060208601359350604086013567ffffffffffffffff8111156158c0578384fd5b6158cc88828901614e76565b90945092505060608601356150ca81615f52565b600080600080608085870312156158f5578182fd5b845161590081615f83565b8094505060208501518060060b8114615917578283fd5b604086015190935061592881615f52565b915061528260608601614f41565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452615968816020860160208601615f26565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60020b9052565b62ffffff169052565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b6000828483379101908152919050565b60008251615a32818460208701615f26565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152615acb60a0830184615950565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015615b6d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452615b5b858351615950565b94509285019290850190600101615b21565b5092979650505050505050565b6000602082526150076020830184615950565b6020810160058310615b9b57fe5b91905290565b60208082526003908201527f4f4e490000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526003908201527f4e454f0000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b60208082526002908201527f5444000000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b600061016082019050615d0c828451615936565b6020830151615d1e6020840182615936565b506040830151615d3160408401826159a1565b506060830151615d44606084018261599a565b506080830151615d57608084018261599a565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615d9582850182615936565b505061014092830151919092015290565b600060208252825160406020840152615dc26060840182615950565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b61ffff91909116815260200190565b90815260200190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613ef86080830184615950565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615e75578283fd5b83018035915067ffffffffffffffff821115615e8f578283fd5b602001915036819003821315613fa057600080fd5b60405181810167ffffffffffffffff81118282101715615ec057fe5b604052919050565b600067ffffffffffffffff821115615edc57fe5b5060209081020190565b600067ffffffffffffffff821115615efa57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015615f41578181015183820152602001615f29565b83811115610c555750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461147957600080fd5b8060020b811461147957600080fd5b63ffffffff8116811461147957600080fd5b60ff8116811461147957600080fdfea164736f6c6343000706000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/dex.ts b/src/dex.ts index 879ed06..fc524ba 100644 --- a/src/dex.ts +++ b/src/dex.ts @@ -20,6 +20,8 @@ import { ERC20Mock__factory, WNative, WNative__factory, + ApeFactory, + ApeRouter, } from '../typechain-types' /** @@ -129,3 +131,49 @@ export async function deployMockDex( dexPairs, } } + +export async function addLiquidity( + ethers: HardhatEthersHelpers, + dexFactory: ApeFactory, + dexRouter: ApeRouter, + mockTokens: ERC20Mock[], + mockWBNB: WNative, + [owner, alice]: SignerWithAddress[] +) { + const ApePair = (await ethers.getContractFactory( + ApePairBuild.abi, + ApePairBuild.bytecode + )) as ApePair__factory + + const dexPairs: ApePair[] = [] + const TOKEN_BASE_BALANCE = ether('1000') + const WBNB_BASE_BALANCE = ether('1') + for (let index = 0; index < mockTokens.length; index++) { + // Mint pair token + const mockToken = mockTokens[index] + + await mockToken.connect(owner).mint(TOKEN_BASE_BALANCE) + await mockToken + .connect(owner) + .approve(dexRouter.address, TOKEN_BASE_BALANCE) + + await dexRouter.connect(owner).addLiquidityETH( + mockToken.address, // token + TOKEN_BASE_BALANCE, // amountTokenDesired + 0, // amountTokenMin + 0, // amountETHMin + alice.address, // to + '9999999999', // deadline + { + value: WBNB_BASE_BALANCE, // Adding ETH liquidity which gets exchanged for WETH + } + ) + + const pairCreated = await ApePair.attach( + await dexFactory.getPair(mockToken.address, mockWBNB.address) + ) + + dexPairs.push(pairCreated) + } + return dexPairs +} diff --git a/src/dexV2AndV3.ts b/src/dexV2AndV3.ts new file mode 100644 index 0000000..1afde5c --- /dev/null +++ b/src/dexV2AndV3.ts @@ -0,0 +1,71 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { HardhatEthersHelpers } from 'hardhat/types' +import { ether } from './utils' +import SwapRouter02Build from './artifacts-apeswap/dex/contracts/SwapRouter02.json' + + +// Import Contract Types +import { + SwapRouter02__factory, + WNative, +} from '../typechain-types' +import { deployMockDex as deployMockDexV2, addLiquidity } from './dex' +import { deployMockDex as deployMockDexV3 } from './dexV3' + +/** + * Deploy a mock dex. + * + * - LP fees are sent to `feeTo` + * - Initial LP tokens are minted to `alice` + */ +// NOTE: Currently does not create a BANANA/WBNB pair +export async function deployDexesAndRouter( + ethers: HardhatEthersHelpers, + [owner, feeTo, alice]: [ + SignerWithAddress, + SignerWithAddress, + SignerWithAddress + ], + numPairs = 2, + mockWBNBoverwrite: WNative | null = null +) { + const SwapRouter = (await ethers.getContractFactoryFromArtifact( + SwapRouter02Build + )) as SwapRouter02__factory + + const DEXV3 = await deployMockDexV3( + ethers, + [owner, feeTo, alice], + numPairs, + mockWBNBoverwrite + ) + + const DEXV2 = await deployMockDexV2( + ethers, + [owner, feeTo, alice], + numPairs, + DEXV3.mockWBNB + ) + await addLiquidity( + ethers, + DEXV2.dexFactory, + DEXV2.dexRouter, + DEXV3.mockTokens, + DEXV3.mockWBNB, + [owner, alice] + ) + + const router = await SwapRouter.deploy( + DEXV3.dexFactory.address, + DEXV2.dexFactory.address, + DEXV3.positionManager.address, + DEXV3.mockWBNB.address + ) + return { + DEXV3, + DEXV2, + router, + mockWBNB: DEXV3.mockWBNB, + mockTokens: DEXV3.mockTokens, + } +} diff --git a/src/index.ts b/src/index.ts index b8f1750..8a9422c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ */ export * as dex from './dex'; export * as dexV3 from './dexV3'; +export * as dexV2AndV3 from './dexV2AndV3' export * as farm from './farm'; export * as farmV2 from './farmV2'; export * as token from './token'; From 16d7baf2366893ed2896634b071cc4496a3e0a5f Mon Sep 17 00:00:00 2001 From: Doublo54 Date: Tue, 7 Mar 2023 15:48:54 +0100 Subject: [PATCH 7/8] 0.6.4-alpha.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33bcba5..0bedf05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ape.swap/hardhat-test-helpers", - "version": "0.6.1-alpha.0", + "version": "0.6.4-alpha.0", "description": "Install this package to get access to deployable ApeSwap Mock Farm and DEX for testing with contracts developed with the Hardhat framework.", "main": "./dist/index.js", "files": [ From d3794f856155e0500cf0dfe21b4904f0b0e71fe3 Mon Sep 17 00:00:00 2001 From: Doublo Date: Thu, 30 Mar 2023 11:54:09 +0200 Subject: [PATCH 8/8] feat: added ApeSwapMultiSwapRouter instead of SwapRouter02 --- .../dex/contracts/ApeSwapMultiSwapRouter.json | 848 ++++++++++++++++++ src/dexV2AndV3.ts | 20 +- 2 files changed, 855 insertions(+), 13 deletions(-) create mode 100644 src/artifacts-apeswap/dex/contracts/ApeSwapMultiSwapRouter.json diff --git a/src/artifacts-apeswap/dex/contracts/ApeSwapMultiSwapRouter.json b/src/artifacts-apeswap/dex/contracts/ApeSwapMultiSwapRouter.json new file mode 100644 index 0000000..2407343 --- /dev/null +++ b/src/artifacts-apeswap/dex/contracts/ApeSwapMultiSwapRouter.json @@ -0,0 +1,848 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ApeSwapMultiSwapRouter", + "sourceName": "contracts/ApeSwapMultiSwapRouter.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "_factories", + "type": "address[]" + }, + { + "internalType": "address", + "name": "_WETH9", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "router", + "type": "address" + } + ], + "name": "FactoryAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "router", + "type": "address" + } + ], + "name": "FactoryRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "WETH9", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + } + ], + "name": "addFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IApeRouter02", + "name": "router", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenA", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenB", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountADesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBDesired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountAMin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountBMin", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "addLiquidity", + "outputs": [ + { + "internalType": "uint256", + "name": "amountA", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountB", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "liquidity", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMinimum", + "type": "uint256" + } + ], + "internalType": "struct IV3SwapRouter.ExactInputParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactInput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMinimum", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "internalType": "struct IV3SwapRouter.ExactInputSingleParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactInputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMaximum", + "type": "uint256" + } + ], + "internalType": "struct IV3SwapRouter.ExactOutputParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactOutput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMaximum", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "internalType": "struct IV3SwapRouter.ExactOutputSingleParams", + "name": "params", + "type": "tuple" + } + ], + "name": "exactOutputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "factories", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "previousBlockhash", + "type": "bytes32" + }, + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "pull", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "refundETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + } + ], + "name": "removeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IApeRouter02", + "name": "router", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountOutMin", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IApeRouter02", + "name": "router", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amountInMax", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "path", + "type": "address[]" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + } + ], + "name": "sweepToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "sweepTokenWithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "sweepTokenWithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "amount0Delta", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1Delta", + "type": "int256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "uniswapV3SwapCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + } + ], + "name": "unwrapWETH9", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "unwrapWETH9WithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amountMinimum", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeBips", + "type": "uint256" + }, + { + "internalType": "address", + "name": "feeRecipient", + "type": "address" + } + ], + "name": "unwrapWETH9WithFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "wrapETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60c06040526000196002553480156200001757600080fd5b5060405162005822380380620058228339810160408190526200003a916200012e565b600060808190526001600160601b0319606083901b1660a05282906200005f6200010d565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060005b815181101562000103576001806000848481518110620000c857fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101620000ac565b5050505062000200565b3390565b80516001600160a01b03811681146200012957600080fd5b919050565b6000806040838503121562000141578182fd5b82516001600160401b038082111562000158578384fd5b818501915085601f8301126200016c578384fd5b81516020828211156200017b57fe5b808202604051828282010181811086821117156200019557fe5b604052838152828101945085830182870184018b1015620001b4578889fd5b8896505b84871015620001e157620001cc8162000111565b865260019690960195948301948301620001b8565b509650620001f3905087820162000111565b9450505050509250929050565b60805160601c60a05160601c6155cb62000257600039806101ee52806107045280610c085280610d325280610dd95280611c115280611d3b5280613720528061378052806138015250806124a852506155cb6000f3fe6080604052600436106101d15760003560e01c8063786707e1116100f7578063d4ef38de11610095578063f2d5d56b11610064578063f2d5d56b146104d2578063f2fde38b146104e5578063fa461e3314610505578063fab52689146105255761027c565b8063d4ef38de14610486578063df2ab5bb14610499578063e0e189a0146104ac578063e90a182f146104bf5761027c565b80639b2c0a37116100d15780639b2c0a3714610438578063a3a4bc9a1461044b578063ac9650d81461045e578063c45a0155146104715761027c565b8063786707e1146103fd578063882f3b85146104105780638da5cb5b146104235761027c565b806349404b7c1161016f57806352f897f51161013e57806352f897f5146103935780635ae401dc146103c2578063715018a6146103d557806372cce0b8146103ea5761027c565b806349404b7c1461032b578063496169971461033e5780634aa4a4fc146103515780634b37c73f146103735761027c565b80631f0464d1116101ab5780631f0464d1146102c557806329ce1ec5146102e55780633068c554146103055780633fb49a1e146103185761027c565b80630c73b1e81461028157806312210e8a146102aa5780631c58db4f146102b25761027c565b3661027c573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461027a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b61029461028f366004614e68565b610552565b6040516102a191906153ba565b60405180910390f35b61027a6106f0565b61027a6102c0366004614fa5565b610702565b6102d86102d3366004614ab6565b610786565b6040516102a191906151fe565b3480156102f157600080fd5b5061027a610300366004614883565b61080e565b61027a61031336600461498c565b6109d2565b610294610326366004614db8565b6109e5565b61027a610339366004614fd5565b610c04565b61027a61034c366004614fa5565b610dca565b34801561035d57600080fd5b50610366610dd7565b6040516102a1919061512f565b34801561037f57600080fd5b5061027a61038e366004614883565b610dfb565b34801561039f57600080fd5b506103b36103ae366004614b00565b610fba565b6040516102a19392919061546d565b6102d86103d0366004614ab6565b61128f565b3480156103e157600080fd5b5061027a611308565b6102946103f8366004614ea0565b61141f565b61029461040b366004614d06565b6115ba565b61029461041e366004614b84565b61181f565b34801561042f57600080fd5b50610366611bd7565b61027a610446366004615004565b611bf3565b610294610459366004614b84565b611e09565b6102d861046c3660046149d5565b61234c565b34801561047d57600080fd5b506103666124a6565b61027a610494366004615042565b6124ca565b61027a6104a73660046148ed565b6124d6565b61027a6104ba36600461492e565b6125ed565b61027a6104cd3660046148c2565b612753565b61027a6104e03660046148c2565b612762565b3480156104f157600080fd5b5061027a610500366004614883565b61276e565b34801561051157600080fd5b5061027a610520366004614c21565b61290f565b34801561053157600080fd5b50610545610540366004614883565b612bc9565b6040516102a1919061527c565b60006105616020830183614883565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166105f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6106796106056020850185614883565b606085018035906106199060408801614883565b600060405180604001604052808980602001906106369190615483565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525033602090910152612bde565b50600254915082608001358211156106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061529a565b60405180910390fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600255919050565b4715610700576107003347612dc7565b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b505050505050565b606083806001430340146107fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f426c6f636b686173680000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610805848461234c565b95945050505050565b610816612f15565b73ffffffffffffffffffffffffffffffffffffffff16610834611bd7565b73ffffffffffffffffffffffffffffffffffffffff16146108b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561094b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f466163746f727920697320616c72656164792061646465640000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909217909155815192835290517f6fdc0147105e43e21da80a75b42d0fd464060d5e1a34b0cefbf0b4ccfc2e36a19281900390910190a150565b6109df84843385856125ed565b50505050565b805173ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205490919060ff16610a7e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6000808460a001511415610b3c575060208301516040517f70a0823100000000000000000000000000000000000000000000000000000000815260019173ffffffffffffffffffffffffffffffffffffffff16906370a0823190610ae690309060040161512f565b60206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190614fbd565b60a08501525b610bbd84600001518560a0015186608001518760e0015160405180604001604052808a602001518b606001518c60400151604051602001610b7f939291906150b9565b604051602081830303815290604052815260200187610b9e5733610ba0565b305b73ffffffffffffffffffffffffffffffffffffffff169052612f19565b92508360c00151831015610bfd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061533b565b5050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c8d57600080fd5b505afa158015610ca1573d6000803e3d6000fd5b505050506040513d6020811015610cb757600080fd5b5051905082811015610d2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015610dc5577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b50505050610dc58282612dc7565b505050565b610dd48133610c04565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610e03612f15565b73ffffffffffffffffffffffffffffffffffffffff16610e21611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614610ea357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16610f3757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f466163746f7279206973206e6f742070726573656e7400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517fafa2737b2090fa39c66b7348625f0c03726240f724defbc6216d679506f944419281900390910190a150565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260016020526040812054819081908b9060ff1661105457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6110638c8c8c8c8c8c8c6130cc565b809450819550505060008c73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb91906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058d8d6040518363ffffffff1660e01b8152600401611125929190615150565b60206040518083038186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906148a6565b90506111838c33838861371e565b61118f8b33838761371e565b73ffffffffffffffffffffffffffffffffffffffff8616600114156111b6573395506111d9565b73ffffffffffffffffffffffffffffffffffffffff8616600214156111d9573095505b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a6278429061122b90899060040161512f565b602060405180830381600087803b15801561124557600080fd5b505af1158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d9190614fbd565b92505050985098509895505050505050565b6060838061129b6138fc565b11156107fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b611310612f15565b73ffffffffffffffffffffffffffffffffffffffff1661132e611bd7565b73ffffffffffffffffffffffffffffffffffffffff16146113b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600061142e6020830183614883565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166114c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b61157a6114d26020850185614883565b60a085018035906114e69060808801614883565b6114f7610100880160e08901614883565b60405180604001604052808960400160208101906115159190614883565b61152560808c0160608d01614f8b565b61153560408d0160208e01614883565b604051602001611547939291906150b9565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250612bde565b91508260c001358211156106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061529a565b805173ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205490919060ff1661165357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b60008084606001511415611722576001905060006116748560200151613900565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a08231906116cb90309060040161512f565b60206040518083038186803b1580156116e357600080fd5b505afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190614fbd565b6060860152505b60008161172f5733611731565b305b90505b60006117438660200151613931565b90506117a18660000151876060015183611761578860400151611763565b305b6000604051806040016040528061177d8d6020015161393d565b81526020018873ffffffffffffffffffffffffffffffffffffffff16815250612f19565b606087015280156117c6573091506117bc8660200151613952565b60208701526117d3565b85606001519450506117d9565b50611734565b8460800151841015611817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061533b565b505050919050565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812054879060ff166118b557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6040517f1f00ca7400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690631f00ca749061190b908a90899089906004016153c3565b60006040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261197d9190810190614a15565b60008151811061198957fe5b60200260200101519150858211156119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061529a565b611b43858560008181106119dd57fe5b90506020020160208101906119f29190614883565b338a73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390589896000818110611a9957fe5b9050602002016020810190611aae9190614883565b8a8a6001818110611abb57fe5b9050602002016020810190611ad09190614883565b6040518363ffffffff1660e01b8152600401611aed929190615150565b60206040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906148a6565b8561371e565b73ffffffffffffffffffffffffffffffffffffffff831660011415611b6a57339250611b8d565b73ffffffffffffffffffffffffffffffffffffffff831660021415611b8d573092505b611bcc88868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613987915050565b509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600082118015611c04575060648211155b611c0d57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c9657600080fd5b505afa158015611caa573d6000803e3d6000fd5b505050506040513d6020811015611cc057600080fd5b5051905084811015611d3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015611e02577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611dac57600080fd5b505af1158015611dc0573d6000803e3d6000fd5b505050506000612710611ddc8584613f1590919063ffffffff16565b81611de357fe5b0490508015611df657611df68382612dc7565b61077e85828403612dc7565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812054879060ff16611e9f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b600087611f54575060018585600081611eb457fe5b9050602002016020810190611ec99190614883565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f01919061512f565b60206040518083038186803b158015611f1957600080fd5b505afa158015611f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f519190614fbd565b97505b6120d686866000818110611f6457fe5b9050602002016020810190611f799190614883565b82611f845733611f86565b305b8b73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611fcc57600080fd5b505afa158015611fe0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200491906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a600081811061202c57fe5b90506020020160208101906120419190614883565b8b8b600181811061204e57fe5b90506020020160208101906120639190614883565b6040518363ffffffff1660e01b8152600401612080929190615150565b60206040518083038186803b15801561209857600080fd5b505afa1580156120ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d091906148a6565b8b61371e565b73ffffffffffffffffffffffffffffffffffffffff8416600114156120fd57339350612120565b73ffffffffffffffffffffffffffffffffffffffff841660021415612120573093505b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061215057fe5b90506020020160208101906121659190614883565b73ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161219d919061512f565b60206040518083038186803b1580156121b557600080fd5b505afa1580156121c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ed9190614fbd565b905061222e8a8888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613987915050565b6123038188887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061226057fe5b90506020020160208101906122759190614883565b73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016122ad919061512f565b60206040518083038186803b1580156122c557600080fd5b505afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd9190614fbd565b90613f39565b93508784101561233f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061533b565b5050509695505050505050565b60608167ffffffffffffffff8111801561236557600080fd5b5060405190808252806020026020018201604052801561239957816020015b60608152602001906001900390816123845790505b50905060005b8281101561249f57600080308686858181106123b757fe5b90506020028101906123c99190615483565b6040516123d792919061511f565b600060405180830381855af49150503d8060008114612412576040519150601f19603f3d011682016040523d82523d6000602084013e612417565b606091505b50915091508161247d5760448151101561243057600080fd5b6004810190508080602001905181019061244a9190614c9c565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9190615287565b8084848151811061248a57fe5b6020908102919091010152505060010161239f565b5092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610dc583338484611bf3565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561253f57600080fd5b505afa158015612553573d6000803e3d6000fd5b505050506040513d602081101561256957600080fd5b50519050828110156125dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156109df576109df848383613f49565b6000821180156125fe575060648211155b61260757600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561267057600080fd5b505afa158015612684573d6000803e3d6000fd5b505050506040513d602081101561269a57600080fd5b505190508481101561270d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561077e5760006127106127228386613f15565b8161272957fe5b049050801561273d5761273d878483613f49565b61274a8786838503613f49565b50505050505050565b61275e8282336124d6565b5050565b61275e8233308461411e565b612776612f15565b73ffffffffffffffffffffffffffffffffffffffff16612794611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461281657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155996026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561295557600080fd5b505afa158015612969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298d91906148a6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16612a2157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6000851380612a305750600084135b612a3957600080fd5b6000612a4783850185614eb8565b90506000806000612a5b8460000151613900565b92509250925060008060008b13612aa1578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16108a612ad2565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108b5b915091508115612af157612aec858760200151338461371e565b612bbc565b8551612afc90613931565b15612ba5578551612b0c90613952565b8660000181905250612b9f3373ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9591906148a6565b823360008a612bde565b50612bbc565b80600281905550612bbc848760200151338461371e565b5050505050505050505050565b60016020526000908152604090205460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff841660011415612c0757339350612c2a565b73ffffffffffffffffffffffffffffffffffffffff841660021415612c2a573093505b6000806000612c3c8560000151613900565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80841690831610600080612c6e8c8688876142fb565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b85612c948f6143a4565b60000373ffffffffffffffffffffffffffffffffffffffff8e1615612cb9578d612cdf565b87612cd85773fffd8963efd1fc6a506488495d951d5263988d25612cdf565b6401000276a45b8d604051602001612cf09190615372565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612d1f9594939291906151ac565b6040805180830381600087803b158015612d3857600080fd5b505af1158015612d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d709190614bfe565b91509150600083612d85578183600003612d8b565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16612db7578b8114612db757600080fd5b5050505050505095945050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310612e3e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612e01565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612ea0576040519150601f19603f3d011682016040523d82523d6000602084013e612ea5565b606091505b5050905080610dc557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3390565b600073ffffffffffffffffffffffffffffffffffffffff841660011415612f4257339350612f65565b73ffffffffffffffffffffffffffffffffffffffff841660021415612f65573093505b6000806000612f778560000151613900565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80831690841610600080612fa98c8787876142fb565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b85612fcf8f6143a4565b73ffffffffffffffffffffffffffffffffffffffff8e1615612ff1578d613017565b876130105773fffd8963efd1fc6a506488495d951d5263988d25613017565b6401000276a45b8d6040516020016130289190615372565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016130579594939291906151ac565b6040805180830381600087803b15801561307057600080fd5b505af1158015613084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a89190614bfe565b91509150826130b757816130b9565b805b6000039c9b505050505050505050505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561312d57600080fd5b505afa158015613141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316591906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b815260040161319f929190615150565b60206040518083038186803b1580156131b757600080fd5b505afa1580156131cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ef91906148a6565b73ffffffffffffffffffffffffffffffffffffffff161415613317578873ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561325157600080fd5b505afa158015613265573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328991906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b81526004016132c3929190615150565b602060405180830381600087803b1580156132dd57600080fd5b505af11580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331591906148a6565b505b6000808a73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561336057600080fd5b505afa158015613374573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339891906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058b8b6040518363ffffffff1660e01b81526004016133d2929190615150565b60206040518083038186803b1580156133ea57600080fd5b505afa1580156133fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342291906148a6565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561346757600080fd5b505afa15801561347b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349f9190614f48565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16106134fe578082613501565b81815b909250905081158015613512575080155b1561352257879350869250613710565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8d169063ad615dec9061357b908c908790879060040161546d565b60206040518083038186803b15801561359357600080fd5b505afa1580156135a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cb9190614fbd565b9050878111613619578581101561360e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906152d1565b88945092508261370e565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8e169063ad615dec90613672908c908790899060040161546d565b60206040518083038186803b15801561368a57600080fd5b505afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190614fbd565b9050898111156136ce57fe5b87811015613708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd90615306565b94508793505b505b505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156137795750804710155b156138c2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156137e657600080fd5b505af11580156137fa573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561389057600080fd5b505af11580156138a4573d6000803e3d6000fd5b505050506040513d60208110156138ba57600080fd5b506109df9050565b73ffffffffffffffffffffffffffffffffffffffff83163014156138f0576138eb848383613f49565b6109df565b6109df8484848461411e565b4290565b6000808061390e84826143d6565b925061391b8460146144d6565b90506139288460176143d6565b91509193909250565b8051604211155b919050565b606061394c826000602b6145c6565b92915050565b805160609061394c9083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9016145c6565b60005b60018351038110156109df576000808483815181106139a557fe5b60200260200101518584600101815181106139bc57fe5b60200260200101519150915060008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1610613a04578183613a07565b82825b50905060008773ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5257600080fd5b505afa158015613a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8a91906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b8152600401613ac4929190615150565b60206040518083038186803b158015613adc57600080fd5b505afa158015613af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1491906148a6565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b6257600080fd5b505afa158015613b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9a9190614f48565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614613bfc578284613bff565b83835b91509150613c40828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016122ad919061512f565b6040517f054d50d400000000000000000000000000000000000000000000000000000000815290965073ffffffffffffffffffffffffffffffffffffffff8f169063054d50d490613c999089908690869060040161546d565b60206040518083038186803b158015613cb157600080fd5b505afa158015613cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce99190614fbd565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614613d2d57826000613d31565b6000835b91509150600060028c51038a10613d48578a613e66565b8c73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015613d8e57600080fd5b505afa158015613da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc691906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905898e8d60020181518110613df157fe5b60200260200101516040518363ffffffff1660e01b8152600401613e16929190615150565b60206040518083038186803b158015613e2e57600080fd5b505afa158015613e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6691906148a6565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f90613ece9086908690869060248101615428565b600060405180830381600087803b158015613ee857600080fd5b505af1158015613efc573d6000803e3d6000fd5b50506001909b019a5061398a9950505050505050505050565b6000821580613f3057505081810281838281613f2d57fe5b04145b61394c57600080fd5b8082038281111561394c57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061401e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613fe1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614080576040519150601f19603f3d011682016040523d82523d6000602084013e614085565b606091505b50915091508180156140b35750805115806140b357508080602001905160208110156140b057600080fd5b50515b611e0257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b602083106141fb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016141be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461425d576040519150601f19603f3d011682016040523d82523d6000602084013e614262565b606091505b5091509150818015614290575080511580614290575080806020019051602081101561428d57600080fd5b50515b61077e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040517f1698ee8200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff861690631698ee829061435490879087908790600401615177565b60206040518083038186803b15801561436c57600080fd5b505afa158015614380573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080591906148a6565b60007f800000000000000000000000000000000000000000000000000000000000000082106143d257600080fd5b5090565b60008182601401101561444a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b81601401835110156144bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b60008182600301101561454a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b81600301835110156145bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f01101561463a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b8282840110156146ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b8183018451101561471d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b60608215801561473c57604051915060008252602082016040526147a4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561477557805183526020928301920161475d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b803561393881615576565b60008083601f8401126147c9578182fd5b50813567ffffffffffffffff8111156147e0578182fd5b60208301915083602080830285010111156147fa57600080fd5b9250929050565b600082601f830112614811578081fd5b813561482461481f8261550a565b6154e6565b818152846020838601011115614838578283fd5b816020850160208301379081016020019190915292915050565b80516dffffffffffffffffffffffffffff8116811461393857600080fd5b803562ffffff8116811461393857600080fd5b600060208284031215614894578081fd5b813561489f81615576565b9392505050565b6000602082840312156148b7578081fd5b815161489f81615576565b600080604083850312156148d4578081fd5b82356148df81615576565b946020939093013593505050565b600080600060608486031215614901578081fd5b833561490c81615576565b925060208401359150604084013561492381615576565b809150509250925092565b600080600080600060a08688031215614945578283fd5b853561495081615576565b945060208601359350604086013561496781615576565b925060608601359150608086013561497e81615576565b809150509295509295909350565b600080600080608085870312156149a1578182fd5b84356149ac81615576565b9350602085013592506040850135915060608501356149ca81615576565b939692955090935050565b600080602083850312156149e7578182fd5b823567ffffffffffffffff8111156149fd578283fd5b614a09858286016147b8565b90969095509350505050565b60006020808385031215614a27578182fd5b825167ffffffffffffffff80821115614a3e578384fd5b818501915085601f830112614a51578384fd5b815181811115614a5d57fe5b8381029150614a6d8483016154e6565b8181528481019084860184860187018a1015614a87578788fd5b8795505b83861015614aa9578051835260019590950194918601918601614a8b565b5098975050505050505050565b600080600060408486031215614aca578081fd5b83359250602084013567ffffffffffffffff811115614ae7578182fd5b614af3868287016147b8565b9497909650939450505050565b600080600080600080600080610100898b031215614b1c578586fd5b8835614b2781615576565b97506020890135614b3781615576565b96506040890135614b4781615576565b9550606089013594506080890135935060a0890135925060c0890135915060e0890135614b7381615576565b809150509295985092959890939650565b60008060008060008060a08789031215614b9c578384fd5b8635614ba781615576565b95506020870135945060408701359350606087013567ffffffffffffffff811115614bd0578283fd5b614bdc89828a016147b8565b9094509250506080870135614bf081615576565b809150509295509295509295565b60008060408385031215614c10578182fd5b505080516020909101519092909150565b60008060008060608587031215614c36578182fd5b8435935060208501359250604085013567ffffffffffffffff80821115614c5b578384fd5b818701915087601f830112614c6e578384fd5b813581811115614c7c578485fd5b886020828501011115614c8d578485fd5b95989497505060200194505050565b600060208284031215614cad578081fd5b815167ffffffffffffffff811115614cc3578182fd5b8201601f81018413614cd3578182fd5b8051614ce161481f8261550a565b818152856020838501011115614cf5578384fd5b61080582602083016020860161554a565b600060208284031215614d17578081fd5b813567ffffffffffffffff80821115614d2e578283fd5b9083019060a08286031215614d41578283fd5b60405160a081018181108382111715614d5657fe5b604052614d62836147ad565b8152602083013582811115614d75578485fd5b614d8187828601614801565b602083015250614d93604084016147ad565b6040820152606083013560608201526080830135608082015280935050505092915050565b6000610100808385031215614dcb578182fd5b6040519081019067ffffffffffffffff82118183101715614de857fe5b81604052614df5846147ad565b8152614e03602085016147ad565b6020820152614e14604085016147ad565b6040820152614e2560608501614870565b6060820152614e36608085016147ad565b608082015260a084013560a082015260c084013560c0820152614e5b60e085016147ad565b60e0820152949350505050565b600060208284031215614e79578081fd5b813567ffffffffffffffff811115614e8f578182fd5b820160a0818503121561489f578182fd5b60006101008284031215614eb2578081fd5b50919050565b600060208284031215614ec9578081fd5b813567ffffffffffffffff80821115614ee0578283fd5b9083019060408286031215614ef3578283fd5b604051604081018181108382111715614f0857fe5b604052823582811115614f19578485fd5b614f2587828601614801565b82525060208301359250614f3883615576565b6020810192909252509392505050565b600080600060608486031215614f5c578081fd5b614f6584614852565b9250614f7360208501614852565b9150604084015163ffffffff81168114614923578182fd5b600060208284031215614f9c578081fd5b61489f82614870565b600060208284031215614fb6578081fd5b5035919050565b600060208284031215614fce578081fd5b5051919050565b60008060408385031215614fe7578182fd5b823591506020830135614ff981615576565b809150509250929050565b60008060008060808587031215615019578182fd5b84359350602085013561502b81615576565b92506040850135915060608501356149ca81615576565b600080600060608486031215615056578081fd5b8335925060208401359150604084013561492381615576565b6000815180845261508781602086016020860161554a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff938416815291909216602082015262ffffff909116604082015260600190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526151f360a083018461506f565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561526f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261525d85835161506f565b94509285019290850190600101615223565b5092979650505050505050565b901515815260200190565b60006020825261489f602083018461506f565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b6020808252818101527f417065526f757465723a20494e53554646494349454e545f425f414d4f554e54604082015260600190565b6020808252818101527f417065526f757465723a20494e53554646494349454e545f415f414d4f554e54604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b60006020825282516040602084015261538e606084018261506f565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b90815260200190565b83815260406020808301829052908201839052600090849060608401835b8681101561541c5783356153f481615576565b73ffffffffffffffffffffffffffffffffffffffff16825292820192908201906001016153e1565b50979650505050505050565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152615463608083018461506f565b9695505050505050565b9283526020830191909152604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126154b7578283fd5b83018035915067ffffffffffffffff8211156154d1578283fd5b6020019150368190038213156147fa57600080fd5b60405181810167ffffffffffffffff8111828210171561550257fe5b604052919050565b600067ffffffffffffffff82111561551e57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561556557818101518382015260200161554d565b838111156109df5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610dd457600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a164736f6c6343000706000a", + "deployedBytecode": "0x6080604052600436106101d15760003560e01c8063786707e1116100f7578063d4ef38de11610095578063f2d5d56b11610064578063f2d5d56b146104d2578063f2fde38b146104e5578063fa461e3314610505578063fab52689146105255761027c565b8063d4ef38de14610486578063df2ab5bb14610499578063e0e189a0146104ac578063e90a182f146104bf5761027c565b80639b2c0a37116100d15780639b2c0a3714610438578063a3a4bc9a1461044b578063ac9650d81461045e578063c45a0155146104715761027c565b8063786707e1146103fd578063882f3b85146104105780638da5cb5b146104235761027c565b806349404b7c1161016f57806352f897f51161013e57806352f897f5146103935780635ae401dc146103c2578063715018a6146103d557806372cce0b8146103ea5761027c565b806349404b7c1461032b578063496169971461033e5780634aa4a4fc146103515780634b37c73f146103735761027c565b80631f0464d1116101ab5780631f0464d1146102c557806329ce1ec5146102e55780633068c554146103055780633fb49a1e146103185761027c565b80630c73b1e81461028157806312210e8a146102aa5780631c58db4f146102b25761027c565b3661027c573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461027a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b61029461028f366004614e68565b610552565b6040516102a191906153ba565b60405180910390f35b61027a6106f0565b61027a6102c0366004614fa5565b610702565b6102d86102d3366004614ab6565b610786565b6040516102a191906151fe565b3480156102f157600080fd5b5061027a610300366004614883565b61080e565b61027a61031336600461498c565b6109d2565b610294610326366004614db8565b6109e5565b61027a610339366004614fd5565b610c04565b61027a61034c366004614fa5565b610dca565b34801561035d57600080fd5b50610366610dd7565b6040516102a1919061512f565b34801561037f57600080fd5b5061027a61038e366004614883565b610dfb565b34801561039f57600080fd5b506103b36103ae366004614b00565b610fba565b6040516102a19392919061546d565b6102d86103d0366004614ab6565b61128f565b3480156103e157600080fd5b5061027a611308565b6102946103f8366004614ea0565b61141f565b61029461040b366004614d06565b6115ba565b61029461041e366004614b84565b61181f565b34801561042f57600080fd5b50610366611bd7565b61027a610446366004615004565b611bf3565b610294610459366004614b84565b611e09565b6102d861046c3660046149d5565b61234c565b34801561047d57600080fd5b506103666124a6565b61027a610494366004615042565b6124ca565b61027a6104a73660046148ed565b6124d6565b61027a6104ba36600461492e565b6125ed565b61027a6104cd3660046148c2565b612753565b61027a6104e03660046148c2565b612762565b3480156104f157600080fd5b5061027a610500366004614883565b61276e565b34801561051157600080fd5b5061027a610520366004614c21565b61290f565b34801561053157600080fd5b50610545610540366004614883565b612bc9565b6040516102a1919061527c565b60006105616020830183614883565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166105f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6106796106056020850185614883565b606085018035906106199060408801614883565b600060405180604001604052808980602001906106369190615483565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525033602090910152612bde565b50600254915082608001358211156106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061529a565b60405180910390fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600255919050565b4715610700576107003347612dc7565b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b505050505050565b606083806001430340146107fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f426c6f636b686173680000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610805848461234c565b95945050505050565b610816612f15565b73ffffffffffffffffffffffffffffffffffffffff16610834611bd7565b73ffffffffffffffffffffffffffffffffffffffff16146108b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561094b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f466163746f727920697320616c72656164792061646465640000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909217909155815192835290517f6fdc0147105e43e21da80a75b42d0fd464060d5e1a34b0cefbf0b4ccfc2e36a19281900390910190a150565b6109df84843385856125ed565b50505050565b805173ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205490919060ff16610a7e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6000808460a001511415610b3c575060208301516040517f70a0823100000000000000000000000000000000000000000000000000000000815260019173ffffffffffffffffffffffffffffffffffffffff16906370a0823190610ae690309060040161512f565b60206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190614fbd565b60a08501525b610bbd84600001518560a0015186608001518760e0015160405180604001604052808a602001518b606001518c60400151604051602001610b7f939291906150b9565b604051602081830303815290604052815260200187610b9e5733610ba0565b305b73ffffffffffffffffffffffffffffffffffffffff169052612f19565b92508360c00151831015610bfd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061533b565b5050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c8d57600080fd5b505afa158015610ca1573d6000803e3d6000fd5b505050506040513d6020811015610cb757600080fd5b5051905082811015610d2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015610dc5577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b50505050610dc58282612dc7565b505050565b610dd48133610c04565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610e03612f15565b73ffffffffffffffffffffffffffffffffffffffff16610e21611bd7565b73ffffffffffffffffffffffffffffffffffffffff1614610ea357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16610f3757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f466163746f7279206973206e6f742070726573656e7400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517fafa2737b2090fa39c66b7348625f0c03726240f724defbc6216d679506f944419281900390910190a150565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260016020526040812054819081908b9060ff1661105457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6110638c8c8c8c8c8c8c6130cc565b809450819550505060008c73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b357600080fd5b505afa1580156110c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110eb91906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058d8d6040518363ffffffff1660e01b8152600401611125929190615150565b60206040518083038186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906148a6565b90506111838c33838861371e565b61118f8b33838761371e565b73ffffffffffffffffffffffffffffffffffffffff8616600114156111b6573395506111d9565b73ffffffffffffffffffffffffffffffffffffffff8616600214156111d9573095505b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a6278429061122b90899060040161512f565b602060405180830381600087803b15801561124557600080fd5b505af1158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d9190614fbd565b92505050985098509895505050505050565b6060838061129b6138fc565b11156107fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b611310612f15565b73ffffffffffffffffffffffffffffffffffffffff1661132e611bd7565b73ffffffffffffffffffffffffffffffffffffffff16146113b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600061142e6020830183614883565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166114c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b61157a6114d26020850185614883565b60a085018035906114e69060808801614883565b6114f7610100880160e08901614883565b60405180604001604052808960400160208101906115159190614883565b61152560808c0160608d01614f8b565b61153560408d0160208e01614883565b604051602001611547939291906150b9565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250612bde565b91508260c001358211156106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061529a565b805173ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205490919060ff1661165357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b60008084606001511415611722576001905060006116748560200151613900565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a08231906116cb90309060040161512f565b60206040518083038186803b1580156116e357600080fd5b505afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190614fbd565b6060860152505b60008161172f5733611731565b305b90505b60006117438660200151613931565b90506117a18660000151876060015183611761578860400151611763565b305b6000604051806040016040528061177d8d6020015161393d565b81526020018873ffffffffffffffffffffffffffffffffffffffff16815250612f19565b606087015280156117c6573091506117bc8660200151613952565b60208701526117d3565b85606001519450506117d9565b50611734565b8460800151841015611817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061533b565b505050919050565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812054879060ff166118b557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6040517f1f00ca7400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690631f00ca749061190b908a90899089906004016153c3565b60006040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261197d9190810190614a15565b60008151811061198957fe5b60200260200101519150858211156119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061529a565b611b43858560008181106119dd57fe5b90506020020160208101906119f29190614883565b338a73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3957600080fd5b505afa158015611a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7191906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390589896000818110611a9957fe5b9050602002016020810190611aae9190614883565b8a8a6001818110611abb57fe5b9050602002016020810190611ad09190614883565b6040518363ffffffff1660e01b8152600401611aed929190615150565b60206040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906148a6565b8561371e565b73ffffffffffffffffffffffffffffffffffffffff831660011415611b6a57339250611b8d565b73ffffffffffffffffffffffffffffffffffffffff831660021415611b8d573092505b611bcc88868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613987915050565b509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600082118015611c04575060648211155b611c0d57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c9657600080fd5b505afa158015611caa573d6000803e3d6000fd5b505050506040513d6020811015611cc057600080fd5b5051905084811015611d3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015611e02577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611dac57600080fd5b505af1158015611dc0573d6000803e3d6000fd5b505050506000612710611ddc8584613f1590919063ffffffff16565b81611de357fe5b0490508015611df657611df68382612dc7565b61077e85828403612dc7565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812054879060ff16611e9f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b600087611f54575060018585600081611eb457fe5b9050602002016020810190611ec99190614883565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f01919061512f565b60206040518083038186803b158015611f1957600080fd5b505afa158015611f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f519190614fbd565b97505b6120d686866000818110611f6457fe5b9050602002016020810190611f799190614883565b82611f845733611f86565b305b8b73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611fcc57600080fd5b505afa158015611fe0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200491906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a600081811061202c57fe5b90506020020160208101906120419190614883565b8b8b600181811061204e57fe5b90506020020160208101906120639190614883565b6040518363ffffffff1660e01b8152600401612080929190615150565b60206040518083038186803b15801561209857600080fd5b505afa1580156120ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d091906148a6565b8b61371e565b73ffffffffffffffffffffffffffffffffffffffff8416600114156120fd57339350612120565b73ffffffffffffffffffffffffffffffffffffffff841660021415612120573093505b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061215057fe5b90506020020160208101906121659190614883565b73ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b815260040161219d919061512f565b60206040518083038186803b1580156121b557600080fd5b505afa1580156121c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ed9190614fbd565b905061222e8a8888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613987915050565b6123038188887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061226057fe5b90506020020160208101906122759190614883565b73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b81526004016122ad919061512f565b60206040518083038186803b1580156122c557600080fd5b505afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd9190614fbd565b90613f39565b93508784101561233f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9061533b565b5050509695505050505050565b60608167ffffffffffffffff8111801561236557600080fd5b5060405190808252806020026020018201604052801561239957816020015b60608152602001906001900390816123845790505b50905060005b8281101561249f57600080308686858181106123b757fe5b90506020028101906123c99190615483565b6040516123d792919061511f565b600060405180830381855af49150503d8060008114612412576040519150601f19603f3d011682016040523d82523d6000602084013e612417565b606091505b50915091508161247d5760448151101561243057600080fd5b6004810190508080602001905181019061244a9190614c9c565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd9190615287565b8084848151811061248a57fe5b6020908102919091010152505060010161239f565b5092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610dc583338484611bf3565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561253f57600080fd5b505afa158015612553573d6000803e3d6000fd5b505050506040513d602081101561256957600080fd5b50519050828110156125dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156109df576109df848383613f49565b6000821180156125fe575060648211155b61260757600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561267057600080fd5b505afa158015612684573d6000803e3d6000fd5b505050506040513d602081101561269a57600080fd5b505190508481101561270d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561077e5760006127106127228386613f15565b8161272957fe5b049050801561273d5761273d878483613f49565b61274a8786838503613f49565b50505050505050565b61275e8282336124d6565b5050565b61275e8233308461411e565b612776612f15565b73ffffffffffffffffffffffffffffffffffffffff16612794611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461281657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155996026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561295557600080fd5b505afa158015612969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298d91906148a6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16612a2157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466163746f7279206e6f742077686974656c6973746564000000000000000000604482015290519081900360640190fd5b6000851380612a305750600084135b612a3957600080fd5b6000612a4783850185614eb8565b90506000806000612a5b8460000151613900565b92509250925060008060008b13612aa1578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16108a612ad2565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108b5b915091508115612af157612aec858760200151338461371e565b612bbc565b8551612afc90613931565b15612ba5578551612b0c90613952565b8660000181905250612b9f3373ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9591906148a6565b823360008a612bde565b50612bbc565b80600281905550612bbc848760200151338461371e565b5050505050505050505050565b60016020526000908152604090205460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff841660011415612c0757339350612c2a565b73ffffffffffffffffffffffffffffffffffffffff841660021415612c2a573093505b6000806000612c3c8560000151613900565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80841690831610600080612c6e8c8688876142fb565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b85612c948f6143a4565b60000373ffffffffffffffffffffffffffffffffffffffff8e1615612cb9578d612cdf565b87612cd85773fffd8963efd1fc6a506488495d951d5263988d25612cdf565b6401000276a45b8d604051602001612cf09190615372565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612d1f9594939291906151ac565b6040805180830381600087803b158015612d3857600080fd5b505af1158015612d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d709190614bfe565b91509150600083612d85578183600003612d8b565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16612db7578b8114612db757600080fd5b5050505050505095945050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310612e3e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612e01565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612ea0576040519150601f19603f3d011682016040523d82523d6000602084013e612ea5565b606091505b5050905080610dc557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3390565b600073ffffffffffffffffffffffffffffffffffffffff841660011415612f4257339350612f65565b73ffffffffffffffffffffffffffffffffffffffff841660021415612f65573093505b6000806000612f778560000151613900565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80831690841610600080612fa98c8787876142fb565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b85612fcf8f6143a4565b73ffffffffffffffffffffffffffffffffffffffff8e1615612ff1578d613017565b876130105773fffd8963efd1fc6a506488495d951d5263988d25613017565b6401000276a45b8d6040516020016130289190615372565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016130579594939291906151ac565b6040805180830381600087803b15801561307057600080fd5b505af1158015613084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a89190614bfe565b91509150826130b757816130b9565b805b6000039c9b505050505050505050505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561312d57600080fd5b505afa158015613141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316591906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b815260040161319f929190615150565b60206040518083038186803b1580156131b757600080fd5b505afa1580156131cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ef91906148a6565b73ffffffffffffffffffffffffffffffffffffffff161415613317578873ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561325157600080fd5b505afa158015613265573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328991906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b81526004016132c3929190615150565b602060405180830381600087803b1580156132dd57600080fd5b505af11580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331591906148a6565b505b6000808a73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561336057600080fd5b505afa158015613374573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339891906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a439058b8b6040518363ffffffff1660e01b81526004016133d2929190615150565b60206040518083038186803b1580156133ea57600080fd5b505afa1580156133fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342291906148a6565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561346757600080fd5b505afa15801561347b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349f9190614f48565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16106134fe578082613501565b81815b909250905081158015613512575080155b1561352257879350869250613710565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8d169063ad615dec9061357b908c908790879060040161546d565b60206040518083038186803b15801561359357600080fd5b505afa1580156135a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cb9190614fbd565b9050878111613619578581101561360e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906152d1565b88945092508261370e565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8e169063ad615dec90613672908c908790899060040161546d565b60206040518083038186803b15801561368a57600080fd5b505afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190614fbd565b9050898111156136ce57fe5b87811015613708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd90615306565b94508793505b505b505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156137795750804710155b156138c2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156137e657600080fd5b505af11580156137fa573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561389057600080fd5b505af11580156138a4573d6000803e3d6000fd5b505050506040513d60208110156138ba57600080fd5b506109df9050565b73ffffffffffffffffffffffffffffffffffffffff83163014156138f0576138eb848383613f49565b6109df565b6109df8484848461411e565b4290565b6000808061390e84826143d6565b925061391b8460146144d6565b90506139288460176143d6565b91509193909250565b8051604211155b919050565b606061394c826000602b6145c6565b92915050565b805160609061394c9083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9016145c6565b60005b60018351038110156109df576000808483815181106139a557fe5b60200260200101518584600101815181106139bc57fe5b60200260200101519150915060008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1610613a04578183613a07565b82825b50905060008773ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5257600080fd5b505afa158015613a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8a91906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b8152600401613ac4929190615150565b60206040518083038186803b158015613adc57600080fd5b505afa158015613af0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1491906148a6565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b6257600080fd5b505afa158015613b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9a9190614f48565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614613bfc578284613bff565b83835b91509150613c40828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016122ad919061512f565b6040517f054d50d400000000000000000000000000000000000000000000000000000000815290965073ffffffffffffffffffffffffffffffffffffffff8f169063054d50d490613c999089908690869060040161546d565b60206040518083038186803b158015613cb157600080fd5b505afa158015613cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce99190614fbd565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614613d2d57826000613d31565b6000835b91509150600060028c51038a10613d48578a613e66565b8c73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015613d8e57600080fd5b505afa158015613da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc691906148a6565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905898e8d60020181518110613df157fe5b60200260200101516040518363ffffffff1660e01b8152600401613e16929190615150565b60206040518083038186803b158015613e2e57600080fd5b505afa158015613e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6691906148a6565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f90613ece9086908690869060248101615428565b600060405180830381600087803b158015613ee857600080fd5b505af1158015613efc573d6000803e3d6000fd5b50506001909b019a5061398a9950505050505050505050565b6000821580613f3057505081810281838281613f2d57fe5b04145b61394c57600080fd5b8082038281111561394c57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061401e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613fe1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614080576040519150601f19603f3d011682016040523d82523d6000602084013e614085565b606091505b50915091508180156140b35750805115806140b357508080602001905160208110156140b057600080fd5b50515b611e0257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b602083106141fb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016141be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461425d576040519150601f19603f3d011682016040523d82523d6000602084013e614262565b606091505b5091509150818015614290575080511580614290575080806020019051602081101561428d57600080fd5b50515b61077e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040517f1698ee8200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff861690631698ee829061435490879087908790600401615177565b60206040518083038186803b15801561436c57600080fd5b505afa158015614380573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080591906148a6565b60007f800000000000000000000000000000000000000000000000000000000000000082106143d257600080fd5b5090565b60008182601401101561444a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b81601401835110156144bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b60008182600301101561454a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b81600301835110156145bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f01101561463a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b8282840110156146ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b8183018451101561471d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b60608215801561473c57604051915060008252602082016040526147a4565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561477557805183526020928301920161475d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b803561393881615576565b60008083601f8401126147c9578182fd5b50813567ffffffffffffffff8111156147e0578182fd5b60208301915083602080830285010111156147fa57600080fd5b9250929050565b600082601f830112614811578081fd5b813561482461481f8261550a565b6154e6565b818152846020838601011115614838578283fd5b816020850160208301379081016020019190915292915050565b80516dffffffffffffffffffffffffffff8116811461393857600080fd5b803562ffffff8116811461393857600080fd5b600060208284031215614894578081fd5b813561489f81615576565b9392505050565b6000602082840312156148b7578081fd5b815161489f81615576565b600080604083850312156148d4578081fd5b82356148df81615576565b946020939093013593505050565b600080600060608486031215614901578081fd5b833561490c81615576565b925060208401359150604084013561492381615576565b809150509250925092565b600080600080600060a08688031215614945578283fd5b853561495081615576565b945060208601359350604086013561496781615576565b925060608601359150608086013561497e81615576565b809150509295509295909350565b600080600080608085870312156149a1578182fd5b84356149ac81615576565b9350602085013592506040850135915060608501356149ca81615576565b939692955090935050565b600080602083850312156149e7578182fd5b823567ffffffffffffffff8111156149fd578283fd5b614a09858286016147b8565b90969095509350505050565b60006020808385031215614a27578182fd5b825167ffffffffffffffff80821115614a3e578384fd5b818501915085601f830112614a51578384fd5b815181811115614a5d57fe5b8381029150614a6d8483016154e6565b8181528481019084860184860187018a1015614a87578788fd5b8795505b83861015614aa9578051835260019590950194918601918601614a8b565b5098975050505050505050565b600080600060408486031215614aca578081fd5b83359250602084013567ffffffffffffffff811115614ae7578182fd5b614af3868287016147b8565b9497909650939450505050565b600080600080600080600080610100898b031215614b1c578586fd5b8835614b2781615576565b97506020890135614b3781615576565b96506040890135614b4781615576565b9550606089013594506080890135935060a0890135925060c0890135915060e0890135614b7381615576565b809150509295985092959890939650565b60008060008060008060a08789031215614b9c578384fd5b8635614ba781615576565b95506020870135945060408701359350606087013567ffffffffffffffff811115614bd0578283fd5b614bdc89828a016147b8565b9094509250506080870135614bf081615576565b809150509295509295509295565b60008060408385031215614c10578182fd5b505080516020909101519092909150565b60008060008060608587031215614c36578182fd5b8435935060208501359250604085013567ffffffffffffffff80821115614c5b578384fd5b818701915087601f830112614c6e578384fd5b813581811115614c7c578485fd5b886020828501011115614c8d578485fd5b95989497505060200194505050565b600060208284031215614cad578081fd5b815167ffffffffffffffff811115614cc3578182fd5b8201601f81018413614cd3578182fd5b8051614ce161481f8261550a565b818152856020838501011115614cf5578384fd5b61080582602083016020860161554a565b600060208284031215614d17578081fd5b813567ffffffffffffffff80821115614d2e578283fd5b9083019060a08286031215614d41578283fd5b60405160a081018181108382111715614d5657fe5b604052614d62836147ad565b8152602083013582811115614d75578485fd5b614d8187828601614801565b602083015250614d93604084016147ad565b6040820152606083013560608201526080830135608082015280935050505092915050565b6000610100808385031215614dcb578182fd5b6040519081019067ffffffffffffffff82118183101715614de857fe5b81604052614df5846147ad565b8152614e03602085016147ad565b6020820152614e14604085016147ad565b6040820152614e2560608501614870565b6060820152614e36608085016147ad565b608082015260a084013560a082015260c084013560c0820152614e5b60e085016147ad565b60e0820152949350505050565b600060208284031215614e79578081fd5b813567ffffffffffffffff811115614e8f578182fd5b820160a0818503121561489f578182fd5b60006101008284031215614eb2578081fd5b50919050565b600060208284031215614ec9578081fd5b813567ffffffffffffffff80821115614ee0578283fd5b9083019060408286031215614ef3578283fd5b604051604081018181108382111715614f0857fe5b604052823582811115614f19578485fd5b614f2587828601614801565b82525060208301359250614f3883615576565b6020810192909252509392505050565b600080600060608486031215614f5c578081fd5b614f6584614852565b9250614f7360208501614852565b9150604084015163ffffffff81168114614923578182fd5b600060208284031215614f9c578081fd5b61489f82614870565b600060208284031215614fb6578081fd5b5035919050565b600060208284031215614fce578081fd5b5051919050565b60008060408385031215614fe7578182fd5b823591506020830135614ff981615576565b809150509250929050565b60008060008060808587031215615019578182fd5b84359350602085013561502b81615576565b92506040850135915060608501356149ca81615576565b600080600060608486031215615056578081fd5b8335925060208401359150604084013561492381615576565b6000815180845261508781602086016020860161554a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff938416815291909216602082015262ffffff909116604082015260600190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526151f360a083018461506f565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561526f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261525d85835161506f565b94509285019290850190600101615223565b5092979650505050505050565b901515815260200190565b60006020825261489f602083018461506f565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b6020808252818101527f417065526f757465723a20494e53554646494349454e545f425f414d4f554e54604082015260600190565b6020808252818101527f417065526f757465723a20494e53554646494349454e545f415f414d4f554e54604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b60006020825282516040602084015261538e606084018261506f565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b90815260200190565b83815260406020808301829052908201839052600090849060608401835b8681101561541c5783356153f481615576565b73ffffffffffffffffffffffffffffffffffffffff16825292820192908201906001016153e1565b50979650505050505050565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152615463608083018461506f565b9695505050505050565b9283526020830191909152604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126154b7578283fd5b83018035915067ffffffffffffffff8211156154d1578283fd5b6020019150368190038213156147fa57600080fd5b60405181810167ffffffffffffffff8111828210171561550257fe5b604052919050565b600067ffffffffffffffff82111561551e57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561556557818101518382015260200161554d565b838111156109df5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610dd457600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a164736f6c6343000706000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/dexV2AndV3.ts b/src/dexV2AndV3.ts index 1afde5c..1ad639b 100644 --- a/src/dexV2AndV3.ts +++ b/src/dexV2AndV3.ts @@ -1,14 +1,10 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { HardhatEthersHelpers } from 'hardhat/types' import { ether } from './utils' -import SwapRouter02Build from './artifacts-apeswap/dex/contracts/SwapRouter02.json' - +import ApeSwapMultiSwapRouterBuild from './artifacts-apeswap/dex/contracts/ApeSwapMultiSwapRouter.json' // Import Contract Types -import { - SwapRouter02__factory, - WNative, -} from '../typechain-types' +import { ApeSwapMultiSwapRouter__factory, WNative } from '../typechain-types' import { deployMockDex as deployMockDexV2, addLiquidity } from './dex' import { deployMockDex as deployMockDexV3 } from './dexV3' @@ -29,9 +25,9 @@ export async function deployDexesAndRouter( numPairs = 2, mockWBNBoverwrite: WNative | null = null ) { - const SwapRouter = (await ethers.getContractFactoryFromArtifact( - SwapRouter02Build - )) as SwapRouter02__factory + const ApeSwapMultiSwapRouter = (await ethers.getContractFactoryFromArtifact( + ApeSwapMultiSwapRouterBuild + )) as ApeSwapMultiSwapRouter__factory const DEXV3 = await deployMockDexV3( ethers, @@ -55,10 +51,8 @@ export async function deployDexesAndRouter( [owner, alice] ) - const router = await SwapRouter.deploy( - DEXV3.dexFactory.address, - DEXV2.dexFactory.address, - DEXV3.positionManager.address, + const router = await ApeSwapMultiSwapRouter.deploy( + [DEXV3.dexFactory.address, DEXV2.dexRouter.address], DEXV3.mockWBNB.address ) return {