diff --git a/contracts/core/DataTypes.sol b/contracts/core/DataTypes.sol index 969f3f5..69c8792 100644 --- a/contracts/core/DataTypes.sol +++ b/contracts/core/DataTypes.sol @@ -31,7 +31,7 @@ library DataTypes { uint256 expirationBlock; bytes32 pixTarget; uint80 amount; - address token; + ERC20 token; address buyerAddress; address seller; } diff --git a/contracts/core/EventAndErrors.sol b/contracts/core/EventAndErrors.sol index b70a468..9fc61a3 100644 --- a/contracts/core/EventAndErrors.sol +++ b/contracts/core/EventAndErrors.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.19; +import { ERC20 } from "contracts/lib/tokens/ERC20.sol"; + // prettier-ignore interface EventAndErrors { /// ███ Events ████████████████████████████████████████████████████████████ @@ -9,19 +11,19 @@ interface EventAndErrors { event DepositAdded( address indexed seller, // uint256 depositID, - address token, + ERC20 token, uint256 amount ); /// @dev 0xca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49 event ValidSet( address indexed seller, - address token, + ERC20 token, bool state ); /// @dev 0x2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e event DepositWithdrawn( address indexed seller, - address token, + ERC20 token, uint256 amount ); /// @dev 0x8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65 diff --git a/contracts/core/OwnerSettings.sol b/contracts/core/OwnerSettings.sol index 67e4a5c..2e2879a 100644 --- a/contracts/core/OwnerSettings.sol +++ b/contracts/core/OwnerSettings.sol @@ -31,7 +31,7 @@ abstract contract OwnerSettings is uint256 defaultBlocks, address[] memory validSigners, address _reputation, - address[] memory tokens, + ERC20[] memory tokens, bool[] memory tokenStates ) { setDefaultLockBlocks(defaultBlocks); @@ -133,7 +133,7 @@ abstract contract OwnerSettings is } function tokenSettings( - address[] memory _tokens, + ERC20[] memory _tokens, bool[] memory _states ) public onlyOwner { /* Yul Impl */ diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index 060b947..bb47baf 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -39,7 +39,7 @@ contract P2PIX is BaseUtils { uint256 defaultBlocks, address[] memory validSigners, address _reputation, - address[] memory tokens, + ERC20[] memory tokens, bool[] memory tokenStates ) OwnerSettings( @@ -98,7 +98,7 @@ contract P2PIX is BaseUtils { clearReentrancyGuard(); - emit DepositAdded(msg.sender, address(args.token), args.amount); + emit DepositAdded(msg.sender, args.token, args.amount); } /// @notice Enables seller to invalidate future @@ -117,7 +117,7 @@ contract P2PIX is BaseUtils { _setValidState(msg.sender, token, _sellerBalance); - emit ValidSet(msg.sender, address(token), state); + emit ValidSet(msg.sender, token, state); } else revert NotInitialized(); } @@ -184,7 +184,7 @@ contract P2PIX is BaseUtils { (block.number + defaultLockBlocks), _pixTarget, args.amount, - address(args.token), + args.token, sender, args.seller ); @@ -270,12 +270,12 @@ contract P2PIX is BaseUtils { _notExpired(l); uint256 _sellerBalance = - __sellerBalance(l.seller, ERC20(l.token)) & BITMASK_SB_ENTRY; + __sellerBalance(l.seller, l.token) & BITMASK_SB_ENTRY; if ((_sellerBalance + l.amount) > MAXBALANCE_UPPERBOUND) revert MaxBalExceeded(); - _addSellerBalance(l.seller, ERC20(l.token), l.amount); + _addSellerBalance(l.seller, l.token, l.amount); l.amount = 0; @@ -336,7 +336,7 @@ contract P2PIX is BaseUtils { emit DepositWithdrawn( msg.sender, - address(token), + token, amount ); } diff --git a/src/types/factories/core/BaseUtils__factory.ts b/src/types/factories/core/BaseUtils__factory.ts index ba43701..b3d328d 100644 --- a/src/types/factories/core/BaseUtils__factory.ts +++ b/src/types/factories/core/BaseUtils__factory.ts @@ -142,7 +142,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -167,7 +167,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -369,7 +369,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -622,7 +622,7 @@ const _abi = [ { inputs: [ { - internalType: "address[]", + internalType: "contract ERC20[]", name: "_tokens", type: "address[]", }, diff --git a/src/types/factories/core/EventAndErrors__factory.ts b/src/types/factories/core/EventAndErrors__factory.ts index ec7d5d2..9bbf325 100644 --- a/src/types/factories/core/EventAndErrors__factory.ts +++ b/src/types/factories/core/EventAndErrors__factory.ts @@ -135,7 +135,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -160,7 +160,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -343,7 +343,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, diff --git a/src/types/factories/core/OwnerSettings__factory.ts b/src/types/factories/core/OwnerSettings__factory.ts index c009df8..d737d6e 100644 --- a/src/types/factories/core/OwnerSettings__factory.ts +++ b/src/types/factories/core/OwnerSettings__factory.ts @@ -140,7 +140,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -165,7 +165,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -367,7 +367,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -563,7 +563,7 @@ const _abi = [ { inputs: [ { - internalType: "address[]", + internalType: "contract ERC20[]", name: "_tokens", type: "address[]", }, diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index 53e8459..690f8f4 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -32,7 +32,7 @@ const _abi = [ type: "address", }, { - internalType: "address[]", + internalType: "contract ERC20[]", name: "tokens", type: "address[]", }, @@ -180,7 +180,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -205,7 +205,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -407,7 +407,7 @@ const _abi = [ }, { indexed: false, - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -816,7 +816,7 @@ const _abi = [ type: "uint80", }, { - internalType: "address", + internalType: "contract ERC20", name: "token", type: "address", }, @@ -1018,7 +1018,7 @@ const _abi = [ { inputs: [ { - internalType: "address[]", + internalType: "contract ERC20[]", name: "_tokens", type: "address[]", }, @@ -1140,7 +1140,7 @@ const _abi = [ ]; const _bytecode = - "0x608060405262002d0f80380380620000178162000126565b928339810160a0828203126200010b5781516020808401519093916001600160401b03918281116200010b5784620000519185016200017f565b9062000060604085016200016a565b9260608501518181116200010b57866200007c9187016200017f565b9460808101519182116200010b57019480601f870112156200010b578551620000af620000a98262000152565b62000126565b96888089848152019260051b8201019283116200010b578801905b828210620000f157505050620000e19550620001e6565b6040516128cd9081620004428239f35b815180151581036200010b578152908801908801620000ca565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200014c57604052565b62000110565b6001600160401b0381116200014c5760051b60200190565b51906001600160a01b03821682036200010b57565b9080601f830112156200010b578151906200019e620000a98362000152565b9182938184526020808095019260051b8201019283116200010b578301905b828210620001cc575050505090565b838091620001da846200016a565b815201910190620001bd565b600080546001600160a01b031916339081178255929695949392817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3816003556040519182527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208093a18651878301979060051b810183013d1515895b811562000306575b5050506040519280840191818552518092526040840198925b828110620002e85750505050907f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d782620002d593620002db97980390a16001600160a01b031662000337565b62000390565b620002e66001600455565b565b83516001600160a01b03168a52988101989281019260010162000289565b9085826001829697989451600c1b550190838210156200032c5791509493929462000268565b509493929462000270565b6000546001600160a01b0390811633036200037f57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1565b6040516282b42960e81b8152600490fd5b60008054919290916001600160a01b031633036200037f5782519182156200043457815183036200042757602092919284818080970195019360051b0101925b838103620003df575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003d0565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d57806337c49d9c146102185780633c16f0c414610213578063461f3120146101c857806349ef84481461020e5780634b2ae98014610209578063572b6c0514610204578063574983c8146101ff5780635fd8c710146101fa57806369cc6af4146101f55780636d82d9e0146101f05780637f94f65d146101eb57806380e1d302146101e657806384ab1d28146101e15780638da5cb5b146101dc5780638db564c2146101d7578063918dff57146101d25780639872dbfe146101cd57806398a26871146101c8578063ad8f2eed146101c3578063b0983d39146101be578063c52164c6146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119f5565b611985565b61193e565b611827565b611814565b611765565b61161d565b6115d8565b6115a4565b611560565b610fac565b611542565b6114bd565b61147c565b611448565b611412565b6113ff565b6113ae565b6112bd565b611287565b611204565b6111a0565b611150565b611126565b61108f565b610f82565b610c5b565b610bbd565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b3d565b9050156107e157604081016105d56105d16105bd83611b8e565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b8e565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b98565b6bffffffffffffffffffffffff1690565b90611be0565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611bfc565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b3d565b36916118d9565b611b07565b9301611bf2565b906106c785611b8e565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b8e565b6107036106248a611b98565b9030903390611c37565b6107176001600455565b611b8e565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b98565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107879033612291565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611bfc565b6108376108316080830183611d29565b906120ae565b61084081611b8e565b9061085b6105d1602083019361085585611b8e565b9061261a565b610b935761087a61086b82611b8e565b61087484611b8e565b906125e0565b916040928383019161089d61088e84611d7d565b69ffffffffffffffffffff1690565b8210610b6a57600554600101936108b385600555565b60016108c9866000526006602052604060002090565b0154431115610b41576108da611eb6565b90926109ad6108fa6108eb85611b8e565b6108f484611b8e565b90612657565b61097461091e61071c61091861091260035443611be0565b9b611d7d565b95611b8e565b61092787611b8e565b926109306102dc565b9a8c8c5260208c01528c8b015261095760608b0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808a0152565b73ffffffffffffffffffffffffffffffffffffffff861660a089015273ffffffffffffffffffffffffffffffffffffffff1660c0880152565b60608301916109bc8385611d29565b159050610a26575050610a22969492826109eb6109ff6109e3610a0595610a0a9997611d29565b929093611b8e565b6374dfee70600c5260005260206000205490565b91611db1565b612356565b610a146001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a56855169ffffffffffffffffffff1690565b1611610a7257505050610a229391610a6d91612356565b610a0a565b15610a87575050610a229391610a6d91612356565b610ab8610ab3610aa433600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e3f565b81610ad6610ad0855169ffffffffffffffffffff1690565b92611d94565b911611918215610b1e575b5050610af557610a229391610a6d91612356565b600484517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ae1565b600486517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600485517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b346102625760031960208136011261026257600490813567ffffffffffffffff811161026257606081840192823603011261026257610c98611bfc565b813591610caf836000526006602052604060002090565b600381019283549269ffffffffffffffffffff8416948515610f5957600184019182544311610f30579260008593610dd3610dda94610dab610da47f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89d9e996044888f610d99610e479f6002015491610d6d6040519384926024602085019701359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b519020980190611b3d565b9087611f2b565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b610de2611eb6565b905015610e63575b01610e2d84610e0d835473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff809660501c16612021565b5473ffffffffffffffffffffffffffffffffffffffff1690565b6040805195865260208601939093521692a26100196001600455565b818101610e8761071c825473ffffffffffffffffffffffffffffffffffffffff1690565b3314610f0d57610f06610efe610eee610ee8697fffffffffffffffffff8960011c1694610ec133600c1b6000526007602052604060002090565b610ecc878254611be0565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611be0565b9055610dea565b50610f2533600c1b6000526007602052604060002090565b610f06868254611be0565b886040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b876040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576020610fa46004356109eb81610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610fed575050505090565b835185529381019392810192600101610fdf565b9061101490604083526040830190610fcd565b81810360209283015282518082529082019282019160009190825b82811061103e57505050505090565b909192939485516004808210156110635750815282019482019392919060010161102f565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff81116102625736602382011215610262578060040135906110cd826102fc565b916110db6040519384610296565b80835260248484019160051b8301019136831161026257602401905b828210611117576111078461270c565b90610a2260405192839283611001565b813581529084019084016110f7565b3461026257602060031936011261026257602060043561114581610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff60043561118281610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b34610262576000806003193601126112845773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115611277576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b346102625760206003193601126102625760206112a96004356105bd81610314565b6040519015158152f35b8015150361026257565b34610262576040600319360112610262576004356112da81610314565b6024356112e6816112b3565b61130682339060205263739094b1600c5260005260016034600c20015490565b8015611384578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356113ce81610314565b60243590612291565b6003196040910112610262576004356113ef81610314565b906024356113fc81610314565b90565b346102625760206112a9610855366113d7565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106114ad5750506000910152565b818101518382015260200161149d565b34610262576114ce6108f4366113d7565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040938585526020865261153984518092816060880152608087019061149a565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610fa46108f4366113d7565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff811161026257610831610019913690600401611573565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b9060206113fc928181520190610fcd565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761164e903690600401610332565b6024359061165b82610314565b60009181519161166a836126a9565b935b8381106116815760405180610a22878261160c565b806116ae8473ffffffffffffffffffffffffffffffffffffffff6116a7600195876126f8565b51166125e0565b6116b882886126f8565b520161166c565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116ed91600401610332565b92602435908111610262578160238201121561026257806004013591611712836102fc565b926117206040519485610296565b80845260209260248486019260051b82010192831161026257602401905b82821061174c575050505090565b838091833561175a816112b3565b81520191019061173e565b3461026257611773366116bf565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d57825190811561181257805182036118055790602084818080970194019260051b0101915b8281036117c3578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a3019101906117b8565b63ff633a3883526004601cfd5bfe5b34610262576020610fa4610874366113d7565b3461026257611835366116bf565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118cc57805182036118055790602084818080970194019260051b0101915b828103611885578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a30191019061187a565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d7576040519161192160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610fa46106b160209236906024816004013591016118d9565b34610262576020600319360112610262576004356119a281610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461026257606060031936011261026257600435611a1281610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a6b611a5d611aef933690600401611573565b90611a66611bfc565b6120ae565b611a75843361261a565b611af9575b611ab33385836b3fffffffffffffffffffffff611aad83339060205263739094b1600c5260005260016034600c20015490565b166125a4565b611abe813386612021565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611b0284611c90565b611a7a565b604051611b3160208281611b24818301968781519384920161149a565b8101038084520182610296565b51602010611812575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356113fc81610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908201809211611bed57565b611bb1565b356113fc816112b3565b600260045414611c0d576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c82576000606052604052565b637939f4246000526004601cfd5b611cb081339060205263739094b1600c5260005260016034600c20015490565b8015611384576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bed57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611e03575b505003611dd957565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e34579290611e0d565b509150503880611dd0565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d75760209260009260405251906002545afa906000519115611ea857565b63e10bf1cc6000526004601cfd5b611ebe611ee4565b90600073ffffffffffffffffffffffffffffffffffffffff831633146113fc5750600190565b33600052600160205260ff60406000205416600014611f27577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b9190918054611ff75760809160209182526000928380927b19457468657265756d205369676e6564204d6573736167653a0a333282526040603c600420978151988282813784520135821a855260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1606051109114165afa508051903d15611fea576060526040829052600c1b5415611fc25750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561205d57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156120a95760051b0190565b61206a565b6000905b8282106120cf5750106120c157565b63dfb035c96000526004601cfd5b906120ef6120de828585612099565b356000526006602052604060002090565b906120f9826122e0565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061218969ffffffffffffffffffff6b3fffffffffffffffffffffff61217f8b889060205263739094b1600c5260005260016034600c20015490565b1694168094611be0565b1161078d576121df7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da594610dab60049460019a612255979060205263739094b1600c5260005260016034600c2001908154019055565b01612201610ee8825473ffffffffffffffffffffffffffffffffffffffff1690565b61221f612218826000526007602052604060002090565b5460011c90565b68056bc75e2d6310000081116122765750612247610e2d916000526007602052604060002090565b68056bc75e2d631000009055565b91612261848888612099565b60405190358152921691602090a201906120b2565b9061228b906000526007602052604060002090565b55610e2d565b3381036122d2576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b6001810154431061232c576003015469ffffffffffffffffffff161561230257565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b908051600052600660205260406000209080518255602081015160018301556040810151600283015560038201906060810192835161239e9069ffffffffffffffffffff1690565b83547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff821617845594608083015173ffffffffffffffffffffffffffffffffffffffff1684547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff00000000000000000000161790945560a0830191825161245f9073ffffffffffffffffffffffffffffffffffffffff1690565b60048201906124a8919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60c084019687516124cc9073ffffffffffffffffffffffffffffffffffffffff1690565b60059290920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905573ffffffffffffffffffffffffffffffffffffffff8096169069ffffffffffffffffffff1661253e936125a4565b519051935192516040805173ffffffffffffffffffffffffffffffffffffffff958616815269ffffffffffffffffffff909216602083015292909116909216917fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d9190a3565b9291909280848103119015176125d25760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d156125ee575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d15612628575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d15612665575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b906126b3826102fc565b6126c06040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06126ee82946102fc565b0190602036910137565b80518210156120a95760209160051b010190565b908151156128845760009182815190612724826126a9565b9261272e836126a9565b955b83811061273f57505050509190565b61278061071c600561276561275485876126f8565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b6127b25780612791600192846126f8565b5161279c82886126f8565b52836127a8828a6126f8565b5201925b92612730565b69ffffffffffffffffffff6127e060036127cf61275485876126f8565b015469ffffffffffffffffffff1690565b1661281857806127f2600192846126f8565b516127fd82886126f8565b5261281161280b828a6126f8565b60039052565b01926127ac565b6001908161282961275483866126f8565b015443111561285b5761283c81846126f8565b5161284782886126f8565b52612811612855828a6126f8565b60029052565b61286581846126f8565b5161287082886126f8565b5261281161287e828a6126f8565b60019052565b905061288e612680565b906113fc61268056fea2646970667358221220fbe2aa37499ce72f43532a77b1f65f05bb59ef8ed0f66a49343d3330c97e309b64736f6c63430008130033"; + "0x608060405262002eac8038038062000017816200012b565b928339810160a082820312620000f45781516020808401516001600160401b03949293929190858111620000f45782019083601f83011215620000f4578151916200006c620000668462000157565b6200012b565b92828085838152019160051b83010191868311620000f4578301905b828210620000f95750505050620000a26040830162000181565b916060810151868111620000f45784620000be91830162000190565b936080820151968711620000f457620000e496620000dd9201620001f9565b9362000260565b6040516129f29081620004ba8239f35b600080fd5b838091835162000109816200016f565b81520191019062000088565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200015157604052565b62000115565b6001600160401b038111620001515760051b60200190565b6001600160a01b03811603620000f457565b51906200018e826200016f565b565b9080601f83011215620000f457815190620001af620000668362000157565b9182938184526020808095019260051b820101928311620000f4578301905b828210620001dd575050505090565b8380918351620001ed816200016f565b815201910190620001ce565b9080601f83011215620000f45781519062000218620000668362000157565b9182938184526020808095019260051b820101928311620000f4578301905b82821062000246575050505090565b81518015158103620000f457815290830190830162000237565b600080546001600160a01b031916339081178255929695949392817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3816003556040519182527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208093a18651878301979060051b810183013d1515895b81156200037e575b5050506040519280840191818552518092526040840198925b828110620003605750505050907f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7826200034f936200035597980390a16001600160a01b0316620003af565b62000408565b6200018e6001600455565b83516001600160a01b03168a52988101989281019260010162000303565b9085826001829697989451600c1b55019083821015620003a457915094939294620002e2565b5094939294620002ea565b6000546001600160a01b039081163303620003f757816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1565b6040516282b42960e81b8152600490fd5b60008054919290916001600160a01b03163303620003f7578251918215620004ac57815183036200049f57602092919284818080970195019360051b0101925b83810362000457575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a30192019162000448565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d57806337c49d9c146102185780633c16f0c414610213578063461f3120146101c857806349ef84481461020e5780634b2ae98014610209578063572b6c0514610204578063574983c8146101ff5780635fd8c710146101fa57806369cc6af4146101f55780636d82d9e0146101f05780637f94f65d146101eb57806380e1d302146101e657806384ab1d28146101e15780638da5cb5b146101dc5780638db564c2146101d7578063918dff57146101d25780639872dbfe146101cd57806398a26871146101c8578063ad8f2eed146101c3578063b0983d39146101be578063c52164c6146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119ed565b61197d565b611936565b611825565b611812565b6116f9565b6115ef565b6115aa565b611576565b611532565b610f80565b611514565b61148f565b61144e565b61141a565b6113e4565b6113d1565b611380565b61128f565b611259565b6111d8565b611174565b611124565b6110fa565b611063565b610f56565b610c16565b610b78565b6107ef565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611bda565b9050156107c55760408101906105d66105d26105be84611c2b565b63cbc9d1c4600c526000526020600c205490565b1590565b61079b576b3fffffffffffffffffffffff61060f6105f384611c2b565b339060205263739094b1600c5260005260016034600c20015490565b169161063c606083019361063661062586611c35565b6bffffffffffffffffffffffff1690565b90611c90565b6a52b7d2dcc80cd2e400000081116107715761071961075c926106e87f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9561071f94610686611ca7565b602082013580610761575b506106ba60806106b36106ae6106a78680611bda565b36916118d1565b611aed565b9301611c9d565b906106c485611c2b565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070a6106f482611c2b565b61070061062589611c35565b9030903390611ce2565b6107146001600455565b611c2b565b93611c35565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b61076b903361233c565b38610691565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b34610262576107fd36610559565b610805611ca7565b61081b6108156080830183611dd4565b90612159565b61082481611c2b565b61083e6105d2602084019261083884611c2b565b9061273f565b610b4e5761085d61084e83611c2b565b61085783611c2b565b90612705565b6040918284019061087f61087083611e28565b69ffffffffffffffffffff1690565b8310610b2557610890600554611c7d565b9460016108a7876000526006602052604060002090565b0154431115610afc576108b8611f61565b6108d66108c784959395611c2b565b6108d084611c2b565b9061277c565b9060608401906108e68286611dd4565b159050610a035750936109a78461098a6109ff9b98956109c49561093b866109156109e69e9c6109e19c611dd4565b61093561092189611c2b565b6374dfee70600c5260005260206000205490565b91611e5c565b61096261095c61095661095060035443611c90565b9a611e28565b93611c2b565b94611c2b565b9761096b6102dc565b9b8c5260208c01528c8b015269ffffffffffffffffffff1660608a0152565b73ffffffffffffffffffffffffffffffffffffffff166080880152565b73ffffffffffffffffffffffffffffffffffffffff1660a0860152565b73ffffffffffffffffffffffffffffffffffffffff1660c0840152565b61242e565b906109f16001600455565b519081529081906020820190565b0390f35b69ffffffffffffffffffff915068056bc75e2d6310000082610a2489611e28565b16119081610af3575b50610a52575b506109e695936109a76109e19461098a6109ff9b98956109c49561093b565b610a83610a7e610a6f33600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611eea565b81610a96610a9089611e28565b92611e3f565b911611908115610ad5575b50610aac5738610a33565b600487517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150610aeb87611e28565b161138610aa1565b90501538610a2d565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b346102625760031960208136011261026257600490813567ffffffffffffffff811161026257606081840192823603011261026257610c53611ca7565b813591610c6a836000526006602052604060002090565b600381019283549269ffffffffffffffffffff8416948515610f2d57600184019182544311610f04579260008593610d8e610d9594610d66610d5f7f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89d9e996044888f610d54610e029f6002015491610d286040519384926024602085019701359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b519020980190611bda565b9087611fd6565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b610d9d611f61565b905015610e1e575b01610de884610dc8835473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff809660501c166120cc565b5473ffffffffffffffffffffffffffffffffffffffff1690565b6040805195865260208601939093521692a26100196001600455565b818101610e5b610e42825473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3314610ee157610eda610ed2610ec2610ebc697fffffffffffffffffff8960011c1694610e9533600c1b6000526007602052604060002090565b610ea0878254611c90565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611c90565b9055610da5565b50610ef933600c1b6000526007602052604060002090565b610eda868254611c90565b886040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b876040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576020610f7860043561092181610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610fc1575050505090565b835185529381019392810192600101610fb3565b90610fe890604083526040830190610fa1565b81810360209283015282518082529082019282019160009190825b82811061101257505050505090565b9091929394855160048082101561103757508152820194820193929190600101611003565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff81116102625736602382011215610262578060040135906110a1826102fc565b916110af6040519384610296565b80835260248484019160051b8301019136831161026257602401905b8282106110eb576110db84612831565b906109ff60405192839283610fd5565b813581529084019084016110cb565b3461026257602060031936011261026257602060043561111981610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff60043561115681610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b34610262576000806003193601126112565773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af1156112495760407feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d918151903382526020820152a180f35b63b12d13eb82526004601cfd5b80fd5b3461026257602060031936011261026257602061127b6004356105be81610314565b6040519015158152f35b8015150361026257565b34610262576040600319360112610262576004356112ac81610314565b6024356112b881611285565b6112d882339060205263739094b1600c5260005260016034600c20015490565b8015611356578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356113a081610314565b6024359061233c565b6003196040910112610262576004356113c181610314565b906024356113ce81610314565b90565b3461026257602061127b610838366113a9565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b83811061147f5750506000910152565b818101518382015260200161146f565b34610262576114a06108d0366113a9565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040938585526020865261150b84518092816060880152608087019061146c565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610f786108d0366113a9565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff811161026257610815610019913690600401611545565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b9060206113ce928181520190610fa1565b346102625760406003193601126102625760043567ffffffffffffffff811161026257611620903690600401610332565b6024359061162d82610314565b60009181519161163c836127ce565b935b83811061165357604051806109ff87826115de565b806116808473ffffffffffffffffffffffffffffffffffffffff6116796001958761281d565b5116612705565b61168a828861281d565b520161163e565b81601f82011215610262578035916116a8836102fc565b926116b66040519485610296565b808452602092838086019260051b820101928311610262578301905b8282106116e0575050505090565b83809183356116ee81611285565b8152019101906116d2565b34610262576040806003193601126102625767ffffffffffffffff906004358281116102625761172d903690600401610332565b9160243590811161026257611746903690600401611691565b9060009173ffffffffffffffffffffffffffffffffffffffff83541633036117e95783519182156117e757815183036117da57602092919285818080980195019360051b0101925b838103611799578480f35b85809160018252805187528451808589205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928980a30192019161178e565b63ff633a3884526004601cfd5bfe5b600482517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020610f78610857366113a9565b346102625760406003193601126102625767ffffffffffffffff6004358181116102625736602382011215610262578060040135611862816102fc565b916118706040519384610296565b81835260209160248385019160051b8301019136831161026257602401905b8282106118b85760243585878211610262576118b2610019923690600401611691565b90611b23565b83809183356118c681610314565b81520191019061188f565b92919267ffffffffffffffff82116102d7576040519161191960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610f786106ae60209236906024816004013591016118d1565b346102625760206003193601126102625760043561199a81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461026257606060031936011261026257600435611a0a81610314565b60243560443567ffffffffffffffff811161026257611a30611a3e913690600401611545565b90611a39611ca7565b612159565b611a48823361273f565b611adf575b611a863383836b3fffffffffffffffffffffff611a8083339060205263739094b1600c5260005260016034600c20015490565b166126c9565b611a918133846120cc565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e60403392a26001600455005b611ae882611d3b565b611a4d565b604051611b1760208281611b0a818301968781519384920161146c565b8101038084520182610296565b516020106117e7575190565b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361049d578251918215611bcd5781518303611bc057602092919284818080970195019360051b0101925b838103611b79575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611b6b565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356113ce81610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611c8b57565b611c4e565b91908201809211611c8b57565b356113ce81611285565b600260045414611cb8576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611d2d576000606052604052565b637939f4246000526004601cfd5b611d5b81339060205263739094b1600c5260005260016034600c20015490565b8015611356576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611c8b57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611eae575b505003611e8457565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611edf579290611eb8565b509150503880611e7b565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d75760209260009260405251906002545afa906000519115611f5357565b63e10bf1cc6000526004601cfd5b611f69611f8f565b90600073ffffffffffffffffffffffffffffffffffffffff831633146113ce5750600190565b33600052600160205260ff60406000205416600014611fd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b91909180546120a25760809160209182526000928380927b19457468657265756d205369676e6564204d6573736167653a0a333282526040603c600420978151988282813784520135821a855260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1606051109114165afa508051903d15612095576060526040829052600c1b541561206d5750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561210857603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156121545760051b0190565b612115565b6000905b82821061217a57501061216c57565b63dfb035c96000526004601cfd5b9061219a612189828585612144565b356000526006602052604060002090565b906121a48261238b565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061223469ffffffffffffffffffff6b3fffffffffffffffffffffff61222a8b889060205263739094b1600c5260005260016034600c20015490565b1694168094611c90565b116107715761228a7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da594610d6660049460019a612300979060205263739094b1600c5260005260016034600c2001908154019055565b016122ac610ebc825473ffffffffffffffffffffffffffffffffffffffff1690565b6122ca6122c3826000526007602052604060002090565b5460011c90565b68056bc75e2d63100000811161232157506122f2610de8916000526007602052604060002090565b68056bc75e2d631000009055565b9161230c848888612144565b60405190358152921691602090a2019061215d565b90612336906000526007602052604060002090565b55610de8565b33810361237d576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b600181015443106123d7576003015469ffffffffffffffffffff16156123ad57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611c8b5760010190565b612579907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d73ffffffffffffffffffffffffffffffffffffffff61265b9594805160005260066020526126c461268761267660406000209380518555602081015160018601556040810151600286015561262a600560038701606084019a69ffffffffffffffffffff8c511690817fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000845416178355612556612507608088015173ffffffffffffffffffffffffffffffffffffffff1690565b84547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909455565b6125bd60a087019e8f5173ffffffffffffffffffffffffffffffffffffffff1690565b60048c019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61262560c087019a6125e38c5173ffffffffffffffffffffffffffffffffffffffff1690565b950180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716179055565b6126c9565b61263d612638600554612401565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126f75760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612713575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d1561274d575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d1561278a575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b906127d8826102fc565b6127e56040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061281382946102fc565b0190602036910137565b80518210156121545760209160051b010190565b908151156129a95760009182815190612849826127ce565b92612853836127ce565b955b83811061286457505050509190565b6128a5610e42600561288a612879858761281d565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b6128d757806128b66001928461281d565b516128c1828861281d565b52836128cd828a61281d565b5201925b92612855565b69ffffffffffffffffffff61290560036128f4612879858761281d565b015469ffffffffffffffffffff1690565b1661293d57806129176001928461281d565b51612922828861281d565b52612936612930828a61281d565b60039052565b01926128d1565b6001908161294e612879838661281d565b015443111561298057612961818461281d565b5161296c828861281d565b5261293661297a828a61281d565b60029052565b61298a818461281d565b51612995828861281d565b526129366129a3828a61281d565b60019052565b90506129b36127a5565b906113ce6127a556fea2646970667358221220b1b4c6a6079b408aa470c257f4446c0a88c7daeb9258057b5f3426e2e2e4e3c064736f6c63430008130033"; type P2PIXConstructorParams = | [signer?: Signer]