From 8ebef3aaf145eb28fcbc2c6bfc890b00539a98a7 Mon Sep 17 00:00:00 2001 From: PedroCailleret Date: Sun, 14 May 2023 21:26:08 -0300 Subject: [PATCH] Optimized SafeTransferLib (Solady) --- .../SafeTransferLib.dbg.json | 2 +- .../SafeTransferLib.sol/SafeTransferLib.json | 18 +- artifacts/contracts/p2pix.sol/P2PIX.dbg.json | 2 +- artifacts/contracts/p2pix.sol/P2PIX.json | 4 +- contracts/lib/utils/SafeTransferLib.sol | 160 ++++++++++-------- .../lib/utils/SafeTransferLib__factory.ts | 78 +++++++++ src/types/factories/lib/utils/index.ts | 1 + .../factories/p2pix.sol/P2PIX__factory.ts | 2 +- src/types/hardhat.d.ts | 9 + src/types/index.ts | 2 + src/types/lib/utils/SafeTransferLib.ts | 56 ++++++ src/types/lib/utils/index.ts | 1 + 12 files changed, 262 insertions(+), 73 deletions(-) create mode 100644 src/types/factories/lib/utils/SafeTransferLib__factory.ts create mode 100644 src/types/lib/utils/SafeTransferLib.ts diff --git a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json index 60306b4..106267e 100644 --- a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json +++ b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/e4fd58ee172659ae7bbfbfbb00ad761b.json" + "buildInfo": "../../../../build-info/cf6d26ad613ca851d9115e4f052bd17c.json" } diff --git a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.json b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.json index e11ceea..7c87973 100644 --- a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.json +++ b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.json @@ -2,7 +2,23 @@ "_format": "hh-sol-artifact-1", "contractName": "SafeTransferLib", "sourceName": "contracts/lib/utils/SafeTransferLib.sol", - "abi": [], + "abi": [ + { + "inputs": [], + "name": "ETHTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "TransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "TransferFromFailed", + "type": "error" + } + ], "bytecode": "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a", "linkReferences": {}, diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index a2700c1..17b095b 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/577d08e3f9a8a685ac15a7ca46572ea5.json" + "buildInfo": "../../build-info/cf6d26ad613ca851d9115e4f052bd17c.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index 9176223..1e68b3a 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -1069,8 +1069,8 @@ "type": "receive" } ], - "bytecode": "0x6080604052600180556040516200331c3803806200331c8339810160408190526200002a916200045c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b6200009882826200026f565b5050505050620005c9565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60208101815160051b81015b3d6200023c5760018251600c1b5560208201915080821062000236576200023c565b62000214565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516200012891906200057a565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620002d05763df9578836000526004601cfd5b81518114620002e75763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200034e5763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150620002f6565b505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000397576200039762000356565b604052919050565b60006001600160401b03821115620003bb57620003bb62000356565b5060051b60200190565b6001600160a01b0381168114620003db57600080fd5b50565b600082601f830112620003f057600080fd5b815160206200040962000403836200039f565b6200036c565b82815260059290921b840181019181810190868411156200042957600080fd5b8286015b84811015620004515780516200044381620003c5565b83529183019183016200042d565b509695505050505050565b600080600080600060a086880312156200047557600080fd5b8551602080880151919650906001600160401b03808211156200049757600080fd5b620004a58a838b01620003de565b965060408901519150620004b982620003c5565b606089015191955080821115620004cf57600080fd5b620004dd8a838b01620003de565b94506080890151915080821115620004f457600080fd5b508701601f810189136200050757600080fd5b80516200051862000403826200039f565b81815260059190911b8201830190838101908b8311156200053857600080fd5b928401925b82841015620005685783518015158114620005585760008081fd5b825292840192908401906200053d565b80955050505050509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015620005bd5783516001600160a01b03168352928401929184019160010162000596565b50909695505050505050565b612d4380620005d96000396000f3fe6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e366004612411565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612562565b610740565b005b34801561026157600080fd5b5061025361027036600461259f565b610832565b34801561028157600080fd5b506102536102903660046125d8565b610923565b3480156102a157600080fd5b506103196102b0366004612411565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b610397366004612411565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461264b565b610b32565b60405161022a929190612746565b3480156103e557600080fd5b506102206103f436600461259f565b600c1b90565b34801561040657600080fd5b50610253610415366004612411565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461259f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046127d5565b610f8d565b3480156104aa57600080fd5b506102206104b9366004612411565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec36600461280a565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612836565b6110f0565b34801561051d57600080fd5b5061053261052c366004612411565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b506102206105723660046128bb565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612978565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612836565b611417565b34801561063257600080fd5b5061025361064136600461299d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046129d3565b611673565b34801561069f57600080fd5b506106b36106ae366004612a26565b611ae4565b60405161022a9190612a6d565b3480156106cc57600080fd5b506102206106db366004612836565b611b96565b3480156106ec57600080fd5b506102536106fb366004612a80565b611bc7565b34801561070c57600080fd5b5061025361071b36600461259f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612b42565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612b9e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612c27565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612c27565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c61242a565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc361242a565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612c3f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612c3f565b6020026020010151828581518110610c5c57610c5c612c3f565b6020026020010181815250506000818581518110610c7c57610c7c612c3f565b60200260200101906003811115610c9557610c95612717565b90816003811115610ca857610ca8612717565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612c3f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612c3f565b6020026020010151828581518110610d1a57610d1a612c3f565b6020026020010181815250506003818581518110610c7c57610c7c612c3f565b4360056000898781518110610d5157610d51612c3f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612c3f565b6020026020010151828581518110610d9d57610d9d612c3f565b6020026020010181815250506002818581518110610c7c57610c7c612c3f565b868481518110610dcf57610dcf612c3f565b6020026020010151828581518110610de957610de9612c3f565b6020026020010181815250506001818581518110610c7c57610c7c612c3f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f8b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612c27565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612c27565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33612005565b6112f9848c8484898861205d565b6004805490600061130983612c6e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c8484898861205d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612ca7565b6121a1565b905061137f670de0b6b3a764000082612ce2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a61205d565b600480549060006113f283612c6e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612c3f565b905060200201358152602001908152602001600020905061148181612252565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612c27565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612c3f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612d1f565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612c27565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612c27565b909155506119cc9050565b8187600201546119a49190612c27565b33600c1b600090815260066020526040812080549091906119c6908490612c27565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff16836122ce565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6122ce565b611a62833360018a60020154901c6122ce565b611a76565b611a76833389600201546122ce565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b0661242a565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612c3f565b602002602001015187611b96565b905080828581518110611b7557611b75612c3f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461238d565b611e298533866122ce565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107bd565b600080600080600085875af1905080612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016107bd565b505050565b61202784848473ffffffffffffffffffffffffffffffffffffffff85166123cd565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556121358686848461238d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261219192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016121bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061224b5763e10bf1cc6000526004601cfd5b5050919050565b4381600401541115612290576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038101546122cb576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107bd565b8383850311841517156123a85763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b60008315612409578360051b8501855b803580851160051b9485526020948518526040600020930181811061240157612406565b6123dd565b50505b501492915050565b60006020828403121561242357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124a0576124a061242a565b604052919050565b600067ffffffffffffffff8211156124c2576124c261242a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122cb57600080fd5b600082601f8301126124ff57600080fd5b8135602061251461250f836124a8565b612459565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124cc565b8352918301918301612537565b509695505050505050565b60006020828403121561257457600080fd5b813567ffffffffffffffff81111561258b57600080fd5b612597848285016124ee565b949350505050565b6000602082840312156125b157600080fd5b81356125bc816124cc565b9392505050565b803580151581146125d357600080fd5b919050565b600080600080600060a086880312156125f057600080fd5b85356125fb816124cc565b945060208601356bffffffffffffffffffffffff8116811461261c57600080fd5b9350604086013561262c816124cc565b925061263a606087016125c3565b949793965091946080013592915050565b6000602080838503121561265e57600080fd5b823567ffffffffffffffff81111561267557600080fd5b8301601f8101851361268657600080fd5b803561269461250f826124a8565b81815260059190911b820183019083810190878311156126b357600080fd5b928401925b828410156126d1578335825292840192908401906126b8565b979650505050505050565b600081518084526020808501945080840160005b8381101561270c578151875295820195908201906001016126f0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061275960408301856126dc565b8281036020848101919091528451808352858201928201906000805b828110156127c757855160048082106127b4577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612775565b509198975050505050505050565b600080604083850312156127e857600080fd5b82356127f3816124cc565b9150612801602084016125c3565b90509250929050565b6000806040838503121561281d57600080fd5b8235612828816124cc565b946020939093013593505050565b6000806040838503121561284957600080fd5b8235612854816124cc565b91506020830135612864816124cc565b809150509250929050565b60008083601f84011261288157600080fd5b50813567ffffffffffffffff81111561289957600080fd5b6020830191508360208260051b85010111156128b457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156128d957600080fd5b89356128e4816124cc565b985060208a01356128f4816124cc565b975060408a0135612904816124cc565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff8082111561292f57600080fd5b61293b8d838e0161286f565b909650945060c08c013591508082111561295457600080fd5b506129618c828d0161286f565b915080935050809150509295985092959850929598565b6000806040838503121561298b57600080fd5b823591506020830135612864816124cc565b600080602083850312156129b057600080fd5b823567ffffffffffffffff8111156129c757600080fd5b610e098582860161286f565b600080600080600060a086880312156129eb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff81168114612a1857600080fd5b809150509295509295909350565b60008060408385031215612a3957600080fd5b823567ffffffffffffffff811115612a5057600080fd5b612a5c858286016124ee565b9250506020830135612864816124cc565b6020815260006125bc60208301846126dc565b60008060408385031215612a9357600080fd5b823567ffffffffffffffff80821115612aab57600080fd5b612ab7868387016124ee565b9350602091508185013581811115612ace57600080fd5b85019050601f81018613612ae157600080fd5b8035612aef61250f826124a8565b81815260059190911b82018301908381019088831115612b0e57600080fd5b928401925b82841015612b3357612b24846125c3565b82529284019290840190612b13565b80955050505050509250929050565b60008060008060608587031215612b5857600080fd5b8435612b63816124cc565b935060208501359250604085013567ffffffffffffffff811115612b8657600080fd5b612b928782880161286f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612bec57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bba565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612c3a57612c3a612bf8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ca057612ca0612bf8565b5060010190565b600082612cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d1a57612d1a612bf8565b500290565b600082821015612d3157612d31612bf8565b50039056fea164736f6c6343000809000a", - "deployedBytecode": "0x6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e366004612411565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612562565b610740565b005b34801561026157600080fd5b5061025361027036600461259f565b610832565b34801561028157600080fd5b506102536102903660046125d8565b610923565b3480156102a157600080fd5b506103196102b0366004612411565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b610397366004612411565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461264b565b610b32565b60405161022a929190612746565b3480156103e557600080fd5b506102206103f436600461259f565b600c1b90565b34801561040657600080fd5b50610253610415366004612411565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461259f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046127d5565b610f8d565b3480156104aa57600080fd5b506102206104b9366004612411565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec36600461280a565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612836565b6110f0565b34801561051d57600080fd5b5061053261052c366004612411565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b506102206105723660046128bb565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612978565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612836565b611417565b34801561063257600080fd5b5061025361064136600461299d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046129d3565b611673565b34801561069f57600080fd5b506106b36106ae366004612a26565b611ae4565b60405161022a9190612a6d565b3480156106cc57600080fd5b506102206106db366004612836565b611b96565b3480156106ec57600080fd5b506102536106fb366004612a80565b611bc7565b34801561070c57600080fd5b5061025361071b36600461259f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612b42565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612b9e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612c27565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612c27565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c61242a565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc361242a565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612c3f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612c3f565b6020026020010151828581518110610c5c57610c5c612c3f565b6020026020010181815250506000818581518110610c7c57610c7c612c3f565b60200260200101906003811115610c9557610c95612717565b90816003811115610ca857610ca8612717565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612c3f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612c3f565b6020026020010151828581518110610d1a57610d1a612c3f565b6020026020010181815250506003818581518110610c7c57610c7c612c3f565b4360056000898781518110610d5157610d51612c3f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612c3f565b6020026020010151828581518110610d9d57610d9d612c3f565b6020026020010181815250506002818581518110610c7c57610c7c612c3f565b868481518110610dcf57610dcf612c3f565b6020026020010151828581518110610de957610de9612c3f565b6020026020010181815250506001818581518110610c7c57610c7c612c3f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f8b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612c27565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612c27565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33612005565b6112f9848c8484898861205d565b6004805490600061130983612c6e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c8484898861205d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612ca7565b6121a1565b905061137f670de0b6b3a764000082612ce2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a61205d565b600480549060006113f283612c6e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612c3f565b905060200201358152602001908152602001600020905061148181612252565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612c27565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612c3f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612d1f565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612c27565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612c27565b909155506119cc9050565b8187600201546119a49190612c27565b33600c1b600090815260066020526040812080549091906119c6908490612c27565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff16836122ce565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6122ce565b611a62833360018a60020154901c6122ce565b611a76565b611a76833389600201546122ce565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b0661242a565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612c3f565b602002602001015187611b96565b905080828581518110611b7557611b75612c3f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461238d565b611e298533866122ce565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107bd565b600080600080600085875af1905080612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016107bd565b505050565b61202784848473ffffffffffffffffffffffffffffffffffffffff85166123cd565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556121358686848461238d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261219192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016121bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061224b5763e10bf1cc6000526004601cfd5b5050919050565b4381600401541115612290576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038101546122cb576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107bd565b8383850311841517156123a85763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b60008315612409578360051b8501855b803580851160051b9485526020948518526040600020930181811061240157612406565b6123dd565b50505b501492915050565b60006020828403121561242357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124a0576124a061242a565b604052919050565b600067ffffffffffffffff8211156124c2576124c261242a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122cb57600080fd5b600082601f8301126124ff57600080fd5b8135602061251461250f836124a8565b612459565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124cc565b8352918301918301612537565b509695505050505050565b60006020828403121561257457600080fd5b813567ffffffffffffffff81111561258b57600080fd5b612597848285016124ee565b949350505050565b6000602082840312156125b157600080fd5b81356125bc816124cc565b9392505050565b803580151581146125d357600080fd5b919050565b600080600080600060a086880312156125f057600080fd5b85356125fb816124cc565b945060208601356bffffffffffffffffffffffff8116811461261c57600080fd5b9350604086013561262c816124cc565b925061263a606087016125c3565b949793965091946080013592915050565b6000602080838503121561265e57600080fd5b823567ffffffffffffffff81111561267557600080fd5b8301601f8101851361268657600080fd5b803561269461250f826124a8565b81815260059190911b820183019083810190878311156126b357600080fd5b928401925b828410156126d1578335825292840192908401906126b8565b979650505050505050565b600081518084526020808501945080840160005b8381101561270c578151875295820195908201906001016126f0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061275960408301856126dc565b8281036020848101919091528451808352858201928201906000805b828110156127c757855160048082106127b4577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612775565b509198975050505050505050565b600080604083850312156127e857600080fd5b82356127f3816124cc565b9150612801602084016125c3565b90509250929050565b6000806040838503121561281d57600080fd5b8235612828816124cc565b946020939093013593505050565b6000806040838503121561284957600080fd5b8235612854816124cc565b91506020830135612864816124cc565b809150509250929050565b60008083601f84011261288157600080fd5b50813567ffffffffffffffff81111561289957600080fd5b6020830191508360208260051b85010111156128b457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156128d957600080fd5b89356128e4816124cc565b985060208a01356128f4816124cc565b975060408a0135612904816124cc565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff8082111561292f57600080fd5b61293b8d838e0161286f565b909650945060c08c013591508082111561295457600080fd5b506129618c828d0161286f565b915080935050809150509295985092959850929598565b6000806040838503121561298b57600080fd5b823591506020830135612864816124cc565b600080602083850312156129b057600080fd5b823567ffffffffffffffff8111156129c757600080fd5b610e098582860161286f565b600080600080600060a086880312156129eb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff81168114612a1857600080fd5b809150509295509295909350565b60008060408385031215612a3957600080fd5b823567ffffffffffffffff811115612a5057600080fd5b612a5c858286016124ee565b9250506020830135612864816124cc565b6020815260006125bc60208301846126dc565b60008060408385031215612a9357600080fd5b823567ffffffffffffffff80821115612aab57600080fd5b612ab7868387016124ee565b9350602091508185013581811115612ace57600080fd5b85019050601f81018613612ae157600080fd5b8035612aef61250f826124a8565b81815260059190911b82018301908381019088831115612b0e57600080fd5b928401925b82841015612b3357612b24846125c3565b82529284019290840190612b13565b80955050505050509250929050565b60008060008060608587031215612b5857600080fd5b8435612b63816124cc565b935060208501359250604085013567ffffffffffffffff811115612b8657600080fd5b612b928782880161286f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612bec57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bba565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612c3a57612c3a612bf8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ca057612ca0612bf8565b5060010190565b600082612cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d1a57612d1a612bf8565b500290565b600082821015612d3157612d31612bf8565b50039056fea164736f6c6343000809000a", + "bytecode": "0x608060405260018055604051620031ec380380620031ec8339810160408190526200002a916200045c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b6200009882826200026f565b5050505050620005c9565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60208101815160051b81015b3d6200023c5760018251600c1b5560208201915080821062000236576200023c565b62000214565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516200012891906200057a565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620002d05763df9578836000526004601cfd5b81518114620002e75763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200034e5763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150620002f6565b505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000397576200039762000356565b604052919050565b60006001600160401b03821115620003bb57620003bb62000356565b5060051b60200190565b6001600160a01b0381168114620003db57600080fd5b50565b600082601f830112620003f057600080fd5b815160206200040962000403836200039f565b6200036c565b82815260059290921b840181019181810190868411156200042957600080fd5b8286015b84811015620004515780516200044381620003c5565b83529183019183016200042d565b509695505050505050565b600080600080600060a086880312156200047557600080fd5b8551602080880151919650906001600160401b03808211156200049757600080fd5b620004a58a838b01620003de565b965060408901519150620004b982620003c5565b606089015191955080821115620004cf57600080fd5b620004dd8a838b01620003de565b94506080890151915080821115620004f457600080fd5b508701601f810189136200050757600080fd5b80516200051862000403826200039f565b81815260059190911b8201830190838101908b8311156200053857600080fd5b928401925b82841015620005685783518015158114620005585760008081fd5b825292840192908401906200053d565b80955050505050509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015620005bd5783516001600160a01b03168352928401929184019160010162000596565b50909695505050505050565b612c1380620005d96000396000f3fe6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e3660046122e1565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612432565b610740565b005b34801561026157600080fd5b5061025361027036600461246f565b610832565b34801561028157600080fd5b506102536102903660046124a8565b610923565b3480156102a157600080fd5b506103196102b03660046122e1565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b6103973660046122e1565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461251b565b610b32565b60405161022a929190612616565b3480156103e557600080fd5b506102206103f436600461246f565b600c1b90565b34801561040657600080fd5b506102536104153660046122e1565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461246f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046126a5565b610f8d565b3480156104aa57600080fd5b506102206104b93660046122e1565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec3660046126da565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612706565b6110f0565b34801561051d57600080fd5b5061053261052c3660046122e1565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b5061022061057236600461278b565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612848565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612706565b611417565b34801561063257600080fd5b5061025361064136600461286d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046128a3565b611673565b34801561069f57600080fd5b506106b36106ae3660046128f6565b611ae4565b60405161022a919061293d565b3480156106cc57600080fd5b506102206106db366004612706565b611b96565b3480156106ec57600080fd5b506102536106fb366004612950565b611bc7565b34801561070c57600080fd5b5061025361071b36600461246f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612a12565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612a6e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612af7565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612af7565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c6122fa565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc36122fa565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612b0f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612b0f565b6020026020010151828581518110610c5c57610c5c612b0f565b6020026020010181815250506000818581518110610c7c57610c7c612b0f565b60200260200101906003811115610c9557610c956125e7565b90816003811115610ca857610ca86125e7565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612b0f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612b0f565b6020026020010151828581518110610d1a57610d1a612b0f565b6020026020010181815250506003818581518110610c7c57610c7c612b0f565b4360056000898781518110610d5157610d51612b0f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612b0f565b6020026020010151828581518110610d9d57610d9d612b0f565b6020026020010181815250506002818581518110610c7c57610c7c612b0f565b868481518110610dcf57610dcf612b0f565b6020026020010151828581518110610de957610de9612b0f565b6020026020010181815250506001818581518110610c7c57610c7c612b0f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f25565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612af7565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612af7565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33611f45565b6112f9848c84848988611f9d565b6004805490600061130983612b3e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c84848988611f9d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612b77565b6120e1565b905061137f670de0b6b3a764000082612bb2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a611f9d565b600480549060006113f283612b3e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612b0f565b905060200201358152602001908152602001600020905061148181612192565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612af7565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612b0f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612bef565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612af7565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612af7565b909155506119cc9050565b8187600201546119a49190612af7565b33600c1b600090815260066020526040812080549091906119c6908490612af7565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff168361220e565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c61220e565b611a62833360018a60020154901c61220e565b611a76565b611a768333896002015461220e565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b066122fa565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612b0f565b602002602001015187611b96565b905080828581518110611b7557611b75612b0f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461225d565b611e2985338661220e565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716611f1757637939f4246000526004601cfd5b600060605260405250505050565b60008060008084865af1611f415763b12d13eb6000526004601cfd5b5050565b611f6784848473ffffffffffffffffffffffffffffffffffffffff851661229d565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556120758686848461225d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65926120d192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016120ff91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061218b5763e10bf1cc6000526004601cfd5b5050919050565b43816004015411156121d0576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600381015461220b576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d156001600051141716612253576390b8ec186000526004601cfd5b6000603452505050565b8383850311841517156122785763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b600083156122d9578360051b8501855b803580851160051b948552602094851852604060002093018181106122d1576122d6565b6122ad565b50505b501492915050565b6000602082840312156122f357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612370576123706122fa565b604052919050565b600067ffffffffffffffff821115612392576123926122fa565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461220b57600080fd5b600082601f8301126123cf57600080fd5b813560206123e46123df83612378565b612329565b82815260059290921b8401810191818101908684111561240357600080fd5b8286015b8481101561242757803561241a8161239c565b8352918301918301612407565b509695505050505050565b60006020828403121561244457600080fd5b813567ffffffffffffffff81111561245b57600080fd5b612467848285016123be565b949350505050565b60006020828403121561248157600080fd5b813561248c8161239c565b9392505050565b803580151581146124a357600080fd5b919050565b600080600080600060a086880312156124c057600080fd5b85356124cb8161239c565b945060208601356bffffffffffffffffffffffff811681146124ec57600080fd5b935060408601356124fc8161239c565b925061250a60608701612493565b949793965091946080013592915050565b6000602080838503121561252e57600080fd5b823567ffffffffffffffff81111561254557600080fd5b8301601f8101851361255657600080fd5b80356125646123df82612378565b81815260059190911b8201830190838101908783111561258357600080fd5b928401925b828410156125a157833582529284019290840190612588565b979650505050505050565b600081518084526020808501945080840160005b838110156125dc578151875295820195908201906001016125c0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061262960408301856125ac565b8281036020848101919091528451808352858201928201906000805b828110156126975785516004808210612684577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612645565b509198975050505050505050565b600080604083850312156126b857600080fd5b82356126c38161239c565b91506126d160208401612493565b90509250929050565b600080604083850312156126ed57600080fd5b82356126f88161239c565b946020939093013593505050565b6000806040838503121561271957600080fd5b82356127248161239c565b915060208301356127348161239c565b809150509250929050565b60008083601f84011261275157600080fd5b50813567ffffffffffffffff81111561276957600080fd5b6020830191508360208260051b850101111561278457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156127a957600080fd5b89356127b48161239c565b985060208a01356127c48161239c565b975060408a01356127d48161239c565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff808211156127ff57600080fd5b61280b8d838e0161273f565b909650945060c08c013591508082111561282457600080fd5b506128318c828d0161273f565b915080935050809150509295985092959850929598565b6000806040838503121561285b57600080fd5b8235915060208301356127348161239c565b6000806020838503121561288057600080fd5b823567ffffffffffffffff81111561289757600080fd5b610e098582860161273f565b600080600080600060a086880312156128bb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff811681146128e857600080fd5b809150509295509295909350565b6000806040838503121561290957600080fd5b823567ffffffffffffffff81111561292057600080fd5b61292c858286016123be565b92505060208301356127348161239c565b60208152600061248c60208301846125ac565b6000806040838503121561296357600080fd5b823567ffffffffffffffff8082111561297b57600080fd5b612987868387016123be565b935060209150818501358181111561299e57600080fd5b85019050601f810186136129b157600080fd5b80356129bf6123df82612378565b81815260059190911b820183019083810190888311156129de57600080fd5b928401925b82841015612a03576129f484612493565b825292840192908401906129e3565b80955050505050509250929050565b60008060008060608587031215612a2857600080fd5b8435612a338161239c565b935060208501359250604085013567ffffffffffffffff811115612a5657600080fd5b612a628782880161273f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612abc57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612a8a565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612b0a57612b0a612ac8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b7057612b70612ac8565b5060010190565b600082612bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bea57612bea612ac8565b500290565b600082821015612c0157612c01612ac8565b50039056fea164736f6c6343000809000a", + "deployedBytecode": "0x6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e3660046122e1565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612432565b610740565b005b34801561026157600080fd5b5061025361027036600461246f565b610832565b34801561028157600080fd5b506102536102903660046124a8565b610923565b3480156102a157600080fd5b506103196102b03660046122e1565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b6103973660046122e1565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461251b565b610b32565b60405161022a929190612616565b3480156103e557600080fd5b506102206103f436600461246f565b600c1b90565b34801561040657600080fd5b506102536104153660046122e1565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461246f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046126a5565b610f8d565b3480156104aa57600080fd5b506102206104b93660046122e1565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec3660046126da565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612706565b6110f0565b34801561051d57600080fd5b5061053261052c3660046122e1565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b5061022061057236600461278b565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612848565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612706565b611417565b34801561063257600080fd5b5061025361064136600461286d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046128a3565b611673565b34801561069f57600080fd5b506106b36106ae3660046128f6565b611ae4565b60405161022a919061293d565b3480156106cc57600080fd5b506102206106db366004612706565b611b96565b3480156106ec57600080fd5b506102536106fb366004612950565b611bc7565b34801561070c57600080fd5b5061025361071b36600461246f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612a12565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612a6e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612af7565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612af7565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c6122fa565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc36122fa565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612b0f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612b0f565b6020026020010151828581518110610c5c57610c5c612b0f565b6020026020010181815250506000818581518110610c7c57610c7c612b0f565b60200260200101906003811115610c9557610c956125e7565b90816003811115610ca857610ca86125e7565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612b0f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612b0f565b6020026020010151828581518110610d1a57610d1a612b0f565b6020026020010181815250506003818581518110610c7c57610c7c612b0f565b4360056000898781518110610d5157610d51612b0f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612b0f565b6020026020010151828581518110610d9d57610d9d612b0f565b6020026020010181815250506002818581518110610c7c57610c7c612b0f565b868481518110610dcf57610dcf612b0f565b6020026020010151828581518110610de957610de9612b0f565b6020026020010181815250506001818581518110610c7c57610c7c612b0f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f25565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612af7565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612af7565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33611f45565b6112f9848c84848988611f9d565b6004805490600061130983612b3e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c84848988611f9d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612b77565b6120e1565b905061137f670de0b6b3a764000082612bb2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a611f9d565b600480549060006113f283612b3e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612b0f565b905060200201358152602001908152602001600020905061148181612192565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612af7565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612b0f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612bef565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612af7565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612af7565b909155506119cc9050565b8187600201546119a49190612af7565b33600c1b600090815260066020526040812080549091906119c6908490612af7565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff168361220e565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c61220e565b611a62833360018a60020154901c61220e565b611a76565b611a768333896002015461220e565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b066122fa565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612b0f565b602002602001015187611b96565b905080828581518110611b7557611b75612b0f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461225d565b611e2985338661220e565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716611f1757637939f4246000526004601cfd5b600060605260405250505050565b60008060008084865af1611f415763b12d13eb6000526004601cfd5b5050565b611f6784848473ffffffffffffffffffffffffffffffffffffffff851661229d565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556120758686848461225d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65926120d192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016120ff91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061218b5763e10bf1cc6000526004601cfd5b5050919050565b43816004015411156121d0576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600381015461220b576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d156001600051141716612253576390b8ec186000526004601cfd5b6000603452505050565b8383850311841517156122785763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b600083156122d9578360051b8501855b803580851160051b948552602094851852604060002093018181106122d1576122d6565b6122ad565b50505b501492915050565b6000602082840312156122f357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612370576123706122fa565b604052919050565b600067ffffffffffffffff821115612392576123926122fa565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461220b57600080fd5b600082601f8301126123cf57600080fd5b813560206123e46123df83612378565b612329565b82815260059290921b8401810191818101908684111561240357600080fd5b8286015b8481101561242757803561241a8161239c565b8352918301918301612407565b509695505050505050565b60006020828403121561244457600080fd5b813567ffffffffffffffff81111561245b57600080fd5b612467848285016123be565b949350505050565b60006020828403121561248157600080fd5b813561248c8161239c565b9392505050565b803580151581146124a357600080fd5b919050565b600080600080600060a086880312156124c057600080fd5b85356124cb8161239c565b945060208601356bffffffffffffffffffffffff811681146124ec57600080fd5b935060408601356124fc8161239c565b925061250a60608701612493565b949793965091946080013592915050565b6000602080838503121561252e57600080fd5b823567ffffffffffffffff81111561254557600080fd5b8301601f8101851361255657600080fd5b80356125646123df82612378565b81815260059190911b8201830190838101908783111561258357600080fd5b928401925b828410156125a157833582529284019290840190612588565b979650505050505050565b600081518084526020808501945080840160005b838110156125dc578151875295820195908201906001016125c0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061262960408301856125ac565b8281036020848101919091528451808352858201928201906000805b828110156126975785516004808210612684577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612645565b509198975050505050505050565b600080604083850312156126b857600080fd5b82356126c38161239c565b91506126d160208401612493565b90509250929050565b600080604083850312156126ed57600080fd5b82356126f88161239c565b946020939093013593505050565b6000806040838503121561271957600080fd5b82356127248161239c565b915060208301356127348161239c565b809150509250929050565b60008083601f84011261275157600080fd5b50813567ffffffffffffffff81111561276957600080fd5b6020830191508360208260051b850101111561278457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156127a957600080fd5b89356127b48161239c565b985060208a01356127c48161239c565b975060408a01356127d48161239c565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff808211156127ff57600080fd5b61280b8d838e0161273f565b909650945060c08c013591508082111561282457600080fd5b506128318c828d0161273f565b915080935050809150509295985092959850929598565b6000806040838503121561285b57600080fd5b8235915060208301356127348161239c565b6000806020838503121561288057600080fd5b823567ffffffffffffffff81111561289757600080fd5b610e098582860161273f565b600080600080600060a086880312156128bb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff811681146128e857600080fd5b809150509295509295909350565b6000806040838503121561290957600080fd5b823567ffffffffffffffff81111561292057600080fd5b61292c858286016123be565b92505060208301356127348161239c565b60208152600061248c60208301846125ac565b6000806040838503121561296357600080fd5b823567ffffffffffffffff8082111561297b57600080fd5b612987868387016123be565b935060209150818501358181111561299e57600080fd5b85019050601f810186136129b157600080fd5b80356129bf6123df82612378565b81815260059190911b820183019083810190888311156129de57600080fd5b928401925b82841015612a03576129f484612493565b825292840192908401906129e3565b80955050505050509250929050565b60008060008060608587031215612a2857600080fd5b8435612a338161239c565b935060208501359250604085013567ffffffffffffffff811115612a5657600080fd5b612a628782880161273f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612abc57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612a8a565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612b0a57612b0a612ac8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b7057612b70612ac8565b5060010190565b600082612bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bea57612bea612ac8565b500290565b600082821015612c0157612c01612ac8565b50039056fea164736f6c6343000809000a", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/lib/utils/SafeTransferLib.sol b/contracts/lib/utils/SafeTransferLib.sol index 7cc0d68..9697682 100644 --- a/contracts/lib/utils/SafeTransferLib.sol +++ b/contracts/lib/utils/SafeTransferLib.sol @@ -4,114 +4,140 @@ pragma solidity >=0.8.4; import { ERC20 } from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. -/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol) +/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) +/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Caution! This library won't check that a token has code, responsibility is delegated to the caller. library SafeTransferLib { + /*////////////////////////////////////////////////////////////// + CUSTOM ERRORS + //////////////////////////////////////////////////////////////*/ + + /// @dev The ETH transfer has failed. + error ETHTransferFailed(); + /// @dev The ERC20 `transferFrom` has failed. + error TransferFromFailed(); + /// @dev The ERC20 `transfer` has failed. + error TransferFailed(); + /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ + /// @dev Sends `amount` (in wei) ETH to `to`. + /// Reverts upon failure. function safeTransferETH( address to, uint256 amount ) internal { - bool success; - + /// @solidity memory-safe-assembly assembly { - // Transfer the ETH and store if it succeeded or not. - success := call(gas(), to, amount, 0, 0, 0, 0) + // Transfer the ETH and check if it succeeded or not. + if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { + // Store the function selector of `ETHTransferFailed()`. + mstore(0x00, 0xb12d13eb) + // Revert with (offset, size). + revert(0x1c, 0x04) + } } - - require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ + /// @dev Sends `amount` of ERC20 `token` from `from` to `to`. + /// Reverts upon failure. + /// + /// The `from` account must have at least `amount` approved for + /// the current contract to manage. function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { - bool success; - + /// @solidity memory-safe-assembly assembly { - // We'll write our calldata to this slot below, but restore it later. - let memPointer := mload(0x40) + let m := mload(0x40) // Cache the free memory pointer. - // Write the abi-encoded calldata into memory, beginning with the function selector. - mstore( - 0, - 0x23b872dd00000000000000000000000000000000000000000000000000000000 - ) - mstore(4, from) // Append the "from" argument. - mstore(36, to) // Append the "to" argument. - mstore(68, amount) // Append the "amount" argument. + mstore(0x60, amount) // Store the `amount` argument. + mstore(0x40, to) // Store the `to` argument. + mstore(0x2c, shl(96, from)) // Store the `from` argument. + // Store the function selector of `transferFrom(address,address,uint256)`. + mstore(0x0c, 0x23b872dd000000000000000000000000) - success := and( - // Set success to whether the call reverted, if not we check it either - // returned exactly 1 (can't just be non-zero data), or had no return data. - or( - and( - eq(mload(0), 1), - gt(returndatasize(), 31) + if iszero( + and( + // The arguments of `and` are evaluated from right to left. + // Set success to whether the call reverted, if not we check it either + // returned exactly 1 (can't just be non-zero data), or had no return data. + or( + eq(mload(0x00), 1), + iszero(returndatasize()) ), - iszero(returndatasize()) - ), - // We use 100 because that's the total length of our calldata (4 + 32 * 3) - // Counterintuitively, this call() must be positioned after the or() in the - // surrounding and() because and() evaluates its arguments from right to left. - call(gas(), token, 0, 0, 100, 0, 32) - ) + call( + gas(), + token, + 0, + 0x1c, + 0x64, + 0x00, + 0x20 + ) + ) + ) { + // Store the function selector of `TransferFromFailed()`. + mstore(0x00, 0x7939f424) + // Revert with (offset, size). + revert(0x1c, 0x04) + } mstore(0x60, 0) // Restore the zero slot to zero. - mstore(0x40, memPointer) // Restore the memPointer. + mstore(0x40, m) // Restore the free memory pointer. } - - require(success, "TRANSFER_FROM_FAILED"); } + /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`. + /// Reverts upon failure. function safeTransfer( ERC20 token, address to, uint256 amount ) internal { - bool success; - + /// @solidity memory-safe-assembly assembly { - // We'll write our calldata to this slot below, but restore it later. - let memPointer := mload(0x40) + mstore(0x14, to) // Store the `to` argument. + mstore(0x34, amount) // Store the `amount` argument. + // Store the function selector of `transfer(address,uint256)`. + mstore(0x00, 0xa9059cbb000000000000000000000000) - // Write the abi-encoded calldata into memory, beginning with the function selector. - mstore( - 0, - 0xa9059cbb00000000000000000000000000000000000000000000000000000000 - ) - mstore(4, to) // Append the "to" argument. - mstore(36, amount) // Append the "amount" argument. - - success := and( - // Set success to whether the call reverted, if not we check it either - // returned exactly 1 (can't just be non-zero data), or had no return data. - or( - and( - eq(mload(0), 1), - gt(returndatasize(), 31) + if iszero( + and( + // The arguments of `and` are evaluated from right to left. + // Set success to whether the call reverted, if not we check it either + // returned exactly 1 (can't just be non-zero data), or had no return data. + or( + eq(mload(0x00), 1), + iszero(returndatasize()) ), - iszero(returndatasize()) - ), - // We use 68 because that's the total length of our calldata (4 + 32 * 2) - // Counterintuitively, this call() must be positioned after the or() in the - // surrounding and() because and() evaluates its arguments from right to left. - call(gas(), token, 0, 0, 68, 0, 32) - ) - - mstore(0x60, 0) // Restore the zero slot to zero. - mstore(0x40, memPointer) // Restore the memPointer. + call( + gas(), + token, + 0, + 0x10, + 0x44, + 0x00, + 0x20 + ) + ) + ) { + // Store the function selector of `TransferFailed()`. + mstore(0x00, 0x90b8ec18) + // Revert with (offset, size). + revert(0x1c, 0x04) + } + // Restore the part of the free memory pointer that was overwritten. + mstore(0x34, 0) } - - require(success, "TRANSFER_FAILED"); } } diff --git a/src/types/factories/lib/utils/SafeTransferLib__factory.ts b/src/types/factories/lib/utils/SafeTransferLib__factory.ts new file mode 100644 index 0000000..e81e427 --- /dev/null +++ b/src/types/factories/lib/utils/SafeTransferLib__factory.ts @@ -0,0 +1,78 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../../../common"; +import type { + SafeTransferLib, + SafeTransferLibInterface, +} from "../../../lib/utils/SafeTransferLib"; + +const _abi = [ + { + inputs: [], + name: "ETHTransferFailed", + type: "error", + }, + { + inputs: [], + name: "TransferFailed", + type: "error", + }, + { + inputs: [], + name: "TransferFromFailed", + type: "error", + }, +]; + +const _bytecode = + "0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c6343000809000a"; + +type SafeTransferLibConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: SafeTransferLibConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class SafeTransferLib__factory extends ContractFactory { + constructor(...args: SafeTransferLibConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): SafeTransferLib { + return super.attach(address) as SafeTransferLib; + } + override connect(signer: Signer): SafeTransferLib__factory { + return super.connect(signer) as SafeTransferLib__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): SafeTransferLibInterface { + return new utils.Interface(_abi) as SafeTransferLibInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): SafeTransferLib { + return new Contract(address, _abi, signerOrProvider) as SafeTransferLib; + } +} diff --git a/src/types/factories/lib/utils/index.ts b/src/types/factories/lib/utils/index.ts index 5fcb977..7dd2d19 100644 --- a/src/types/factories/lib/utils/index.ts +++ b/src/types/factories/lib/utils/index.ts @@ -3,3 +3,4 @@ /* eslint-disable */ export { Multicall__factory } from "./Multicall__factory"; export { ReentrancyGuard__factory } from "./ReentrancyGuard__factory"; +export { SafeTransferLib__factory } from "./SafeTransferLib__factory"; diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index a11e158..3c3781f 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -1082,7 +1082,7 @@ const _abi = [ ]; const _bytecode = - "0x6080604052600180556040516200331c3803806200331c8339810160408190526200002a916200045c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b6200009882826200026f565b5050505050620005c9565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60208101815160051b81015b3d6200023c5760018251600c1b5560208201915080821062000236576200023c565b62000214565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516200012891906200057a565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620002d05763df9578836000526004601cfd5b81518114620002e75763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200034e5763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150620002f6565b505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000397576200039762000356565b604052919050565b60006001600160401b03821115620003bb57620003bb62000356565b5060051b60200190565b6001600160a01b0381168114620003db57600080fd5b50565b600082601f830112620003f057600080fd5b815160206200040962000403836200039f565b6200036c565b82815260059290921b840181019181810190868411156200042957600080fd5b8286015b84811015620004515780516200044381620003c5565b83529183019183016200042d565b509695505050505050565b600080600080600060a086880312156200047557600080fd5b8551602080880151919650906001600160401b03808211156200049757600080fd5b620004a58a838b01620003de565b965060408901519150620004b982620003c5565b606089015191955080821115620004cf57600080fd5b620004dd8a838b01620003de565b94506080890151915080821115620004f457600080fd5b508701601f810189136200050757600080fd5b80516200051862000403826200039f565b81815260059190911b8201830190838101908b8311156200053857600080fd5b928401925b82841015620005685783518015158114620005585760008081fd5b825292840192908401906200053d565b80955050505050509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015620005bd5783516001600160a01b03168352928401929184019160010162000596565b50909695505050505050565b612d4380620005d96000396000f3fe6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e366004612411565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612562565b610740565b005b34801561026157600080fd5b5061025361027036600461259f565b610832565b34801561028157600080fd5b506102536102903660046125d8565b610923565b3480156102a157600080fd5b506103196102b0366004612411565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b610397366004612411565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461264b565b610b32565b60405161022a929190612746565b3480156103e557600080fd5b506102206103f436600461259f565b600c1b90565b34801561040657600080fd5b50610253610415366004612411565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461259f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046127d5565b610f8d565b3480156104aa57600080fd5b506102206104b9366004612411565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec36600461280a565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612836565b6110f0565b34801561051d57600080fd5b5061053261052c366004612411565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b506102206105723660046128bb565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612978565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612836565b611417565b34801561063257600080fd5b5061025361064136600461299d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046129d3565b611673565b34801561069f57600080fd5b506106b36106ae366004612a26565b611ae4565b60405161022a9190612a6d565b3480156106cc57600080fd5b506102206106db366004612836565b611b96565b3480156106ec57600080fd5b506102536106fb366004612a80565b611bc7565b34801561070c57600080fd5b5061025361071b36600461259f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612b42565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612b9e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612c27565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612c27565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c61242a565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc361242a565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612c3f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612c3f565b6020026020010151828581518110610c5c57610c5c612c3f565b6020026020010181815250506000818581518110610c7c57610c7c612c3f565b60200260200101906003811115610c9557610c95612717565b90816003811115610ca857610ca8612717565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612c3f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612c3f565b6020026020010151828581518110610d1a57610d1a612c3f565b6020026020010181815250506003818581518110610c7c57610c7c612c3f565b4360056000898781518110610d5157610d51612c3f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612c3f565b6020026020010151828581518110610d9d57610d9d612c3f565b6020026020010181815250506002818581518110610c7c57610c7c612c3f565b868481518110610dcf57610dcf612c3f565b6020026020010151828581518110610de957610de9612c3f565b6020026020010181815250506001818581518110610c7c57610c7c612c3f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f8b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612c27565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612c27565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33612005565b6112f9848c8484898861205d565b6004805490600061130983612c6e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c8484898861205d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612ca7565b6121a1565b905061137f670de0b6b3a764000082612ce2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a61205d565b600480549060006113f283612c6e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612c3f565b905060200201358152602001908152602001600020905061148181612252565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612c27565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612c3f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612d1f565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612c27565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612c27565b909155506119cc9050565b8187600201546119a49190612c27565b33600c1b600090815260066020526040812080549091906119c6908490612c27565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff16836122ce565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6122ce565b611a62833360018a60020154901c6122ce565b611a76565b611a76833389600201546122ce565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b0661242a565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612c3f565b602002602001015187611b96565b905080828581518110611b7557611b75612c3f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461238d565b611e298533866122ce565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107bd565b600080600080600085875af1905080612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016107bd565b505050565b61202784848473ffffffffffffffffffffffffffffffffffffffff85166123cd565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556121358686848461238d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261219192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016121bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061224b5763e10bf1cc6000526004601cfd5b5050919050565b4381600401541115612290576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038101546122cb576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107bd565b8383850311841517156123a85763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b60008315612409578360051b8501855b803580851160051b9485526020948518526040600020930181811061240157612406565b6123dd565b50505b501492915050565b60006020828403121561242357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124a0576124a061242a565b604052919050565b600067ffffffffffffffff8211156124c2576124c261242a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122cb57600080fd5b600082601f8301126124ff57600080fd5b8135602061251461250f836124a8565b612459565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124cc565b8352918301918301612537565b509695505050505050565b60006020828403121561257457600080fd5b813567ffffffffffffffff81111561258b57600080fd5b612597848285016124ee565b949350505050565b6000602082840312156125b157600080fd5b81356125bc816124cc565b9392505050565b803580151581146125d357600080fd5b919050565b600080600080600060a086880312156125f057600080fd5b85356125fb816124cc565b945060208601356bffffffffffffffffffffffff8116811461261c57600080fd5b9350604086013561262c816124cc565b925061263a606087016125c3565b949793965091946080013592915050565b6000602080838503121561265e57600080fd5b823567ffffffffffffffff81111561267557600080fd5b8301601f8101851361268657600080fd5b803561269461250f826124a8565b81815260059190911b820183019083810190878311156126b357600080fd5b928401925b828410156126d1578335825292840192908401906126b8565b979650505050505050565b600081518084526020808501945080840160005b8381101561270c578151875295820195908201906001016126f0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061275960408301856126dc565b8281036020848101919091528451808352858201928201906000805b828110156127c757855160048082106127b4577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612775565b509198975050505050505050565b600080604083850312156127e857600080fd5b82356127f3816124cc565b9150612801602084016125c3565b90509250929050565b6000806040838503121561281d57600080fd5b8235612828816124cc565b946020939093013593505050565b6000806040838503121561284957600080fd5b8235612854816124cc565b91506020830135612864816124cc565b809150509250929050565b60008083601f84011261288157600080fd5b50813567ffffffffffffffff81111561289957600080fd5b6020830191508360208260051b85010111156128b457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156128d957600080fd5b89356128e4816124cc565b985060208a01356128f4816124cc565b975060408a0135612904816124cc565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff8082111561292f57600080fd5b61293b8d838e0161286f565b909650945060c08c013591508082111561295457600080fd5b506129618c828d0161286f565b915080935050809150509295985092959850929598565b6000806040838503121561298b57600080fd5b823591506020830135612864816124cc565b600080602083850312156129b057600080fd5b823567ffffffffffffffff8111156129c757600080fd5b610e098582860161286f565b600080600080600060a086880312156129eb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff81168114612a1857600080fd5b809150509295509295909350565b60008060408385031215612a3957600080fd5b823567ffffffffffffffff811115612a5057600080fd5b612a5c858286016124ee565b9250506020830135612864816124cc565b6020815260006125bc60208301846126dc565b60008060408385031215612a9357600080fd5b823567ffffffffffffffff80821115612aab57600080fd5b612ab7868387016124ee565b9350602091508185013581811115612ace57600080fd5b85019050601f81018613612ae157600080fd5b8035612aef61250f826124a8565b81815260059190911b82018301908381019088831115612b0e57600080fd5b928401925b82841015612b3357612b24846125c3565b82529284019290840190612b13565b80955050505050509250929050565b60008060008060608587031215612b5857600080fd5b8435612b63816124cc565b935060208501359250604085013567ffffffffffffffff811115612b8657600080fd5b612b928782880161286f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612bec57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bba565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612c3a57612c3a612bf8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ca057612ca0612bf8565b5060010190565b600082612cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d1a57612d1a612bf8565b500290565b600082821015612d3157612d31612bf8565b50039056fea164736f6c6343000809000a"; + "0x608060405260018055604051620031ec380380620031ec8339810160408190526200002a916200045c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b6200009882826200026f565b5050505050620005c9565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60208101815160051b81015b3d6200023c5760018251600c1b5560208201915080821062000236576200023c565b62000214565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516200012891906200057a565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620002d05763df9578836000526004601cfd5b81518114620002e75763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200034e5763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150620002f6565b505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000397576200039762000356565b604052919050565b60006001600160401b03821115620003bb57620003bb62000356565b5060051b60200190565b6001600160a01b0381168114620003db57600080fd5b50565b600082601f830112620003f057600080fd5b815160206200040962000403836200039f565b6200036c565b82815260059290921b840181019181810190868411156200042957600080fd5b8286015b84811015620004515780516200044381620003c5565b83529183019183016200042d565b509695505050505050565b600080600080600060a086880312156200047557600080fd5b8551602080880151919650906001600160401b03808211156200049757600080fd5b620004a58a838b01620003de565b965060408901519150620004b982620003c5565b606089015191955080821115620004cf57600080fd5b620004dd8a838b01620003de565b94506080890151915080821115620004f457600080fd5b508701601f810189136200050757600080fd5b80516200051862000403826200039f565b81815260059190911b8201830190838101908b8311156200053857600080fd5b928401925b82841015620005685783518015158114620005585760008081fd5b825292840192908401906200053d565b80955050505050509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015620005bd5783516001600160a01b03168352928401929184019160010162000596565b50909695505050505050565b612c1380620005d96000396000f3fe6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e3660046122e1565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612432565b610740565b005b34801561026157600080fd5b5061025361027036600461246f565b610832565b34801561028157600080fd5b506102536102903660046124a8565b610923565b3480156102a157600080fd5b506103196102b03660046122e1565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b6103973660046122e1565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461251b565b610b32565b60405161022a929190612616565b3480156103e557600080fd5b506102206103f436600461246f565b600c1b90565b34801561040657600080fd5b506102536104153660046122e1565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461246f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046126a5565b610f8d565b3480156104aa57600080fd5b506102206104b93660046122e1565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec3660046126da565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612706565b6110f0565b34801561051d57600080fd5b5061053261052c3660046122e1565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b5061022061057236600461278b565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612848565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612706565b611417565b34801561063257600080fd5b5061025361064136600461286d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046128a3565b611673565b34801561069f57600080fd5b506106b36106ae3660046128f6565b611ae4565b60405161022a919061293d565b3480156106cc57600080fd5b506102206106db366004612706565b611b96565b3480156106ec57600080fd5b506102536106fb366004612950565b611bc7565b34801561070c57600080fd5b5061025361071b36600461246f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612a12565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612a6e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612af7565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612af7565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c6122fa565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc36122fa565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612b0f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612b0f565b6020026020010151828581518110610c5c57610c5c612b0f565b6020026020010181815250506000818581518110610c7c57610c7c612b0f565b60200260200101906003811115610c9557610c956125e7565b90816003811115610ca857610ca86125e7565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612b0f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612b0f565b6020026020010151828581518110610d1a57610d1a612b0f565b6020026020010181815250506003818581518110610c7c57610c7c612b0f565b4360056000898781518110610d5157610d51612b0f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612b0f565b6020026020010151828581518110610d9d57610d9d612b0f565b6020026020010181815250506002818581518110610c7c57610c7c612b0f565b868481518110610dcf57610dcf612b0f565b6020026020010151828581518110610de957610de9612b0f565b6020026020010181815250506001818581518110610c7c57610c7c612b0f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f25565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612af7565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612af7565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33611f45565b6112f9848c84848988611f9d565b6004805490600061130983612b3e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c84848988611f9d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612b77565b6120e1565b905061137f670de0b6b3a764000082612bb2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a611f9d565b600480549060006113f283612b3e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612b0f565b905060200201358152602001908152602001600020905061148181612192565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612af7565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612b0f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612bef565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612af7565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612af7565b909155506119cc9050565b8187600201546119a49190612af7565b33600c1b600090815260066020526040812080549091906119c6908490612af7565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff168361220e565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c61220e565b611a62833360018a60020154901c61220e565b611a76565b611a768333896002015461220e565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b066122fa565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612b0f565b602002602001015187611b96565b905080828581518110611b7557611b75612b0f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461225d565b611e2985338661220e565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716611f1757637939f4246000526004601cfd5b600060605260405250505050565b60008060008084865af1611f415763b12d13eb6000526004601cfd5b5050565b611f6784848473ffffffffffffffffffffffffffffffffffffffff851661229d565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556120758686848461225d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65926120d192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016120ff91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061218b5763e10bf1cc6000526004601cfd5b5050919050565b43816004015411156121d0576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600381015461220b576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d156001600051141716612253576390b8ec186000526004601cfd5b6000603452505050565b8383850311841517156122785763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b600083156122d9578360051b8501855b803580851160051b948552602094851852604060002093018181106122d1576122d6565b6122ad565b50505b501492915050565b6000602082840312156122f357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612370576123706122fa565b604052919050565b600067ffffffffffffffff821115612392576123926122fa565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461220b57600080fd5b600082601f8301126123cf57600080fd5b813560206123e46123df83612378565b612329565b82815260059290921b8401810191818101908684111561240357600080fd5b8286015b8481101561242757803561241a8161239c565b8352918301918301612407565b509695505050505050565b60006020828403121561244457600080fd5b813567ffffffffffffffff81111561245b57600080fd5b612467848285016123be565b949350505050565b60006020828403121561248157600080fd5b813561248c8161239c565b9392505050565b803580151581146124a357600080fd5b919050565b600080600080600060a086880312156124c057600080fd5b85356124cb8161239c565b945060208601356bffffffffffffffffffffffff811681146124ec57600080fd5b935060408601356124fc8161239c565b925061250a60608701612493565b949793965091946080013592915050565b6000602080838503121561252e57600080fd5b823567ffffffffffffffff81111561254557600080fd5b8301601f8101851361255657600080fd5b80356125646123df82612378565b81815260059190911b8201830190838101908783111561258357600080fd5b928401925b828410156125a157833582529284019290840190612588565b979650505050505050565b600081518084526020808501945080840160005b838110156125dc578151875295820195908201906001016125c0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061262960408301856125ac565b8281036020848101919091528451808352858201928201906000805b828110156126975785516004808210612684577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612645565b509198975050505050505050565b600080604083850312156126b857600080fd5b82356126c38161239c565b91506126d160208401612493565b90509250929050565b600080604083850312156126ed57600080fd5b82356126f88161239c565b946020939093013593505050565b6000806040838503121561271957600080fd5b82356127248161239c565b915060208301356127348161239c565b809150509250929050565b60008083601f84011261275157600080fd5b50813567ffffffffffffffff81111561276957600080fd5b6020830191508360208260051b850101111561278457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156127a957600080fd5b89356127b48161239c565b985060208a01356127c48161239c565b975060408a01356127d48161239c565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff808211156127ff57600080fd5b61280b8d838e0161273f565b909650945060c08c013591508082111561282457600080fd5b506128318c828d0161273f565b915080935050809150509295985092959850929598565b6000806040838503121561285b57600080fd5b8235915060208301356127348161239c565b6000806020838503121561288057600080fd5b823567ffffffffffffffff81111561289757600080fd5b610e098582860161273f565b600080600080600060a086880312156128bb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff811681146128e857600080fd5b809150509295509295909350565b6000806040838503121561290957600080fd5b823567ffffffffffffffff81111561292057600080fd5b61292c858286016123be565b92505060208301356127348161239c565b60208152600061248c60208301846125ac565b6000806040838503121561296357600080fd5b823567ffffffffffffffff8082111561297b57600080fd5b612987868387016123be565b935060209150818501358181111561299e57600080fd5b85019050601f810186136129b157600080fd5b80356129bf6123df82612378565b81815260059190911b820183019083810190888311156129de57600080fd5b928401925b82841015612a03576129f484612493565b825292840192908401906129e3565b80955050505050509250929050565b60008060008060608587031215612a2857600080fd5b8435612a338161239c565b935060208501359250604085013567ffffffffffffffff811115612a5657600080fd5b612a628782880161273f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612abc57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612a8a565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612b0a57612b0a612ac8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612b7057612b70612ac8565b5060010190565b600082612bad577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bea57612bea612ac8565b500290565b600082821015612c0157612c01612ac8565b50039056fea164736f6c6343000809000a"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/hardhat.d.ts b/src/types/hardhat.d.ts index 5a9fb88..c7a6011 100644 --- a/src/types/hardhat.d.ts +++ b/src/types/hardhat.d.ts @@ -40,6 +40,10 @@ declare module "hardhat/types/runtime" { name: "ReentrancyGuard", signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; + getContractFactory( + name: "SafeTransferLib", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; getContractFactory( name: "P2PIX", signerOrOptions?: ethers.Signer | FactoryOptions @@ -84,6 +88,11 @@ declare module "hardhat/types/runtime" { address: string, signer?: ethers.Signer ): Promise; + getContractAt( + name: "SafeTransferLib", + address: string, + signer?: ethers.Signer + ): Promise; getContractAt( name: "P2PIX", address: string, diff --git a/src/types/index.ts b/src/types/index.ts index 7742b5a..03b7ca5 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -21,6 +21,8 @@ export type { Multicall } from "./lib/utils/Multicall"; export { Multicall__factory } from "./factories/lib/utils/Multicall__factory"; export type { ReentrancyGuard } from "./lib/utils/ReentrancyGuard"; export { ReentrancyGuard__factory } from "./factories/lib/utils/ReentrancyGuard__factory"; +export type { SafeTransferLib } from "./lib/utils/SafeTransferLib"; +export { SafeTransferLib__factory } from "./factories/lib/utils/SafeTransferLib__factory"; export type { P2PIX } from "./p2pix.sol/P2PIX"; export { P2PIX__factory } from "./factories/p2pix.sol/P2PIX__factory"; export { Reputation__factory } from "./factories/Reputation__factory"; diff --git a/src/types/lib/utils/SafeTransferLib.ts b/src/types/lib/utils/SafeTransferLib.ts new file mode 100644 index 0000000..9f52806 --- /dev/null +++ b/src/types/lib/utils/SafeTransferLib.ts @@ -0,0 +1,56 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseContract, Signer, utils } from "ethers"; + +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "../../common"; + +export interface SafeTransferLibInterface extends utils.Interface { + functions: {}; + + events: {}; +} + +export interface SafeTransferLib extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: SafeTransferLibInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: {}; + + callStatic: {}; + + filters: {}; + + estimateGas: {}; + + populateTransaction: {}; +} diff --git a/src/types/lib/utils/index.ts b/src/types/lib/utils/index.ts index 40d13ce..73ea0b4 100644 --- a/src/types/lib/utils/index.ts +++ b/src/types/lib/utils/index.ts @@ -3,3 +3,4 @@ /* eslint-disable */ export type { Multicall } from "./Multicall"; export type { ReentrancyGuard } from "./ReentrancyGuard"; +export type { SafeTransferLib } from "./SafeTransferLib";