Address Details
contract
0x23f2c54F5F2F5eA9A6937e9412Da2AD08c2dC6Cc
- Contract Name
- FundMe
- Creator
- 0xda0c69–e8671e at 0x3d99dc–cd3f0d
- Balance
- 1.2 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- Fetching transactions...
- Transfers
- Fetching transfers...
- Gas Used
- Fetching gas used...
- Last Balance Update
- 12110117
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- FundMe
- Optimization enabled
- false
- Compiler version
- v0.8.9+commit.e5eed63a
- EVM Version
- london
- Verified at
- 2022-06-22T14:59:16.329133Z
contracts/FundMeCharity.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol" ; error FUNDME__PROPOSALNOTFOUND(); error FUNDME__PROPOSALFUNDED(); error FUNDME_TRANSACTIONFAILED(); error FUNDME_NOTRECEIVER(); contract FundMe is ReentrancyGuard { using SafeMath for uint256; enum ProposalStatus { INITIATED, COMPLETED, TRANSFERRED } //allowed to transact half amount //amount => (amount -= 10) (amount <0) => direct transfer struct Proposal { uint256 id; uint256 amount; uint256 donatedAmount; address payable receiver; string description; //link ipfs data ProposalStatus status; } event proposalInitiated( uint256 indexed id , address indexed proposer, uint256 indexed _amount ) ; event proposalCompleted( uint256 indexed proposalId ); event proposalDonated( address indexed receiver , uint256 indexed _id ); uint256 public s_proposalId; Proposal[] s_proposals; constructor() { s_proposalId = 0; } function newProposal(uint256 _amount, string memory _description) public { Proposal memory _proposal = Proposal( s_proposalId, _amount, 0, payable(msg.sender), _description, ProposalStatus.INITIATED ); s_proposalId++; s_proposals.push(_proposal); emit proposalInitiated(_proposal.id, _proposal.receiver, _amount) ; } function FundProposal(uint256 _id) public payable /* uint256 _amount*/ { if (s_proposals[_id].status != ProposalStatus.INITIATED) { revert FUNDME__PROPOSALFUNDED(); } uint256 _amount = msg.value; if (_id >= s_proposalId) { revert FUNDME__PROPOSALNOTFOUND(); } s_proposals[_id].donatedAmount = s_proposals[_id].donatedAmount.add(_amount) ; if (s_proposals[_id].amount <= s_proposals[_id].donatedAmount) { s_proposals[_id].status = ProposalStatus.COMPLETED; emit proposalCompleted(_id); } } function withdraw(uint256 _id) nonReentrant public { if (_id >= s_proposalId) { revert FUNDME__PROPOSALNOTFOUND(); } if (msg.sender != s_proposals[_id].receiver) { revert FUNDME_NOTRECEIVER(); } s_proposals[_id].status = ProposalStatus.TRANSFERRED; (bool success, ) = payable(msg.sender).call{ value: s_proposals[_id].donatedAmount }(""); if (!success) { revert FUNDME_TRANSACTIONFAILED(); } emit proposalDonated(msg.sender, _id); } function getProposal(uint256 index) public view returns (Proposal memory) { return s_proposals[index]; } }
/_openzeppelin/contracts/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
/_openzeppelin/contracts/utils/math/SafeMath.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"FUNDME_NOTRECEIVER","inputs":[]},{"type":"error","name":"FUNDME_TRANSACTIONFAILED","inputs":[]},{"type":"error","name":"FUNDME__PROPOSALFUNDED","inputs":[]},{"type":"error","name":"FUNDME__PROPOSALNOTFOUND","inputs":[]},{"type":"event","name":"proposalCompleted","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"proposalDonated","inputs":[{"type":"address","name":"receiver","internalType":"address","indexed":true},{"type":"uint256","name":"_id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"proposalInitiated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"address","name":"proposer","internalType":"address","indexed":true},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[],"name":"FundProposal","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct FundMe.Proposal","components":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"donatedAmount","internalType":"uint256"},{"type":"address","name":"receiver","internalType":"address payable"},{"type":"string","name":"description","internalType":"string"},{"type":"uint8","name":"status","internalType":"enum FundMe.ProposalStatus"}]}],"name":"getProposal","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"newProposal","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"string","name":"_description","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"s_proposalId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_id","internalType":"uint256"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5060016000819055506000600181905550611094806100306000396000f3fe60806040526004361061004a5760003560e01c80632e1a7d4d1461004f5780634f11d3dd14610078578063c7a7723e146100a3578063c7f758a8146100bf578063ee8ca76e146100fc575b600080fd5b34801561005b57600080fd5b5061007660048036038101906100719190610a4a565b610125565b005b34801561008457600080fd5b5061008d6103bd565b60405161009a9190610a86565b60405180910390f35b6100bd60048036038101906100b89190610a4a565b6103c3565b005b3480156100cb57600080fd5b506100e660048036038101906100e19190610a4a565b6105c5565b6040516100f39190610c8a565b60405180910390f35b34801561010857600080fd5b50610123600480360381019061011e9190610de1565b610742565b005b6002600054141561016b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016290610e9a565b60405180910390fd5b600260008190555060015481106101ae576040517f19bf25d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281815481106101c2576101c1610eba565b5b906000526020600020906006020160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610258576040517f468f6a2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280828154811061026d5761026c610eba565b5b906000526020600020906006020160050160006101000a81548160ff021916908360028111156102a05761029f610b8a565b5b021790555060003373ffffffffffffffffffffffffffffffffffffffff16600283815481106102d2576102d1610eba565b5b9060005260206000209060060201600201546040516102f090610f1a565b60006040518083038185875af1925050503d806000811461032d576040519150601f19603f3d011682016040523d82523d6000602084013e610332565b606091505b505090508061036d576040517f6ca9200b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff167f172734dbcf861c6e16cf3f364f282f90756961d09d5701b6ae3c1125cd4b8bfe60405160405180910390a350600160008190555050565b60015481565b600060028111156103d7576103d6610b8a565b5b600282815481106103eb576103ea610eba565b5b906000526020600020906006020160050160009054906101000a900460ff16600281111561041c5761041b610b8a565b5b14610453576040517f530ab87e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003490506001548210610493576040517f19bf25d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104cb81600284815481106104ab576104aa610eba565b5b9060005260206000209060060201600201546108e990919063ffffffff16565b600283815481106104df576104de610eba565b5b9060005260206000209060060201600201819055506002828154811061050857610507610eba565b5b9060005260206000209060060201600201546002838154811061052e5761052d610eba565b5b906000526020600020906006020160010154116105c15760016002838154811061055b5761055a610eba565b5b906000526020600020906006020160050160006101000a81548160ff0219169083600281111561058e5761058d610b8a565b5b0217905550817fe22f1e48cf370dc19cf97fdac4c0c08296949eef6051de9e0f0f4e3eecd230a460405160405180910390a25b5050565b6105cd6108ff565b600282815481106105e1576105e0610eba565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201805461067e90610f5e565b80601f01602080910402602001604051908101604052809291908181526020018280546106aa90610f5e565b80156106f75780601f106106cc576101008083540402835291602001916106f7565b820191906000526020600020905b8154815290600101906020018083116106da57829003601f168201915b505050505081526020016005820160009054906101000a900460ff16600281111561072557610724610b8a565b5b600281111561073757610736610b8a565b5b815250509050919050565b60006040518060c001604052806001548152602001848152602001600081526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018381526020016000600281111561079a57610799610b8a565b5b8152509050600160008154809291906107b290610fbf565b9190505550600281908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550608082015181600401908051906020019061086492919061095d565b5060a08201518160050160006101000a81548160ff021916908360028111156108905761088f610b8a565b5b0217905550505082816060015173ffffffffffffffffffffffffffffffffffffffff1682600001517f05812c347162b13a1f0fb19c9d3ea718bdb0f6e88266884dc247264831857e6b60405160405180910390a4505050565b600081836108f79190611008565b905092915050565b6040518060c00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016000600281111561095757610956610b8a565b5b81525090565b82805461096990610f5e565b90600052602060002090601f01602090048101928261098b57600085556109d2565b82601f106109a457805160ff19168380011785556109d2565b828001600101855582156109d2579182015b828111156109d15782518255916020019190600101906109b6565b5b5090506109df91906109e3565b5090565b5b808211156109fc5760008160009055506001016109e4565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610a2781610a14565b8114610a3257600080fd5b50565b600081359050610a4481610a1e565b92915050565b600060208284031215610a6057610a5f610a0a565b5b6000610a6e84828501610a35565b91505092915050565b610a8081610a14565b82525050565b6000602082019050610a9b6000830184610a77565b92915050565b610aaa81610a14565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610adb82610ab0565b9050919050565b610aeb81610ad0565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610b2b578082015181840152602081019050610b10565b83811115610b3a576000848401525b50505050565b6000601f19601f8301169050919050565b6000610b5c82610af1565b610b668185610afc565b9350610b76818560208601610b0d565b610b7f81610b40565b840191505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110610bca57610bc9610b8a565b5b50565b6000819050610bdb82610bb9565b919050565b6000610beb82610bcd565b9050919050565b610bfb81610be0565b82525050565b600060c083016000830151610c196000860182610aa1565b506020830151610c2c6020860182610aa1565b506040830151610c3f6040860182610aa1565b506060830151610c526060860182610ae2565b5060808301518482036080860152610c6a8282610b51565b91505060a0830151610c7f60a0860182610bf2565b508091505092915050565b60006020820190508181036000830152610ca48184610c01565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610cee82610b40565b810181811067ffffffffffffffff82111715610d0d57610d0c610cb6565b5b80604052505050565b6000610d20610a00565b9050610d2c8282610ce5565b919050565b600067ffffffffffffffff821115610d4c57610d4b610cb6565b5b610d5582610b40565b9050602081019050919050565b82818337600083830152505050565b6000610d84610d7f84610d31565b610d16565b905082815260208101848484011115610da057610d9f610cb1565b5b610dab848285610d62565b509392505050565b600082601f830112610dc857610dc7610cac565b5b8135610dd8848260208601610d71565b91505092915050565b60008060408385031215610df857610df7610a0a565b5b6000610e0685828601610a35565b925050602083013567ffffffffffffffff811115610e2757610e26610a0f565b5b610e3385828601610db3565b9150509250929050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000610e84601f83610e3d565b9150610e8f82610e4e565b602082019050919050565b60006020820190508181036000830152610eb381610e77565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b6000610f04600083610ee9565b9150610f0f82610ef4565b600082019050919050565b6000610f2582610ef7565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610f7657607f821691505b60208210811415610f8a57610f89610f2f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610fca82610a14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ffd57610ffc610f90565b5b600182019050919050565b600061101382610a14565b915061101e83610a14565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561105357611052610f90565b5b82820190509291505056fea26469706673582212200fcd57da96bf36c9fe09e671526e88ec0924ee8261cfd4293822bd57985a763864736f6c63430008090033
Deployed ByteCode
0x60806040526004361061004a5760003560e01c80632e1a7d4d1461004f5780634f11d3dd14610078578063c7a7723e146100a3578063c7f758a8146100bf578063ee8ca76e146100fc575b600080fd5b34801561005b57600080fd5b5061007660048036038101906100719190610a4a565b610125565b005b34801561008457600080fd5b5061008d6103bd565b60405161009a9190610a86565b60405180910390f35b6100bd60048036038101906100b89190610a4a565b6103c3565b005b3480156100cb57600080fd5b506100e660048036038101906100e19190610a4a565b6105c5565b6040516100f39190610c8a565b60405180910390f35b34801561010857600080fd5b50610123600480360381019061011e9190610de1565b610742565b005b6002600054141561016b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016290610e9a565b60405180910390fd5b600260008190555060015481106101ae576040517f19bf25d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281815481106101c2576101c1610eba565b5b906000526020600020906006020160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610258576040517f468f6a2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280828154811061026d5761026c610eba565b5b906000526020600020906006020160050160006101000a81548160ff021916908360028111156102a05761029f610b8a565b5b021790555060003373ffffffffffffffffffffffffffffffffffffffff16600283815481106102d2576102d1610eba565b5b9060005260206000209060060201600201546040516102f090610f1a565b60006040518083038185875af1925050503d806000811461032d576040519150601f19603f3d011682016040523d82523d6000602084013e610332565b606091505b505090508061036d576040517f6ca9200b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff167f172734dbcf861c6e16cf3f364f282f90756961d09d5701b6ae3c1125cd4b8bfe60405160405180910390a350600160008190555050565b60015481565b600060028111156103d7576103d6610b8a565b5b600282815481106103eb576103ea610eba565b5b906000526020600020906006020160050160009054906101000a900460ff16600281111561041c5761041b610b8a565b5b14610453576040517f530ab87e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003490506001548210610493576040517f19bf25d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104cb81600284815481106104ab576104aa610eba565b5b9060005260206000209060060201600201546108e990919063ffffffff16565b600283815481106104df576104de610eba565b5b9060005260206000209060060201600201819055506002828154811061050857610507610eba565b5b9060005260206000209060060201600201546002838154811061052e5761052d610eba565b5b906000526020600020906006020160010154116105c15760016002838154811061055b5761055a610eba565b5b906000526020600020906006020160050160006101000a81548160ff0219169083600281111561058e5761058d610b8a565b5b0217905550817fe22f1e48cf370dc19cf97fdac4c0c08296949eef6051de9e0f0f4e3eecd230a460405160405180910390a25b5050565b6105cd6108ff565b600282815481106105e1576105e0610eba565b5b90600052602060002090600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201805461067e90610f5e565b80601f01602080910402602001604051908101604052809291908181526020018280546106aa90610f5e565b80156106f75780601f106106cc576101008083540402835291602001916106f7565b820191906000526020600020905b8154815290600101906020018083116106da57829003601f168201915b505050505081526020016005820160009054906101000a900460ff16600281111561072557610724610b8a565b5b600281111561073757610736610b8a565b5b815250509050919050565b60006040518060c001604052806001548152602001848152602001600081526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018381526020016000600281111561079a57610799610b8a565b5b8152509050600160008154809291906107b290610fbf565b9190505550600281908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550608082015181600401908051906020019061086492919061095d565b5060a08201518160050160006101000a81548160ff021916908360028111156108905761088f610b8a565b5b0217905550505082816060015173ffffffffffffffffffffffffffffffffffffffff1682600001517f05812c347162b13a1f0fb19c9d3ea718bdb0f6e88266884dc247264831857e6b60405160405180910390a4505050565b600081836108f79190611008565b905092915050565b6040518060c00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016000600281111561095757610956610b8a565b5b81525090565b82805461096990610f5e565b90600052602060002090601f01602090048101928261098b57600085556109d2565b82601f106109a457805160ff19168380011785556109d2565b828001600101855582156109d2579182015b828111156109d15782518255916020019190600101906109b6565b5b5090506109df91906109e3565b5090565b5b808211156109fc5760008160009055506001016109e4565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610a2781610a14565b8114610a3257600080fd5b50565b600081359050610a4481610a1e565b92915050565b600060208284031215610a6057610a5f610a0a565b5b6000610a6e84828501610a35565b91505092915050565b610a8081610a14565b82525050565b6000602082019050610a9b6000830184610a77565b92915050565b610aaa81610a14565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610adb82610ab0565b9050919050565b610aeb81610ad0565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610b2b578082015181840152602081019050610b10565b83811115610b3a576000848401525b50505050565b6000601f19601f8301169050919050565b6000610b5c82610af1565b610b668185610afc565b9350610b76818560208601610b0d565b610b7f81610b40565b840191505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110610bca57610bc9610b8a565b5b50565b6000819050610bdb82610bb9565b919050565b6000610beb82610bcd565b9050919050565b610bfb81610be0565b82525050565b600060c083016000830151610c196000860182610aa1565b506020830151610c2c6020860182610aa1565b506040830151610c3f6040860182610aa1565b506060830151610c526060860182610ae2565b5060808301518482036080860152610c6a8282610b51565b91505060a0830151610c7f60a0860182610bf2565b508091505092915050565b60006020820190508181036000830152610ca48184610c01565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610cee82610b40565b810181811067ffffffffffffffff82111715610d0d57610d0c610cb6565b5b80604052505050565b6000610d20610a00565b9050610d2c8282610ce5565b919050565b600067ffffffffffffffff821115610d4c57610d4b610cb6565b5b610d5582610b40565b9050602081019050919050565b82818337600083830152505050565b6000610d84610d7f84610d31565b610d16565b905082815260208101848484011115610da057610d9f610cb1565b5b610dab848285610d62565b509392505050565b600082601f830112610dc857610dc7610cac565b5b8135610dd8848260208601610d71565b91505092915050565b60008060408385031215610df857610df7610a0a565b5b6000610e0685828601610a35565b925050602083013567ffffffffffffffff811115610e2757610e26610a0f565b5b610e3385828601610db3565b9150509250929050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000610e84601f83610e3d565b9150610e8f82610e4e565b602082019050919050565b60006020820190508181036000830152610eb381610e77565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b6000610f04600083610ee9565b9150610f0f82610ef4565b600082019050919050565b6000610f2582610ef7565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610f7657607f821691505b60208210811415610f8a57610f89610f2f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610fca82610a14565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610ffd57610ffc610f90565b5b600182019050919050565b600061101382610a14565b915061101e83610a14565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561105357611052610f90565b5b82820190509291505056fea26469706673582212200fcd57da96bf36c9fe09e671526e88ec0924ee8261cfd4293822bd57985a763864736f6c63430008090033